我试图了解如何使用Fragments创建可很好地适应多个屏幕和布局的应用程序。我研究了一些示例:
所有这些都倡导多种Activity
方法:
Activity
带有多个Fragment
s 的单个Fragment
s 拆分为多个Activity
s。我想到了另一种方法- Activity
一个:
Activity
与所有的Fragment
在IT方面。Fragment
的(使用FragmentTransaction.show()
/ FragmentTransaction.hide()
)。为了与Android开发人员指南使用相同的“新闻文章列表/文章内容”示例进行说明:
News
既含有活性ArticleListFragment
和ArticleReaderFragment
。ArticleReaderFragment
最初是隐藏的。从列表中选择文章时,将ArticleListFragment
隐藏并ArticleReaderFragment
显示。有人使用过类似的方法吗?这种方法可能有实际的缺点吗?与多活动方式相比,它看起来更好/更差吗?例如,片段不能以XML显示/隐藏- 为此 必须
使用片段FragmentTransaction
。
想象一个应用程序一次可以在屏幕上显示三个“窗格”。此外,这些是要考虑的因素:
为简单起见,让电视屏幕不在讨论之列。
现在,将其翻译为设计:
到目前为止,我们还没有考虑与Android开发人员指南中提供的News Reader示例明显不同的任何内容。唯一的主要区别是 三个 片段而不是两个片段。
现在,只有7个标签的情况下只能容纳2个片段。这将如何运作?请注意,这里有两种可能的组合:
我只是无法解决这个问题。我是否在ActivityA中完成所有这些工作?我是否要创建一个全新的ActivityD?我需要创建多少个布局(我算了8个)?是不是太多了?
我的确意识到,我上面提出的单一活动方法也可能不适用于此情况-因为显示/隐藏片段本身并不是很简单的。
关于如何处理此问题而又不被布局和组合淹没的任何建议?
此答案由@Taylor克拉克是相当翔实。但是,这并不是我在原始问题中提出的使用单一活动方法的实际经验共享。我着手修改Android开发人员指南中的新闻阅读器示例,以使用单一活动方法,并提出了一个可行的解决方案。
尚待观察的是什么情况下这种方法比多重活动方法更可取(或者根本没有这样的情况)。另外,我没有详细研究问题编辑1中描述的3窗格方案。
我希望很快发布我的整个项目,但这是我如何进行的快速概述:
Activity
:NewsActivityTitlesListFragment
和DetailsFragment
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-land
,values-port
或values- sw600dp
等文件夹中,并根据需要将布尔值调整为true
或false
。
然后,在代码中 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),三个顶级片段和一些子片段。我的要求是,每当屏幕显示顶级片段,底部导航应该是可见的,这样切换是可能的。但是当我查看任何子片段时,底部导航应该是隐藏的。是否有任何现成的方式使用导航组件或需要手动更改可见性?