我应该在底部导航栏中使用多少活动?

时间:2017-02-20 22:59:35

标签: java android android-fragments state bottomnavigationview

我对android studio来说相当新,任何帮助都会受到赞赏。

我在MainActivity中以编程方式设置了一个底部导航栏。 我想知道 - 用其他片段设置它的最佳方法是什么。我有三个片段,一个用于导航栏中的每个选项卡,另一个片段可以在导航栏片段中按下按钮时打开。

我的问题是,我在哪里设置这些其他片段,在连接到导航栏或不同活动的片段的同一活动中。

如何保存显示片段的当前状态,以便当我移动到另一个选项卡然后向后移动时,它将处于与我离开时相同的状态?

2 个答案:

答案 0 :(得分:0)

  

我的问题是,我在哪里设置这些其他片段?在连接到导航栏或不同活动的片段的同一活动中。

这取决于您以及您希望如何显示片段。您可以在同一活动中显示它们或打开另一个活动。但请记住,如果您打开另一个活动,您将丢失上一个活动的导航栏(活动始终使用整个屏幕)

What does FragmentManager and FragmentTransaction exactly do?

  

如何保存显示片段的当前状态以便何时   我移动到另一个选项卡,然后向后移动它将是相同的   我离开的时候说的是什么?

了解https://developer.android.com/guide/components/fragments.html#Lifecycle

处的片段生命周期

具体来说,您希望将状态保存在onSaveInstanceState中,当您在onCreate

中重新创建片段时,您保存的内容将会发回给您

答案 1 :(得分:0)

我想扩展@rupps所说的内容,因为我觉得FragmentManager / Transaction所做的部分并没有从你期望的地方接近。

我假设你正在使用BottomNavigationView

无论Fragments的(重要的)生命周期如何,你必须明白片段总是附加到一个活动上(注意:这不是真的,但不要谈论无头碎片现在)。

您可以采用的方法是Activity布局如下所示:(伪代码)

<RelativeLayout width=match_parent height=match_parent>
  <FrameLayout 
     id="@+id/your_fragment_container" 
     width=match_parent 
     height=match_parent
     layout_above="@+id/navbar" />
  <BottomNavigationView 
     id="@id/navbar"
     width=match_parent 
     height=wrap_content 
     align_parent_bottom=true />
</RelativeLayout>

这样BottomNavBar将始终位于布局的底部。

现在你必须处理把碎片放在那里......让我们说你需要在{bar}附加一个Listener,当你收到回调时,选择了一个新的菜单项...您可以继续更改片段(您将在启动时始终获得一个事件,或者您可以在onCreate期间强制它我想)。

您将逐字地向onNavigationItemSelected(MenuItem item)方法添加switch / if语句。

并根据addFragment(TAG);来调用case

伪代码让你明白了:

private void addFragment(final String tag) {
        final Fragment existing = getSupportFragmentManager().findFragmentByTag(tag);

        if (existing == null) {
            final Fragment newInstance = getNewFragmentInstanceWithTag(tag);
            getSupportFragmentManager()
                    .beginTransaction()
                    .replace(getFragmentContainerLayout(), newInstance, tag)
                    .commit();
        }
}

您还需要提供:

private int getFragmentContainerLayout() {
    return R.id.your_fragment_container;
}

和...

public static final String TAB1_TAG = "TAB1_TAG";
public static final String TAB2_TAG = "TAB2_TAG";
public static final String TAB3_TAG = "TAB3_TAG";

protected Fragment getNewFragmentInstanceWithTag(String tag) {
    switch (tag) {
        case TAB1_TAG:
            return Tab1Fragment.newInstance();
        case TAB2_TAG:
            return Tab2Fragment.newInstance();
        case TAB3_TAG:
            return Tab3Fragment.newInstance();
        default:
            return null;
    }
}

那么青蛙是FragmentManager / Transaction?

将Manager视为单个对象(每个应用程序一个),它保留对Fragments的引用,并可以为您检索它们(如果它们之前存在)。它处理事务(添加/删除/隐藏/显示等),以便您以后可以回滚它们(假设您在事务中添加片段,如果您还addToBackStack()那么您可以简单地告诉管理器:弹出最后一次交易,有效地回滚。

它是一个怪物。它有超过9000年的错误,它不是很直观;但是一旦你习惯了它,你只需要使用它&#34;。