美文网首页
06_Android Fragment 与 宿主 Activit

06_Android Fragment 与 宿主 Activit

作者: Android_小生 | 来源:发表于2017-07-31 15:11 被阅读55次

    1. Activity 传值到 Fragment


    1.1 set/getArguments() 方法

    就像 Activity 之间通过 Intent.set/getExtral() 方法传递/接收值类似,
    我们在宿主 Activity 中

     ...
     Bundle bundle = new Bundle();
     bundle.putString("key", "value");
     fragment.setArguments(bundle);
    

    在 Fragment 中

    String value = getArguments().getString("key");
    ...
    

    1.2 newInstance() 方法

    这种方法只是上一种方法变换了另一种形式。

    在 Fragment 中,定义 newInstance() 实例

    public static MyFragment newInstance(String value) {
            Bundle bundle = new Bundle();
            bundle.putString("key", value);
            MyFragment fragment = new MyFragment();
            fragment.setArguments(bundle);
            return fragment;
        }
    

    在宿主 Activity 中,通过 newInstance() 方法创建 Fragment,并传递 value 值。

    MyFragment fragment = MyFragment.newInstance("0");
    ...
    

    在 Fragment 中,还是和第一种方法一样获取传递过来的值

    String value = getArguments().getString("key");
    ...
    

    需要注意的是,Activity 在一些特殊状况下会发生 destroy 并重新 create 的情形,比如屏幕旋转、内存吃紧时;对应的,依附于 Activity 存在的 Fragment 也会发生类似的状况。而一旦重新 create 时,Fragment 便会调用默认的无参构造函数,导致无法执行有参构造函数进行初始化工作。所以这种方法还是有瑕疵的。

    1.3 暴露公开的值获取方法

    在宿主 Activity 中,将要传递的参数通过定义一个有公开的返回值的方法

        private int value;
        ...
        public int getValue() {
            return value;
        }
        ...
    

    在 Fragment 的 onAttach() 方法中通过强转成宿主 Activity,调用公开的方法获取值

     @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            // 通过强转成宿主 Activity
            int value = ((MainActivity)context).getValue();
        }
    

    但是这个方法使得 Fragment 与宿主 Activity 绑定在了一起, Fragment 无法复用到其它 Activity,这违背了 Fragment 设计的初衷。

    2. Fragment 传值到宿主 Activity


    2.1 接口回调的方法

    在 Fragment 中定义一个接口

        public interface MyCallBack {
            void callback(String content);
        }
    

    在 Fragment 中 onAttach() 方法中实例化这个接口

    
    private MyCallBack myCallBack;
    ...
    @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            myCallBack = (MyCallBack)context; // 实例化对象
        }
    

    在 Fragment 中需要传递值的地方,引用接口的方法

     @Override
        public void onClick(View view) {
            myCallBack.callback(textView.getText().toString());
        }
    

    在宿主 Activity 中实现这个接口,实现接口回调

        // 接口回调
        @Override
        public void callback(String content) {
            Toast.makeText(this,content, Toast.LENGTH_SHORT).show();
        }
    

    还有一点需要注意的就是在 Fragment 中

        //把传递进来的 activity 对象释放掉
        @Override
        public void onDetach() {
            super.onDetach();
            myCallBack = null;
        }
    

    相关文章

      网友评论

          本文标题:06_Android Fragment 与 宿主 Activit

          本文链接:https://www.haomeiwen.com/subject/ruqrlxtx.html