如何处理单个活动的多个片段

Posted

技术标签:

【中文标题】如何处理单个活动的多个片段【英文标题】:How to handle multiple Fragments for a single Activity 【发布时间】:2015-04-12 20:13:03 【问题描述】:

我最近开始研究为我的 android 设备开发应用程序。让我产生这种兴趣的原因是我正在和几个 arduino 一起玩,他们有一个很棒的主意,可以让他们与我的手机通信,比如我在 arduino 本身上测量的任何值的接口。现在我可以采取简单的方法并使用公共资源来完成此操作,但没有太多要学习的方法,我希望它按照我想要的方式进行。

现在我想我需要问的第一个问题是,多个片段/单个活动是否是我完成此任务的最佳方式?基本上,我想要 1 个与 arduino 的连接,提取所有值,但根据我选择的“选项卡”,我希望某些值以某种方式显示。我决定让每个选项卡成为不同的片段,并以不同的方式显示值。就像我说的,我才刚刚开始 android 开发经验,所以没有太多的基础来做这个选择。

所以我一直专注于这个多片段的想法:

    创建了多个 Fragment.xml 文件 为每个单独的视图定义一个类 创建了一个列表来显示可用的片段 选中时实例化和显示的片段

所以基本上我的 onMenuItemSelect 看起来像这样。

FragmentTransaction FT = getFragmentManager.beginTransaction();
switch(position)
    case 1:
        FT.replace(R.id.fragment_container, new MyFragment()).commit();
        break;
    case 2:
        FT.replace(R.id.fragment_container, new MySecondFragment()).commit();
        break;

上面的代码有效,它完成了我想要的,没有任何问题。不过我不太喜欢这个,因为对于我想添加的每一个 Fragment,我都需要在 switch 中添加一个新的 case。这也每次都会实例化一个新的片段,即使已经创建了一个片段。那是问题吗?

我遇到的最大问题是它不是最容易扩展的。对于 2-3 个片段,这不是最糟糕的处理方式(在我看来)。我希望能够拥有尽可能多的片段,而无需为交换机中的每个片段提供单独的案例。所以我所做的是创建一个 fragmentList 来保存我的每个片段的单个实例。

List<Fragment> fragmentList;

private void populateFragmentList();
    fragmentList = new ArrayList<Fragment>();
    fragmentList.add(new HomeFrag());
    fragmentList.add(new BluetoothFragment());
    fragmentList.add(new USBFragment());
    fragmentList.add(new RCInfoFragment());
    fragmentList.add(new ControllerFragment());
    fragmentList.add(new FingerCordsFrag());

public void onMenuItemSelect(int position, int curPosition)
    if(fragmentList.get(position).isAdded())
       getFragmentManager().beginTransaction().show(fragmentList.get(postition))
        .hide(fragmentList.get(curPosition)).commit();
    
    else
        getFragmentManager().beginTransaction().add(R.id.fragment_container, fragmentList.get(position)).show(fragmentList.get(position)).hide(fragmentList.get(curPosition)).commit();

而且这种方法也有效。我可以让它显示我所有的片段,而不必每次都重新实例化每个片段。我相信这可以满足我的要求,它可以很好地扩展(比开关/外壳 IMO 更好)。我现在遇到的问题是,当我改变方向时,一切都会变得疯狂。到目前为止,我只测试纵向模式,当我以其他方向选择它们时,我无法查看我的任何片段。我可以在任一方向启动它,并且它可以工作,但是当我在运行时更改它时,我只能看到我在更改方向时打开的一个片段。

现在,每个片段“onCreateView”都被调用,只是没有显示显示。我相信我已经把它缩小到它没有被附加到从方向改变创建的新活动上。无论如何我可以将已经创建的片段重新附加到新活动。

总的来说,我的问题是:

    这个模型对我的应用来说是不是一个好方法? 有没有一种很好的方式来处理可扩展的片段?不能 似乎找到任何例子。 每次打开不同的选项卡时都使用“new MyFragment()” 实现这一目标的合理方法? 我将片段存储在列表中的方式是否合理? 处理它们? 如何在 方向改变?

感谢您的宝贵时间。

*必须即时键入所有这些代码,因为出于某种原因,我无法正确格式化我的 C/P 代码。

【问题讨论】:

【参考方案1】:

我认为使用片段并以this example开头是一个不错的选择...

您绝对应该重写一些“适配器”以更轻松地处理所有事务...

检查here 是否有方向问题...

【讨论】:

以上是关于如何处理单个活动的多个片段的主要内容,如果未能解决你的问题,请参考以下文章

Android - 如何处理单个 ListViewItem 中的多个元素?

如何处理片段上的触摸事件?

使用选项卡活动和片段时如何处理后按

如何处理单个页面上的多个异步错误?

Jetpack Compose 和 Compose Navigation 如何处理 Android 活动?

我们如何处理具有单个实体类的多个存储过程