安卓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 模拟微信首页 两者联动实现翻页