【问题标题】:Accesing TabLayout's Fragment within the activity在活动中访问 TabLayout 片段
【发布时间】:2017-12-04 20:29:00
【问题描述】:

我正在尝试访问活动中的片段标签,以通过触发一种方法(刷新数据)在该特定片段中执行一些逻辑。由于片段位于 Tablayout 下,我完全不知道如何访问下面的片段我的活动。 以下是sn -p的代码:

   private void updateFragment(Intent intent){
        FragmentManager manager = getSupportFragmentManager();
        for (int i = 0; i < manager.getBackStackEntryCount(); i++) {
            if (MyFragment.class.getName().equalsIgnoreCase(manager.getBackStackEntryAt(i).getName())) {
                MyFragment currentFragment = (MyFragment)manager.findFragmentByTag(manager.getBackStackEntryAt(i).getName());
                currentFragment.refreshData(intent);
                break;
            }
        }
    }

以下方式我在 TabLayout 下创​​建两个片段

 @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    MyFragment newsFragment = new MyFragment();

                    return newsFragment;

                case 1:
                    return new MySecondFragment();
            }
            return null;
        }

【问题讨论】:

    标签: android android-fragments android-tablayout fragment-backstack


    【解决方案1】:

    你应该只为每个片段创建一个对象,比如

    MyFragemnt newsFragment;
    MySecondFragment secondFragemnt;
    @Override
    public Fragment getItem(int position) {
       switch (position) {
         case 0:
           if(newsFragment == null)
               newsFragment = new MyFragment();
           return newsFragment;
         case 1:
           if(secondFragemnt== null)
               secondFragemnt= new MySecondFragment();
           return secondFragemnt;
          }
        return null;
    }
    

    然后根据你的适配器的位置,你可以访问那些片段的refreshData()

    Fragment activeFragment = adapter.getItem(pos);
    if(pos == 0)
        ((MyFragment)activeFragment).refreshData(...);
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      我倾向于使用ArrayList 方法来存储Fragment 引用。这项工作的关键是instantiateItem(ViewGroup container, int position)。这可能是PagerAdapter 中最重要的方法,因为它负责在配置更改时重新附加片段。如果在内存中没有找到片段,它只会调用getItem(int position)。通过实现此方法并将重新附加的片段放入ArrayList,您将在配置更改后在列表中拥有相同的片段。

      public class SomePagerAdapter extends FragmentPagerAdapter {
      
              private ArrayList<Fragment> fragments = new ArrayList<>(4);
      
              public SomePagerAdapter(FragmentManager fm) {
                  super(fm);
              }
      
              @Override
              public Fragment getItem(int position) {
                  switch (position){
                      case 0:
                          return FirstFragment.newInstance();
                      case 1:
                          return SecondFragment.newInstance();;
                      default:
                          return new Fragment();
                  }
              }
      
              @Override
              public Object instantiateItem(ViewGroup container, int position) {
                  Fragment fragment = (Fragment) super.instantiateItem(container, position);
                  fragments.add(fragment);
                  return fragment;
              }
      
              @Override
              public int getCount() {
                  return 2;
              }
      
              public ArrayList<Fragment> getFragments() {
                  return fragments;
              }
          }
      

      你可以像这样使用上面的代码:

      if(pagerAdapter.getFragments.get(whateverPosition) instanceof FirstFragment {
            ((FirstFragment)pagerAdapter.getFragments().get(whateverPosition)).refreshData(intent);
      }
      

      如果您始终确定要访问的内容,则实际上不需要检查 instanceof,我只是更愿意确定我正在访问的内容是我所期望的。

      在配置更改之前,其他答案将有效。之后,您会发现自己引用了一个全新的片段,这可能不是您所期望的。

      另外请记住,由于系统使用Fragment 的构造函数的方式,最好使用newInstance 静态方法实例化Fragment。你可以通过 newInstance() 传递任何你想要的东西,而这是构造函数无法做到的。

      【讨论】:

        猜你喜欢
        • 2015-04-13
        • 1970-01-01
        • 2018-07-21
        • 1970-01-01
        • 2021-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-30
        相关资源
        最近更新 更多