安卓APP_ Fragment—— Activity与Fragment的通信

Posted 行稳方能走远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓APP_ Fragment—— Activity与Fragment的通信相关的知识,希望对你有一定的参考价值。

摘自:安卓APP_ Fragment(2)—— Activity与Fragment的通信
作者:丶PURSUING
发布时间: 2021-04-16 17:23:44
网址:https://blog.csdn.net/weixin_44742824/article/details/115743009

Activity与Fragment是两个独立类,负责UI的展示,那他们如何进行通信呢?

Activity与Fragment的通信

(1)原生方案1:Bundle。

可以理解为通信时使用的通用工具,可以保存数据的独立的类。

安卓APP_ Fragment(1) 篇章的基础上,沿用原来的例子,演示在动态添加fragment下,Activity如何向Fragment发送信息。下图的my name is zhua字符串是从Activity中向fragment传递的信息,fragment收到后并打印出来。

在这里插入图片描述
具体实现:

(1)在MainActivity中bundle对象的创建并且与fragment绑定
在这里插入图片描述在对应的fragment.java中使用并打印
在这里插入图片描述

进阶题外话:如何传输javaBean?不能直接传,但是可以把Bean变成某一个key,
这个key对应的是parcelable,parcelable就可以携带javaBean

具体细节在代码中呈现

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btn_1"
        android:text="@string/change"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btn_2"
        android:text="@string/replace"/>

<!--    除去按钮,剩余的空间都是FrameLayout-->
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/fm"
        android:background="@color/teal_200"/>

</LinearLayout>

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button1 = findViewById(R.id.btn_1);
        button1.setOnClickListener(this);

        Button button2 = findViewById(R.id.btn_2);
        button2.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_1:
                Bundle bundle = new Bundle();
                //将Activity中的信息放进bundle
                bundle.putString("message", "my name is zhua");
                //需要实例化一个BlankFragment1对象bf
                BlankFragment1 bf = new BlankFragment1();
                //数据传入bf中
                bf.setArguments(bundle);
                //动态切换fragment
                replaceFragment(bf);
                break;

            case R.id.btn_2:
                replaceFragment(new ItemFragment());
        }
    }

    //完成动态切换fragment
    private void replaceFragment(Fragment fragment) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.fm, fragment);
        transaction.commit();
    }
}

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

BlankFragment.java

public class BlankFragment1 extends Fragment {

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

        //这个getArguments返回的是在MainActivity中传入的bundle
        Bundle bundle = this.getArguments();
        //获取bundle里面保存的内容
        String string = bundle.getString("message");
        //在fragment中打印从Activity中传递来的信息
        Log.e("zhua", "onCreate: "+string);
    }

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

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

flagment_blank1.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".BlankFragment1">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffff00"
        android:textSize="40dp"
        android:text="@string/hello_blank_fragment" />

</FrameLayout>

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

(2)方案2:Java语言中类与类自己通信常用方案:接口

面向接口编程:用接口实现两者的通信,消息互传。(从老师的描述中可以发现不好用,先不学,不学了。)

(3)方案3:第三方架构

当Activity发送消息的时候,Fragment根据需要(对Activity这个消息“感不感兴趣”),选择接收还是不接受。

要用到其他的通信方案,即编译器已经封装好的接口,如eventBus,LiveData…

在这样的方案里面包含了一个设计模式,叫观察者模式(或者叫发布订阅模式)。比如我Fragment作为信息的接收方,当Activity信息发生变化的且是我需要的时候,我就会收录这个信息。

进阶内容,后续再做补充。

以上是关于安卓APP_ Fragment—— Activity与Fragment的通信的主要内容,如果未能解决你的问题,请参考以下文章

安卓APP_ Fragment—— Fragment概念基础用法动态变换管理栈

安卓APP_ Fragment—— Fragment + ViewPager2 模拟微信首页 两者联动翻页

安卓APP_ Fragment—— Fragment + ViewPager2 模拟微信首页 两者联动实现翻页

Android安卓viewpager和Fragment的结合,多个Fragment视图之间切换等运用

安卓开发实战-记账本APP

安卓之碎片Fragment介绍