摘自:安卓APP_ Fragment(2)—— Activity与Fragment的通信
作者:丶PURSUING
发布时间: 2021-04-16 17:23:44
网址:https://blog.csdn.net/weixin_44742824/article/details/115743009
目录
- Activity与Fragment的通信
- (1)原生方案1:Bundle。
- 具体细节在代码中呈现
- (2)方案2:Java语言中类与类自己通信常用方案:接口
- (3)方案3:第三方架构
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"><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/btn_1"android:text="@string/change"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/btn_2"android:text="@string/replace"/><!-- 除去按钮,剩余的空间都是FrameLayout--><FrameLayoutandroid: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 {@Overrideprotected 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);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_1:Bundle bundle = new Bundle();//将Activity中的信息放进bundlebundle.putString("message", "my name is zhua");//需要实例化一个BlankFragment1对象bfBlankFragment1 bf = new BlankFragment1();//数据传入bf中bf.setArguments(bundle);//动态切换fragmentreplaceFragment(bf);break;case R.id.btn_2:replaceFragment(new ItemFragment());}}//完成动态切换fragmentprivate 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 {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//这个getArguments返回的是在MainActivity中传入的bundleBundle bundle = this.getArguments();//获取bundle里面保存的内容String string = bundle.getString("message");//在fragment中打印从Activity中传递来的信息Log.e("zhua", "onCreate: "+string);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentreturn 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 --><TextViewandroid: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信息发生变化的且是我需要的时候,我就会收录这个信息。
进阶内容,后续再做补充。