嵌套片段通信

时间:2017-11-06 10:16:50

标签: java android android-fragments interface

我想在父母和孩子之间进行沟通fragment。我已经在SO上阅读了这么多帖子,但这些帖子似乎对我都没用。

我有3 Fragments FragmentAFragmentBFragmentC

FragmentAfragment的父FragmentB,而FragmentBFragment的父FragmentC

FragmentAEditText TextWatcherviewpager已实施标签。 FragmentB还有另一个Viewpager带Tabs。(所以基本上我使用的是嵌套选项卡,不建议这样做,但我确实需要使用这个场景)。 FragmentCrecyclerView,然后根据所选标签显示产品列表。这对我来说很好。

现在,我想为FragmentC中的产品添加搜索功能(在webservice中执行搜索,从FragmentC调用产品列表的网络服务)。

实现这一目标到目前为止,我所做的是, FragmentA将基于Web响应设置viewpager,这里是一个在FragmentA中设置viewpager的方法。(Code指的是我如何获得Fragment的实例)

 private void setupViewPager(ViewPager viewPager, RetailCategoryListArr retailCategoryListArr) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());
        for (int i = 0; i < retailCategoryListArr.getData().size(); i++) {
            RetailerCategoryArr retailerCategoryArr = retailCategoryListArr.getData().get(i);
            FragmentB FragB= FragmentB.newInstance(retailerCategoryArr, retailerArr.getUrlIdentifier());
            adapter.addFragment(FragB, retailerCategoryArr.getName());
        }
        viewPager.setAdapter(adapter);
        tabs.setupWithViewPager(viewPager);
    }

FragmentB还有另一个ViewPager,然后按此实现。

private void setUpViewPager(ViewPager viewpager) {
        ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());

        for (int i = 0; i < retailerCategoryArr.getChild().size(); i++) {
            RetailerCategoryArr.RetailerSubCategoryArr retailerSubCategoryArr = retailerCategoryArr.getChild().get(i);
            FragmentC FragC = FragmentC.newInstance(retailerSubCategoryArr.getId(), retailer);
            adapter.addFragment(FragC, retailerSubCategoryArr.getName());

        }
        viewpager.setAdapter(adapter);
        tabs.setupWithViewPager(viewpager);
    }

所以,问题是如何在textchange中倾听Edittext FragmentA FragmentC的{​​{1}}? 如果接口可以做到这一点那么?

2 个答案:

答案 0 :(得分:0)

FragmentC尝试执行此操作:

Fragment frag = getParentFragment(); //it will be FragmentB
FragmentA fragA = (FragmentA)frag.getParentFragment();
fragA.editText.addTextChangedListener(new TextWatcher() {
    ...
});

答案 1 :(得分:0)

您可以在Parent Activity中创建接口和实现,以从片段A中侦听textwatcher。

 interface Test{
      void setTextChange(String ch);
    }

在Parent Activity中,您实现了侦听器

public class FragmenA extends Fragment{
    Test mCallback;
    public Edittext;


    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        // This makes sure that the container activity has implemented
        // the callback interface. If not, it throws an exception
        try {
            mCallback = (Test) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement Test");
        }
    }


}



 public class MainActivity extends Activity
                implements FragmentA.Test{

               Fragment fragmentc=getFragmentManager().findFragmentByTag(FragmentC.class);



            public setTextChange(String ch) {
                     if(fragmentc!=null){

                      fragmentc.onChangeText(ch);
        }
            }
        }


        public class FragmenC extends Fragment{
            Test mCallback;


            public void onChangeText(String text){
        }


        }