ViewPager中的Fragment之间通信

在mainactivity布局中添加viewpager




    

    

    

    

    

    

    

    


之后新建三个fragment,并且把fragment与activity关联起来

fragmentList = new ArrayList<>();

fg_one = new OneFragment();
fg_two = new TwoFragment();
fg_three = new ThreeFragment();

fragmentList.add(fg_one);
fragmentList.add(fg_two);
fragmentList.add(fg_three);

fragmentAdapter = new FragmentAdapter(getSupportFragmentManager(),fragmentList);
viewPager.setAdapter(fragmentAdapter);
viewPager.setCurrentItem(0);
viewPager.setOffscreenPageLimit(2);

第一种方法:

通过接口

首先创建接口,第一个为传递的数据,第二个为需要传递到第几个fragment,对于在Mainactivity中的fragmentList来说

public interface FragmentMessgeI {
    void transferString(String s,int i);
}

之后再Mainactivity中实现该接口

@Override
public void transferString(String s,int i) {
    switch (i){
        case 0:
            OneFragment fragment = (OneFragment) fragmentList.get(i);
            fragment.SetText(s);
            break;
        case 1:
            TwoFragment fragment1 = (TwoFragment) fragmentList.get(i);
            fragment1.SetText(s);
            break;
        case 2:
            ThreeFragment fragment2 = (ThreeFragment) fragmentList.get(i);
            fragment2.SetText(s);
            break;
    }
}

然后在fragment中创建接口变量,并在onattach方法中实例化

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    callback = (FragmentMessgeI) context;
}

最后就是正常的调用了

callback.transferString("接口从2跳到1",0);
public void SetText(String s){
    fg_tv.setText(s);
}

第二种方法:

通过广播

首先在fragment中创建广播

class ReceiveBroadCast extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        SetText(intent.getStringExtra("text"));
    }
}

然后注册

  @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        callback = (FragmentMessgeI) context;
        receiveBroadCast = new ReceiveBroadCast();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.bai.three");
        getActivity().registerReceiver(receiveBroadCast,intentFilter);
    }

@Override
public void onDestroy() {
    super.onDestroy();
    if (receiveBroadCast!=null){
        getActivity().unregisterReceiver(receiveBroadCast);
    }
}

最后在需要传递数据的fragment中发送

@Override
public void onClick(View v) {
    switch (v.getId()){
        case R.id.button:
            callback.transferString("接口从2跳到1",0);
            Intent intent = new Intent();
            intent.putExtra("text","广播从2到3");
            intent.setAction("com.bai.three");
            getActivity().sendBroadcast(intent);
            break;
    }
}

第三种方法:

通过获取fragment实例:

首先在Mainactivity中保存fragment实例

然后在fragment中获取实例

@Override
public void onClick(View v) {
    switch (v.getId()){
        case R.id.button:
            callback.transferString("接口从1跳到2",1);
            MainActivity mainActivity = (MainActivity) getActivity();
            ThreeFragment threeFragment = (ThreeFragment) mainActivity.fragmentList.get(2);
            threeFragment.SetText("直接获取实例从1到3");
            break;
    }
}

因为经常遇到fragment间通信问题,所以记录一下

完整项目地址

你可能感兴趣的:(日常记录)