当前位置: 首页 > 面试题库 >

片段设计:通过在单个Activity中显示/隐藏片段来适应多种屏幕布局?

贝德辉
2023-03-14
问题内容

我试图了解如何使用Fragments创建可很好地适应多个屏幕和布局的应用程序。我研究了一些示例:

  1. Android开发人员指南中的片段文档。
  2. Google IO应用
  3. 片段来自ActionBar Sherlock。

所有这些都倡导多种Activity方法:

  • 在大屏幕上,显示Activity带有多个Fragments 的单个
  • 在较小的屏幕上,将Fragments 拆分为多个Activitys。

我想到了另一种方法- Activity一个:

  • 有一个单一的Activity与所有的Fragment在IT方面。
  • 根据屏幕大小和方向,显示/隐藏相应Fragment的(使用FragmentTransaction.show()/ FragmentTransaction.hide())。

为了与Android开发人员指南使用相同的“新闻文章列表/文章内容”示例进行说明:

  • News既含有活性ArticleListFragmentArticleReaderFragment
  • 在选项卡上,两个片段始终显示。
  • 在电话上,ArticleReaderFragment最初是隐藏的。从列表中选择文章时,将ArticleListFragment隐藏并ArticleReaderFragment显示。

有人使用过类似的方法吗?这种方法可能有实际的缺点吗?与多活动方式相比,它看起来更好/更差吗?例如,片段不能以XML显示/隐藏- 为此 必须
使用片段FragmentTransaction

编辑1:假想方案的描述

想象一个应用程序一次可以在屏幕上显示三个“窗格”。此外,这些是要考虑的因素:

  • 一个电话一次只能显示一个窗格(无论纵向/横向)
  • 一个7英寸的平板电脑可以显示2个窗格,在“纵向”中垂直拆分,在“横向”模式中水平拆分。
  • 一个10英寸以上的平板电脑可以显示2个窗格,这些窗格在纵向中垂直分割;3个窗格在横向上水平分割。

为简单起见,让电视屏幕不在讨论之列。

现在,将其翻译为设计:

  • 我们有三个片段:Frag1,Frag2和Frag3。
  • 在最简单的情况下,所有三个片段都在一个Activity中(简称为ActivityA)。这是10英寸的横向外壳。
  • 另一种“简单”的情况是每个片段都在其自己的Activity中-ActivityA包含Frag1; ActivityB包含Frag2,ActivityC包含Frag3。

到目前为止,我们还没有考虑与Android开发人员指南中提供的News Reader示例明显不同的任何内容。唯一的主要区别是 三个 片段而不是两个片段。

现在,只有7个标签的情况下只能容纳2个片段。这将如何运作?请注意,这里有两种可能的组合:

  1. 正在显示Frag1和Frag2。
  2. 正在显示Frag2和Frag3。

我只是无法解决这个问题。我是否在ActivityA中完成所有这些工作?我是否要创建一个全新的ActivityD?我需要创建多少个布局(我算了8个)​​?是不是太多了?

我的确意识到,我上面提出的单一活动方法也可能不适用于此情况-因为显示/隐藏片段本身并不是很简单的。

关于如何处理此问题而又不被布局和组合淹没的任何建议?


问题答案:

此答案由@Taylor克拉克是相当翔实。但是,这并不是我在原始问题中提出的使用单一活动方法的实际经验共享。我着手修改Android开发人员指南中的新闻阅读器示例,以使用单一活动方法,并提出了一个可行的解决方案。

尚待观察的是什么情况下这种方法比多重活动方法更可取(或者根本没有这样的情况)。另外,我没有详细研究问题编辑1中描述的3窗格方案。

我希望很快发布我的整个项目,但这是我如何进行的快速概述:

  • 单曲Activity:NewsActivity
  • 两个片段:TitlesListFragmentDetailsFragment
  • 这两个片段始终存在于中NewsActivity。根据当前的双重窗格,我显示/隐藏适当的片段。

我遇到的一些问题:

