Android学习——Fragment与Activity通信

于今腐草无萤火,终古垂杨有暮鸦。这篇文章主要讲述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与Activity通信

文章图片


    推荐阅读