0

我是 android studio 的新手,任何帮助将不胜感激。

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

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

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

4

2 回答 2

0

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

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

FragmentManager 和 FragmentTransaction 到底是做什么的?

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

在https://developer.android.com/guide/components/fragments.html#Lifecycle阅读片段生命周期

具体来说,您希望将状态保存在 中onSaveInstanceState,当片段重新创建时,您保存的内容将发送回给您onCreate

于 2017-02-21T00:15:20.873 回答
0

我想扩展@rupps 所说的内容,因为我觉得关于 FragmentManager/Transaction 所做的部分不是从您期望的地方接近的。

我假设您使用的是BottomNavigationView

无论 Fragment 的(重要)生命周期如何,您都必须了解 Fragment始终附加到一个活动(注意:这不是真的,但我们现在不讨论无头 Fragment)。

您可以采用的方法是 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 将始终出现在布局的底部。

现在您必须处理将片段放在那里...假设您需要将侦听器附加到该栏,并且当您收到已选择新菜单项的回调时...您可以继续更改片段(您将始终在启动时获取一个事件,或者您可以在我想的 onCreate 期间强制它)。

您将在该方法中添加一个 switch/if 语句onNavigationItemSelected(MenuItem item)

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;
}

还有……</p>

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 年的错误,而且不是很直观;但是一旦你习惯了它,你就“使用它”。

于 2017-02-21T04:23:01.030 回答