Fragment和Activity之间的数据传递(两种:Acitvity-->Fragment;Fragment---->Activity)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/android_I_t/article/details/51314750

以下方法主要是通过接口回调来实现Activity 和 Fragment来实现通信的。


首先,acitvity需要与fragment关联,我是通过ViewPage进行关联的,代码如下:

<span style="font-size:24px;">@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvContent = (TextView) findViewById(R.id.tvContent) ;
        btGet = (Button) findViewById(R.id.btn_getContent) ;
        btGet.setOnClickListener(this);
        vp = (ViewPager) findViewById(R.id.afViewPage);
        vp.setAdapter(new InnerFragment(getSupportFragmentManager()));
    }

    private class InnerFragment extends FragmentPagerAdapter {
        public InnerFragment(FragmentManager fm) {
            super(fm);
        }
        @Override
        public Fragment getItem(int position) {
            Fragment fragment = null ;
            switch (position) {
                case 0:
                    fragment = new afFragment() ;
                    break;
                case 1:
                    fragment = new faFragment();
                    break;
            }
            return fragment;
        }
        @Override
        public int getCount() {
            return 2;
        }
    }</span>

之后,要明白,事件的发起者就是需要定义接口的那个类;被调用的方法所在的类需要实现发起者的接口。下面介绍这两种方式:

1.Activity---->Fragment之间的传递,即:按钮在Acitivity界面中,你要点击按钮来调用Fragment中的方法或者是对象。

1.1发起者是Activity,所以在Activity建立一个接口,并且定义一个set方法,如下代码:

<span style="font-size:24px;"> /**
     * 自己定义的接口
     */
    public OnActionClick actionClick;
    public interface OnActionClick {
        void onActionClick();
    }
    public void setOnActionClick(OnActionClick actionClick){
        this.actionClick = actionClick;
    }</span>
1.2在被调用的fragment中实现这个接口并且实现那个set方法,需要承载这个Fragment对象的Activity的对象,来实现接口;在接口方法 onActionClick中调用Fragment中的方法或者对象。建立接口回调响应的前提是,在onAttach中进行接口关联。代码如下:

public class afFragment extends Fragment implements MainActivity.OnActionClick{

    private MainActivity main ;
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        main = (MainActivity) getActivity();
        main.setOnActionClick(this);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.af_fragment,null) ;
        return view;
    }

    @Override
    public void onActionClick() {
        Toast.makeText(getActivity() , getString() , Toast.LENGTH_SHORT).show();
    }

    private String getString(){
        return "this is afFragment`s content: AF";
    }


2. Fragment ----> Activity 之间的传递,即:按钮在Fragment界面中,你要点击按钮来调用Activity中的方法或者是对象。

扫描二维码关注公众号,回复: 3147701 查看本文章

2.1发起者是Fragment,所以在Fragment建立一个接口,并且定义一个set方法,如下代码:

public onFragmentAction fAction;
    public interface onFragmentAction {
        void setFragmentAction();
    }
    public void setOnFragmentAction(onFragmentAction fAction){
        this.fAction = fAction;
    }
2.2需要注意的是此时,需要在Fragment的生命周期 onAttach(Activity activity)中调用关联所建立的接口。

@Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        fAction = (onFragmentAction) activity;
    }
2.3在Activity中实现Fragment中定义的接口,在接口方法中调用Activity的代码或者对象。

public class MainActivity extends FragmentActivity implements faFragment.onFragmentAction, View.OnClickListener {

    /**
     * faFragment 中的接口
     */
    @Override
    public void setFragmentAction() {
        tvContent.setText("Acitvity中的方法结果---"+RandomNumber());
    }
    private int RandomNumber(){
        return new Random().nextInt(5)+2;
    }
}

以上就是本人通过接口回调来实现的Activity和Fragment之间的信息传递,当然也可以通过Handler进行,在这里就不进行细说了。

资源已经上传,请下载:


http://download.csdn.net/download/android_i_t/9510231



猜你喜欢

转载自blog.csdn.net/android_I_t/article/details/51314750