如何在不调用该 Activity 的 API 调用的情况下为横向和纵向模式使用不同的设计?
Posted
技术标签:
【中文标题】如何在不调用该 Activity 的 API 调用的情况下为横向和纵向模式使用不同的设计?【英文标题】:How to use different design for landscape and portrait mode without recalling the API calls on that Activity? 【发布时间】:2021-12-13 08:15:39 【问题描述】:我有一些关于我的活动的 API 调用以及纵向和横向模式的不同 UI 设计。
我在清单中添加了以下代码,以避免在模式更改时重新创建活动。但是使用下面的代码,将不支持不同的 UI。因此,在将模式从一种模式更改为另一种模式时,两种情况都会显示相同的 UI。
android:configChanges="orientation|screenSize|keyboardHidden"
尝试删除此代码,然后该 UI 按预期工作,但每次旋转都会重新创建活动。我也想避免这种情况。请为此提出更好的解决方案。
我的活动配置更改如下处理
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig)
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (getResources().getBoolean(R.bool.portrait_only))
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
else
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE)
else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT)
【问题讨论】:
【参考方案1】:将横向布局放入
res/layout-land/
这将在屏幕处于横向模式时处理布局。
并且还使用viewModel
来处理配置更改,如果您对viewModel
及其工作原理有任何疑问,请访问此
How ViewModel survives configuration change
【讨论】:
以前使用 layout-sw600dp-land 方法,横向和纵向的 UI 中只有边距发生变化。那行得通。但是现在为横向模式引入了新的 UI。然后,layout-sw600dp-land 文件夹中的 UI 更改不起作用。【参考方案2】:当通过设备旋转改变方向时,活动被销毁并重新创建。你无法阻止这一点。尽管您可以通过以下任何方式在每次更改方向时保存额外的 api 调用 -
使用ViewModel 和LiveData。 ViewModel 在方向变化后仍然存在,并且不会在每次方向变化期间重新创建,因此任何需要在方向变化时保存的数据都应该保存在 ViewModel 中。我强烈建议您阅读 app architecture 指南,以便更好地理解和为您的应用实施正确的架构。 如果您不想在上面实现和/或正在寻找快速解决方案,您可以通过覆盖onSaveInstanceState
方法将数据保存在 Bundle
中,并通过覆盖 onRestoreInstanceState
来恢复它。但是如果您的 api反响很大,我不建议这样做。
我建议您遵循第一点,因为这将是绕过您的用例的最佳方式。
【讨论】:
我是 ViewModel 的新手,在更改模式时恢复值/视图是否有任何延迟。因为对我来说,我在 onCreate 中有一个 API 调用,并且根据该 API 响应显示其余的屏幕内容。所以如果有一些延迟会影响性能。 没有明显的延迟(除了api响应的延迟)。以上是关于如何在不调用该 Activity 的 API 调用的情况下为横向和纵向模式使用不同的设计?的主要内容,如果未能解决你的问题,请参考以下文章
在构建Android库时,我可以使用什么模式来支持Activity中已配置的回调
如何在不使用 curl 和 guzzle 的情况下从控制器 Laravel 调用 API,因为它不起作用 [关闭]
是否保证调用 Activity.onStop() (API 11 +)
如何在不知道匹配返回的 json 数据中的所有值的情况下从 .Net 核心中的 Web api 调用创建模型?
Activity 结果 API 的 ActivityResultLauncher launch() 方法不仅会调用合约的 createIntent() 方法,还会调用 parseResult()