如何在选项卡式活动的一个选项卡(片段)中隐藏/显示2个不同的片段?

时间:2017-03-18 17:50:33

标签: android tabs fragment

我有一个标签式活动,想要在第一个标签中显示:

  • 列表视图
  • 2个按钮

如果单击了listview的一项,我想在第一个选项卡中显示另一个片段,其中包含:

  • 另一个listview
  • 另外2个按钮

然后,如果按下后退按钮,我想返回上一个片段(在同一个标​​签中)。如果第二个列表视图(虽然可见)的arraylist的数据已经改变,我想对第一个listview的arraylist采用这些更改。所以我想尽可能容易地访问两个列表视图的数据。

enter image description here

我的第一种方法是:一切都在一个片段中,有一个布局(包括不同的视图,我隐藏/显示)。 < - 我不喜欢这个,这个课程变得庞大/混乱。

我的第二种方法是:第一个片段/标签有另一个包含2个片段的viewpager。 < - 我猜这太复杂了(f.i。主要活动标签之间的刷卡干扰了新的viewpager,需要处理)

对此最好的apprpach是什么?

1 个答案:

答案 0 :(得分:0)

创建您的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;
       }
   }

}