【问题标题】:Locking Android orientation based on preference根据偏好锁定 Android 方向
【发布时间】:2019-11-11 15:50:32
【问题描述】:

不,不是老问题的反刍,请多多包涵。我不想避免一般的活动娱乐(清单中没有android:configChanges),我不想仅仅因为我懒于实施实例保存而永久地固定我的方向(清单中没有android:screenOrientation)。

我有一个应用程序,用户可以进行三种可能的设置:1. 按照正常情况自动更改方向布局,2. 固定纵向,3. 固定横向。在我的情况下这是有道理的,因为纵向和横向显示显示不同的功能,并且用户可能希望限制为一个。不一定,但有可能。

该应用程序运行良好。我阅读了onCreate 中的首选项设置,如果我处于其中一种固定模式,则调用setRequestedOrientation。我让系统处理方向变化,我不要求自己处理变化。

唯一的性能问题是,例如,当应用程序以设备的纵向位置启动但固定为横向时,onCreate 将被调用两次,一次用于原始启动,一次用于setRequestedOrientation。它完美无缺,我处理得很好,但有性能损失,活动出现明显延迟。 (screenOrientation 固定在清单中,仅用于测试目的,启动看起来好多了,只需调用一次 onCreate

所以,我正在寻找的是一种等效于清单 screenOrientation 设置的代码。我不能也不想在清单中指定它,但是从 onCreate 调用它对于性能来说已经有点晚了。

【问题讨论】:

  • 尝试在 setContentView() 之前调用 setRequestedOrientation,甚至在 super.onCreate(savedInstanceState) 之前调用
  • 没有骰子。我什至尝试将其移至onStart,但没有区别......工作得很好,但与清单固定方案相比有明显的滞后。那个开始非常好。
  • onStart在onCreate之后被调用,所以没有变化是正常的。
  • 嗯,这次没查,只是试了一下。 :-) 但是是的,是的。
  • 另一种可能的解决方案,创建一个BaseActivity,你在onCreate中调用setRequestedOrientation,并让所有Activity都继承自它

标签: android screen-orientation


【解决方案1】:

你试过了吗?

<activity
        android:name=".YourActivity"
        android:configChanges="orientation|keyboard|keyboardHidden|screenSize|screenLayout|uiMode" />

清单文件中的这 configChanges 行应该避免重新调用 onCreate 方法:)

【讨论】:

  • 不,我没有。我在问题中特别指出,我不追求通常的廉价替代品,这些替代品可以消除系统处理方向变化的负担。我想保留 Android 提供的全部功能,包括响应方向变化在应用运行时,我只想在启动时避免单一的性能问题。
  • 我认为您将保留所有功能,只是在更改方向等时保存状态,因此您不必管理所有这些事件,也不必担心双重问题调用 onCreate()。
  • 没有。如果这样做,我将失去所有功能,布局将不再适应设备的旋转,Android 将不再自动使用我在 xxx、xxx-port 和 xxx-land 文件夹中的各种资源,等等。我需要所有这些功能,我不想削弱任何功能(这就是文档非常严重地警告不要使用 configChanges 的原因)。我需要(但似乎根本没有办法实现它)是优化一个单一的启动事件,我不愿意仅仅因为它而牺牲其他一切。
【解决方案2】:

尝试在 Application Class 中读取用户偏好,并根据该值在 onCreate setContentView 中读取。

public class MyApp extends Application{
  public void onCreate(){
   // get user preference here in a global variable
   }
}

将此设置为 Manifest 中的应用程序类。

然后在您的活动 onCreate 中,使用此值确定 setContentView() 之前的布局。

【讨论】:

  • 抱歉,这不是解决方案。我可以在应用程序或活动中阅读setContentView 之前的首选项,这没有问题。问题是我在onCreate 中所做的一切都已经太晚了。即使在调用setContentView 之前,即使在调用super.onCreate 之前,我已经inside onCreate,因此更改方向将再次调用onCreate。文档毫不含糊地这么说,并指出如果我可以在创建活动之前调用setRequestedOrientation,它将申请下一次创建。只是我不能...
  • onResume() 在 onCreate 之前,你试过吗?
  • 好吧,谷歌似乎不同意你的看法:developer.android.com/guide/components/activities/… :-)
  • 是的,对不起,我的错误......我记错了,没有检查文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多