美文网首页Android学习Android
Fragment与Activity的相互通信

Fragment与Activity的相互通信

作者: Scorpio_青牙 | 来源:发表于2017-07-07 14:16 被阅读34次

    FragmentActivity向Fragment中传递参数我想不用我说太多大家都知道,在此只做简单的说明:
    FragmentActivity传递参数给Fragment使用:

    Bundle bundle = new Bundle();
    Fragment.setArguments(bundle)

    Fragment中获取数据使用:

    Bundle bundle = getArguments();

    下面我重点说下FragmentActivity与Fragment间的相互通信

    首先定义一个公共接口

    /**
     * FragmentActivity 与 Fragment交互接口 
     */
    public interface IMutualListener {
    
        /**
         * FragmentActivity用来改变Fragment中的展示内容
         */
        void actMsg(String str);
    
        /**
         * Fragment用来改变FragmentActivity中的展示内容
         */
        void fragmentMsg(String str);
    
    }
    

    FragmentActivity与Fragment分别去实现这个接口, 且Activity中需要重写onAttachFragment方法、而Fragment中需要重写onAttach方法事例如下:

    /**
     * FragmentActivity中调用接口的方式
     */
    public class MainActivity extends FragmentActivity implements  IMutualListener{
    
        private IMutualListener iMutualListener;
        private TextView tv;
        @Override  
      protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);
         tv = (TextView)findViewById(R.id.tv)
            //改变fragment中的值
        findViewById(R.id.btn).setOnClickListener(new OnClickListener(){
    
                @Override
                public void onClick(View v) {
                    //FragmentActivity调用Fragment中方法前需要判断该Fragment是否为null
                    iMutualListener.actMsg("我是来自FragmentActivity的信息");
                }
            });  
        
      }  
    
        @Override
        public void onAttachFragment(Fragment fragment) {
            try{
                iMutualListener = (IMutualListener)fragment;
            }catch (Exception e){}
            super.onAttachFragment(fragment);
        }
    
        /**
         * FragmentActivity用来改变Fragment中的展示内容
         */
        @Override
        public void actMsg(String str) {}
    
        /**
         * Fragment用来改变FragmentActivity中的展示内容
         */
        @Override
        public void fragmentMsg(String str) {
            tv.setText(str);
        }
    }
    
    /**
     * Fragment中调用接口的方式
     */
     public class FragmentA extends Fragment implements  IMutualListener{
    
        private IMutualListener iMutualListener;
        private TextView tv;
         @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View view = View.inflate(getActivity(), R.layout.fragment_a_page, null);
            tv = (TextView) view.findViewById(R.id.tv)
            //改变fragmentActivity中的值
        view.findViewById(R.id.btn).setOnClickListener(new OnClickListener(){
    
                @Override
                public void onClick(View v) {
                    iMutualListener.fragmentMsg("我是来自Fragment的信息");
                }
            });  
        }
    
        @Override
        public void onAttach(Activity activity) {
    
            try {
                iMutualListener = (IMutualListener)activity;
            }catch (Exception e){
                throw new ClassCastException(activity.toString() + "must implement iMutualListener");
            }
    
            super.onAttach(activity);
        }
    
        /**
         * FragmentActivity用来改变Fragment中的展示内容
         */
        @Override
        public void actMsg(String str) {
            tv.setText(str);
        }
    
        /**
         * Fragment用来改变FragmentActivity中的展示内容
         */
        @Override
        public void fragmentMsg(String str) {}
    
     }
    

    FragmentActivity与Fragment的交互主要部分就是onAttachFragment与onAttach方法的重写,希望本篇文章能对你有所帮助!

    201707071316.jpg

    相关文章

      网友评论

      • 松小白:如果1个Fragment里面两个Fragment ,然后实现接口的时候,在接收的时候,不能知道哪个Fragment 接收,默认的就第二个接收,如果第二个不实现接口,就报错。说没有实现接口。
        Scorpio_青牙:@松小白 可以设置flag的,根据写的标识去实现操作就行了哟,多个fragment是要都实现接口的

      本文标题:Fragment与Activity的相互通信

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