android - Android - 根据活动主机方向添加不同的片段
问题描述
我从一周没有成功就面临这个问题。我正在尝试加载两个不同的片段:PortraitTestFrag.java
并且LandscapeTestFrag.java
取决于Activity
主机方向。
这些在/layout/activity_main.xml和/layout-land/activity_main.xmlFragments
中加载,如下所示:
<fragment
android:id="@+id/navigationContainerFragment"
android:name="class name#"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
我想要的是当我的Activity
主机是肖像时,PortraitTestFrag
加载并显示。当我Activity
是风景时,LandscapeTestFrag
应该加载并显示。
问题是PortraitTestFrag
在启动时可见但是当设备旋转时LandscapeTestFrag
永远不会显示甚至Activity
被破坏和重新创建。似乎第一个加载Fragment
的优先级。
可能是什么问题呢?
解决方案
我不建议您至少在方向更改时替换片段,因为您将丢失保存到捆绑包或持久保存在 ViewModel/Presenter/etc 中的数据。
使用 DI 或结构来更改片段内部特定方向逻辑的实现可能会更好。
如果你真的想改变整个片段,你可以创建一个代理片段来管理切换逻辑:
abstract class BaseSwitchFragment : Fragment() {
companion object {
private const val KEY_ORIENTATION = "ORIENTATION"
private const val CHILD_TAG = "CHILD_TAG"
}
private var prevOrientation: Int? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_switch, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
prevOrientation = savedInstanceState?.getInt(BaseSwitchFragment.KEY_ORIENTATION)
if (prevOrientation != resources.configuration.orientation) {
childFragmentManager.beginTransaction()
.replace(R.id.fragmentContainer, buildFragment(), CHILD_TAG)
.commit()
}
prevOrientation = resources.configuration.orientation
super.onViewCreated(view, savedInstanceState)
}
override fun onSaveInstanceState(outState: Bundle) {
outState.putInt(KEY_ORIENTATION, resources.configuration.orientation)
super.onSaveInstanceState(outState)
}
private fun buildFragment(): Fragment {
if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) {
return buildPortraitFragment()
} else {
return buildLandscapeFragment()
}
}
protected abstract fun buildPortraitFragment(): Fragment
protected abstract fun buildLandscapeFragment(): Fragment
}
我没有测试过这段代码,但它应该可以工作。此外,我相信可以优化此代码以防止重新创建子片段(如果要删除它)。
推荐阅读
- java - 路径参数中的 URL
- c# - 我如何编译(运行)只是 C# 中的一部分代码?
- mysql - 估计列大小
- python - BeautifulSoup 无法解析网站
- powershell - 如何在 SharePoint Online 中更新托管元数据文件属性
- excel - 使用 Power Query 导入格式奇特的 CSV
- angular - 从 Angular 5 升级到 Angular 6 后:当前文档没有文档类型
- powershell - PowerShell脚本使用扩展名查找文件并排除文件夹
- php - phpredis zRange 返回
- c# - 使用 ASP.Net Core 2.0 C# 在 MongoDB 中插入实时数据