是否将布局指定为双窗格:

在原始的新闻阅读器示例中,双窗格布局具有FrameLayout用于保存新闻详细信息的。通过html" target="_blank">测试是否存在此帧布局,我们可以确定我们当前是否处于双窗格布局。

但是,在我的解决方案中,两个片段始终存在于所有布局中。我通过包含破解这View与ID
dualPane,并android:visibility="gone"在这些布局,我想成为的双窗格和省略的单面板布局这一观点。然后,这是一个问题

mDualPane = findViewById(R.id.dualPane)!=null;

编辑:

与拥有虚拟视图相比,有更好的方法来指定双重窗格。我更喜欢的是创建一个布尔资源。例如,我有config.xml如下内容:

<resources>
    <bool name="dual_pane">false</bool>
</resources>

然后,我可以将其他config.xml文件放在values-xlarge-landvalues-portvalues- sw600dp等文件夹中,并根据需要将布尔值调整为truefalse

然后,在代码中 getResources().getBoolean(R.bool.dual_pane);

关闭细节片段

这是区分Activity收盘价和Fragment收盘价的问题。最后,我必须重写onBackPressed()如下:

  • 在双窗格模式下,只需调用super.onBackPressed()
  • 在单窗格模式下,如果我们在TitlesListFragment,请致电super.onBackPressed()
  • 在单窗格模式下,如果我们在DetailsFragment,则将其视为关闭片段。这意味着将其隐藏并显示TitlesListFragment

这不是理想的,但是这是我能想到的最好的方法。

编辑

根据@SherifelKhatib在评论中的建议,有一种更简洁的方法可以处理后退按钮的操作:只需将其显示/隐藏明细片段的事务添加到Fragment
backstack中即可。这样,当您按下“后退”按钮时,片段事务将被撤消。如果您希望单击其他按钮,也可以手动弹出后退堆栈。



 类似资料:
  • 我正在开发包含2个片段的应用程序,我想根据需要显示隐藏。下面的代码有一个简单的例子来说明我的问题。这个简单的Fragmentactivity包含一个按钮和一个listfragment。 这个简单的例子完美无瑕。但我不满足于展示隐藏片段。如果删除布局。设置可见性(View.GONE);然后从代码中选择ft.hide(f);不会隐藏碎片。事实上,我们不是在隐藏片段,而是在隐藏容器。 我的问题是,这是一

  • 在我的应用程序中,我有一个ViewPager,里面有很多可滑动的标签,里面有碎片。是否有像这样的方法,每次片段出现在屏幕上时都会调用它?等是在创建片段之后调用的,而不是在片段出现在屏幕上时调用的,因此它们对我不起作用。我的问题可以用哪种方法?

  • 我试图从活动中隐藏/显示片段中的按钮,但它给了我以下异常。 android.view.ViewRootImpl$CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触摸其视图。 家庭活动 类别片段 代码太大,无法在此处发布。这就是为什么我只在发现问题的地方发布代码。 我能够获得新设计按钮实例。令我震惊的是,如果尝试玩按钮实例(可见/消失),它会给我上述异

  • 我一直试图在android中隐藏动作栏,得到了这部分程序,它最初隐藏,但后来从顶部。背后会有什么原因?又该如何解决呢?

  • 有很多关于查找显示/隐藏软键盘事件的帖子。我发现自己的处境是,我需要根据软键状态在片段中更改图标。 我试图实现onMeasure,但我无法在片段中覆盖它。是否有一种(相对)无痛的方式可以在我的片段中获得清晰的显示/隐藏软键盘事件,或者我应该放弃?

  • 我试图创建一个单一活动的Android应用程序。我有带有BottomNavigationView的MainActivity (only activity),三个顶级片段和一些子片段。我的要求是,每当屏幕显示顶级片段,底部导航应该是可见的,这样切换是可能的。但是当我查看任何子片段时,底部导航应该是隐藏的。是否有任何现成的方式使用导航组件或需要手动更改可见性?