Android学习——Fragment与Activity通信
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android学习——Fragment与Activity通信相关的知识,希望对你有一定的参考价值。
接下来就要到Fragment向Activity传输数据了。主要的思路,就是在Fragment中创建一个回调接口,利用该回调接口实现Fragment向Activity传输数据的功能。
回调函数(接口)
在学习利用回调接口实现Fragment向Activity传输数据之前,首先要对回调函数有所了解,下面引用知乎用户futeng的回答,侵删:https://www.zhihu.com/question/19801131/answer/26586203。
简单来说,回调函数就是当在一个类A中去调用类B的方法b时,方法b会反过来回调A中的方法a,这个方法a便成为回调方法。回调方法的特点之一在于,当传入的参数为接口时,可以根据不同的类传入的接口实现不同,而产生不同的功能。
具体方法
了解了回调函数之后,我们便可以利用回调接口来实现Fragment向Activity传输数据。简要的思路是:在Fragment中定义一个回调接口,并且在onAttach()时,实例化该接口为Activity对象。而后,在Activity中实现该接口,便可以让Fragment在onAttach时,获取该接口的内容。最后,在Fragment的适当位置,回调该接口,即可实现Fragment向Activity传输数据的功能。
代码实现
一、在Fragment中定义接口
在Fragment中定义回调接口,并在onAttach中实例化(注意,onAttach(Activity activity)方法,在android3.0后被舍弃,需要重载onAttach(Context context),并导入v4.Fragment包)
public interface mListener{ public void fragmentsend(String text); } private mListener mlistener; @Override public void onAttach(Context context) { super.onAttach(context); mlistener= (mListener) context; }
二、在Activity中实现该接口
public class Activity4 extends AppCompatActivity implements Fragment4.mListener { private TextView tv; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_4); tv= (TextView) findViewById(R.id.a4tv); Fragment4 fragment4 =new Fragment4(); FragmentManager supportFragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction(); fragmentTransaction.add(R.id.a4layout,fragment4); fragmentTransaction.commit(); } @Override public void fragmentsend(String text) { tv.setText(text); } }
三、在Fragment的特定位置,回调该接口
本例中,实现的功能是在点击发送按钮后,把文本框中的内容发送给Activity,所以在按钮的onClick方法中,回调该接口即可。
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String string = et.getText().toString(); mlistener.fragmentsend(string); } });
静态加载简要说明
以上所述的Fragment与Activity的通信,皆为动态加载的过程。那么对于静态加载应该如何实现二者之间的通信呢?其实很容易,由于静态加载中,在Activity的布局文件中有Fragment的相关控件以及id,可以利用findFragmentById获取对应的Fragment,并用set和get方法,实现二者之间的数据传输。
FragmentManager supportFragmentManager = getSupportFragmentManager(); Fragment fragmentById = supportFragmentManager.findFragmentById(R.id.frame); fragmentById.setaaa("hello");
界面展示
以上是关于Android学习——Fragment与Activity通信的主要内容,如果未能解决你的问题,请参考以下文章
架构师成长之路-基于android fragment通信的面向对象的万能接口