【问题标题】:Nested Fragment Communication嵌套片段通信
【发布时间】:2017-11-06 10:16:50
【问题描述】:

我想在父母和孩子fragment之间进行交流。我已经阅读了很多关于 SO 的帖子,但似乎没有一篇对我有用。

我有 3 个 Fragments FragmentAFragmentBFragmentC

FragmentAFragmentB 的父 fragmentFragmentBFragmentC 的父 Fragment

FragmentA 具有带有 TextWatcherEditText 和带有标签的 viewpagerFragmentB 有另一个带有标签的Viewpager。(所以基本上我使用的是不推荐的嵌套标签,但我真的需要使用这种场景)。 FragmentC 具有 recyclerView,然后根据选定的选项卡显示产品列表。这对我来说很好。

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

为了实现这个我到目前为止所做的是, FragmentA 将根据 Web 响应设置 viewpager,这是在 FragmentA 中设置 viewpager 的方法。(代码指的是我如何获取 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);
    }

那么,问题是我如何在FragmentC 中收听EdittextFragmentAtextchange? 如果这可以通过接口实现,那么如何实现?

【问题讨论】:

  • @Kuffs 感谢您的回复。但是我已经阅读了这篇文章,我真的不明白如何在我的场景中实现这一点。能否请您简短地写下您的答案。
  • 如果您在遵循记录的片段通信方式时遇到问题,那么您可能应该编辑您的问题以准确解释您遇到的问题以及遇到问题的原因。没有人愿意为您复制文档。

标签: java android android-fragments interface


【解决方案1】:

来自FragmentC 尝试这样做:

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

【讨论】:

    【解决方案2】:

    您可以在 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){
            }
    
    
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-14
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多