android-fragments 底部导航栏应该使用多少个活动?

kwvwclae  于 2022-11-14  发布在  Android
关注(0)|答案(2)|浏览(154)

我对android studio还比较陌生,任何帮助都将不胜感激。
我已经在我的MainActivity中以编程方式设置了一个底部导航栏--用其他片段设置它的最佳方式是什么?我有三个片段,导航栏中的每个选项卡都有一个,其他片段可以在按下导航栏片段中的按钮时打开。我在哪里设置这些其他片段?在连接连接到导航栏的片段的同一Activity中或在不同Activity中。
我如何保存显示片段的当前状态,以便当我移动到不同的选项卡,然后再移回来时,它将处于与我离开它时相同的状态?

pw9qyyiw

pw9qyyiw1#

我的问题是,我在哪里设置这些其他片段?是在连接连接到导航栏的片段的同一个Activity中,还是在不同的Activity中。
您可以在同一个Activity中显示这些片段,也可以打开另一个Activity。但是请记住,如果您打开另一个Activity,您将丢失前一个Activity的导航栏(Activity总是使用整个屏幕)。
What does FragmentManager and FragmentTransaction exactly do?
我如何保存显示片段的当前状态,以便当我移动到不同的选项卡,然后再移动回来时,它将处于与我离开它时相同的状态?
请在www.example.com上阅读有关片段生命周期的信息https://developer.android.com/guide/components/fragments.html#Lifecycle
具体地说,您希望将状态保存在onSaveInstanceState中,当在onCreate中重新创建片段时,您保存的内容将被发送回给您

jgwigjjp

jgwigjjp2#

我想对@rupps所说的进行扩展,因为我觉得关于FragmentManager/Transaction做什么的部分并没有从您所期望的地方接近。
我猜你用的是BottomNavigationView
无论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将始终显示在布局的底部。
现在,您必须处理将片段放在那里的问题...假设您需要将Listener附加到该栏,并且当您收到一个回调,表明已选择了一个新的菜单项...您可以继续更改片段(启动时总是会得到一个事件,或者我想您可以在onCreate期间强制它)。
您将在onNavigationItemSelected(MenuItem item)方法中添加switch/if语句。
并且根据它是哪个case来调用addFragment(TAG);
伪代码让你明白这个想法:

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/事务是什么?

把管理器想象成一个单独的对象(每个应用一个),它保持对片段的引用,并可以为你检索它们(如果它们以前存在的话)。它处理事务(添加/删除/隐藏/显示等),这样你以后就可以回滚它们(比如你在事务中添加了一个片段,如果你也是addToBackStack(),那么你可以简单地告诉管理器:弹出最后一个事务,有效地回滚它。
它是一个怪物。它有超过9000年的错误,它不是很直观;但是一旦你习惯了,你就只是“使用它”。

相关问题