如何在不调用该 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()

我们可以在不使用 SAS 令牌的情况下通过 c# 代码调用 Azure API 管理吗