【问题标题】:How to hide/show 2 different fragments inside one tab(fragment) of tabbed activity?如何在选项卡式活动的一个选项卡(片段)中隐藏/显示 2 个不同的片段?
【发布时间】:2017-03-18 17:50:33
【问题描述】:

我有一个选项卡式活动,想在第一个选项卡中显示:

  • 列表视图
  • 2 个按钮

如果单击列表视图的一项,我想在第一个选项卡中显示另一个片段,其中:

  • 另一个列表视图
  • 另外 2 个按钮

然后,如果按下后退按钮,我想返回到上一个片段(在同一个选项卡中)。如果第二个列表视图(可见)的数组列表的数据发生了变化,我想将这些更改应用于第一个列表视图的数组列表。所以我想尽可能轻松地访问两个列表视图的数据。

我的第一种方法是:一切都在一个片段中,具有一个布局(包括不同的视图,我隐藏/显示)。

我的第二种方法是:第一个片段/选项卡有另一个带有 2 个片段的浏览器。

最好的方法是什么?

【问题讨论】:

    标签: android tabs fragment


    【解决方案1】:

    创建您的 PageFragment。它将由 ViewPager 适配器创建并放置在 ViewPager 中。使用 getChildFragmentManager() 方法获取的 FragmentManager 切换 ListFragment 内部的 PageFragment。

    后按事件的处理很复杂,您需要从您的活动中提供它。 创建接口

    public interface IBackStackManager {
    
        void addBackStackListener(BackStackListener listener);
    
        void removeBackStackListener(BackStackListener listener);
    
        interface BackstackListener {
    
            boolean onBackPressed();
    
        }
    
    }
    

    通过您的活动实现它,如下所示:

        public class MainActivity extends AppCompatActivity implements IBackStackManager  {
    
            private final Deque<BackStackListener> backStackListeners = new ArrayDeque<>();
    
            @Override
            public void addBackstackListener(BackStackListener listener) {
                backStackListeners.add(listener);
            }
    
            @Override
            public void removeBackStackListener(BackStackListener listener) {
                backStackListeners.remove(listener);            
            }
    
            @Override
            public void onBackPressed() {
                boolean result = false;
    
                if (backStackListeners.size() > 0) {
                    BackStackListener listener = backStackListeners.peekLast();
                    result = listener.onBackPressed();
                }
    
                if (!result) {
                    super.onBackPressed();
                }        
            }
    
        }
    

    在您的 PageFragment 中使用 onAttach 和 onDetach 方法注册回栈监听器

    class PageFragment extends Fragment implements IBackStackManager.BackStackListener {
    
       protected IBackStackManager backStackManager;
    
       onAttach(Context context){
           super.onAttach(context);
           try{
               backStackManager = (IBackStackManager) context;
               backStackManager.addBackStackListener(this);
           } catch(ClassCastException ex){
               ex.printStacktrace();
           }
       }
    
       onDetach(){
           super.onDetach();
           if (backStackManager != null){
               backStackManager.removeBackStackListener(this);
           }
       }       
    
       boolean onBackPressed(){
           if (getChildFragmentManager().getBackStackEntryCount() > 0){
               getChildFragmentManager().popBackStack();
               return true;
           } else {
               return false;
           }
       }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多