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通信的面向对象的万能接口

Android学习——Fragment与Activity通信

深入分析动态管理Fragment

Android消息传递用啥好?

Android 开发学习

android UI:底部菜单栏的学习与制作——Fragment碎片一