Activity与Fragment的通信

一、Activity向Fragment传送数据:

方法:使用Bundle:

  • Bundle用来存放数据集。
  • setArguments()方法将数据集绑定到Fragment中。
Activity:
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        BlankFragment1 fragment = new BlankFragment1();

        //创建资源绑定器bundle
        Bundle bundle = new Bundle();
        //添加数据到资源绑定器
        bundle.putString("name","张三");
        //将资源绑定器添加到fragment对象中
        fragment.setArguments(bundle);

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add(R.id.contain1,fragment);
        fragmentTransaction.commit();
    }
}
Fragment:
public class BlankFragment1 extends Fragment {

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //getArguments获取该fragment对象中的bundle
        Bundle bundle = getArguments();
        //获取bundle中存放的数据
        Log.d("ioc", bundle.getString("name"));
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_blank1, container, false);
    }
}

二、Fragment向Activity传送数据:

方法一:使用java接口(观察者模式):

  • 实现思路是声明一个接口,用接口实现Activity和Fragment的数据传输。
  • 接口的声明在Fragment中。
  • 接口的实现在Activity中。
接口:
  • 这里的接口也可以创建在Activity类中。
public interface IFragmentCallback {
	//Fragment调用该方法发送信息msg给Acticity,Activity中通过实现该方法来获得发来的信息msg
    void sendMsgToActivity(String msg);
    //Activity实现该方法将信息作为返回值,Fragment调用该方法获取到的返回值即Activity传来的信息
    String getMsgFromActivity();
}
Activity:
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        BlankFragment1 fragment = new BlankFragment1();

        //Activity中通过匿名内部类的方式创建接口的实现类
        IFragmentCallback iFragmentCallback = new IFragmentCallback() {
            @Override
            public void sendMsgToActivity(String msg) {
                //接收到Fragment发来的msg数据并输出
                Log.d("ioc",msg);
            }

            @Override
            public String getMsgFromActivity() {
                //向Fragment发送数据
                return "我来自Activity";
            }
        };
        /*fragment对象中有一个属性iFragmentCallback,通过给属性赋值给fragment对象的iFragmentCallback接口属性实例化,
        这样Activity和Fragment就有了共同的IFragmentCallback对象,通过这个对象取得了联系(观察者模式)*/
        fragment.setiFragmentCallback(iFragmentCallback);
		//动态创建fragment,显示该fragment到contain1的标签内
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add(R.id.contain1,fragment);
        fragmentTransaction.commit();
    }
}
Fragment:
public class BlankFragment1 extends Fragment {
    //Fragment中要有IFragmentCallback接口属性,这里只有一个声明,具体实现在Activity中
    private IFragmentCallback iFragmentCallback;
    //接口对象的set方法,负责实例化接口
    public void setiFragmentCallback(IFragmentCallback iFragmentCallback) {
        this.iFragmentCallback = iFragmentCallback;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //调用iFragmentCallback的方法向Activity传参数,Activity实例化IFragmentCallback接口时会在sendMsgToActivity方法内对传参数进行操作
        iFragmentCallback.sendMsgToActivity("你好,我来自Fragment");
        //Activity实例化IFragmentCallback接口时在getMsgFromActivity方法内返回一个参数,Fragment调用该方法就会取得该参数,并进行相应操作
        String msg = iFragmentCallback.getMsgFromActivity();
        Log.d("ioc",msg);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_blank1, container, false);
    }
}

方法二:使用第三方组件

  • eventBus、LiveData…

三、实现Fragment之间互传数据:

  • Fragment之间无法互传数据,所以需要一个Activity作为中间桥梁辅助两个Fragment之间的数据传输。

案例:点击ListView某个列表项跳转到对应聊天框,并显示该列表项的信息。

第一步:Fragment1(Listview列表)发送数据用户点击的列表项的信息给Activity。

iFragmentCallback iFragmentCallback;//属性
listview1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    	//获取到童虎点击的列表项内的TextView控件
        TextView view1 = view.findViewById(R.id.text1);
        //获取到TextView控件内的值
        String name = view1.getText().toString();
        Log.e("mylog","fragment1发送数据:"+name+"给Activity");
        //通过调用sendMsgToActivity方法发送数据给Activity
        iFragmentCallback.sendMsgToActivity(name);
    }
});

第二步:Activity接收Fragment1发来的数据发送给Fragment2。

//Activity中实例化接口
iFragmentCallback iFragmentCallback = new iFragmentCallback() {
//通过实现接口的sendMsgToActivity方法得到fragment1传来的值msg(因为fragment1中调用该方法并传入一个参数msg)
   @Override
   public void sendMsgToActivity(String msg) {
       //创建资源绑定器bundle,用于Activity向fragment发送数据
       Bundle bundle = new Bundle();
       Log.e("mylog","Activity得到fragment1传来的信息:"+msg);
       //添加数据到资源绑定器
       bundle.putString("name",msg);
       //将资源绑定器添加到fragment对象中
       Fragment4 fragment4 = new Fragment4();
       Log.e("mylog","Activity使用buddle将信息发送给fragment4");
       fragment4.setArguments(bundle);
       //动态创建fragment4并跳转到fragment4
       FragmentManager fragmentManager = getSupportFragmentManager();
       FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
       fragmentTransaction.replace(R.id.frame,fragment4);
       fragmentTransaction.commit();
   }
};
//实例化的接口对象传给fragment1的属性上(观察者模式)
fragment1.iFragmentCallback = iFragmentCallback;

第三步:Fragment接收数据后对数据进行处理展示到页面上。

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view =  inflater.inflate(R.layout.fragment_4, container, false);
    TextView dialog = view.findViewById(R.id.thedialog);
    Bundle bundle = getArguments();
    Log.e("mylog","fragment4得到Activity发来的数据:"+bundle.getString("name"));
    dialog.setText("与"+bundle.getString("name")+"的会话窗口");
    return view;
}

效果:

在这里插入图片描述
点击某个列表项:
**在这里插入图片描述**
在这里插入图片描述

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姓蔡小朋友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值