欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Fragment与Activity之间传递数据

程序员文章站 2024-03-15 14:45:41
...

fragment 传递数据到activity 中 直接上代码:

  • 以下代码可直接复制

/**
     * 当FRagmen被加载到activity的时候会被回调
     *
     * @param activity
     */
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        if (activity instanceof FragmentInteraction) {
            listener = (FragmentInteraction) activity;
        } else {
            throw new IllegalArgumentException("activity must implements FragmentInteraction");
        }

    }

    @Override
    public void onDetach() {
        super.onDetach();
        listener = null;
    }

    /**
     * 定义了宿主activity必须实现的接口
     */
    public interface FragmentInteraction {
        /**
         * Fragment 向Activity传递指令,这个方法可以根据需求来定义
         *
         * @param isTheme
         */
        void isTheme(boolean isTheme);


    }

    /**
     * 用来与外部activity交互的
     */
    private FragmentInteraction listener;
  • 第二步

再合适的位置把想要传递的数据,通过isTheme(true)传递,我这里是设置主题通过fragment改变MainActivity的tab颜色,此方法根据业务需要自己定义,比如传递对象,变量等.

  • 第三步

宿主activity实现FragmentInteraction重写isTheme()方法拿到fragment的数据

  • 下面是Activity像fragment传递数据

第一步再fragment 中定义该方法,重写fragment的onCreate方法,再onCreate把数据取出来,这样就完成了activity和fragment数据传递

 public static TestFragment newInstance(boolean isTheme) {
        Bundle bundle = new Bundle();
        bundle.putBoolean("isTheme", isTheme);  
        TestFragment fragment = new TestFragment();
        fragment.setArguments(bundle);
        return fragment;
    }

@Override
    public void onCreate(Bundle savedInstanceState) {
        Bundle bundle = getArguments();
        if (bundle != null) {
            isTheme = bundle.getBoolean("isTheme");
        }
        super.onCreate(savedInstanceState);
    }
  • 第二步再宿主activity中 对fragment初始化
        fragmentList.add(TestFragment.newInstance(true));
        fragmentList.add(TestFragment.newInstance(false));
        fragmentList.add(TestFragment.newInstance(true));
        fragmentList.add(TestFragment.newInstance(false));
        fragmentAdapter = new FragmentAdapter(getChildFragmentManager());
        viewpager.setAdapter(fragmentAdapter);
        tabLayout.setViewPager(viewpager);

在这里我这边是通过viewpager配合fragment 其他同理, getChildFragmentManager()由于是fragment嵌套fragment所以这里要使用getChildFragmentManager如果是activity嵌套fragment要使用getSupportFragmentManager

下篇讲述如何让viewpager不预加载