始终有可靠的方向

Always have reliable orientation

基本上我的目标是将一些自定义 View 大小设置为 1/3 屏幕 portrait 方向和 1/6 对于 landscape

我想到的第一个想法是简单地计算一些 mSize 变量并将其设置为 OnMeasure 中的 View,如下所示:

  mSize = (AContext.getScreenSize().x / (orientation == Configuration.ORIENTATION_PORTRAIT  ? 3 : 6)

  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
      super.onMeasure(mSize|MeasureSpec.EXACTLY, mSize|MeasureSpec.EXACTLY);
  }

它工作得很好,直到我旋转屏幕。问题是当屏幕旋转时 View 初始化和调整大小在 之前被调用 orientation 值实际上会改变,所以结果是 三分之一到 landscape,如果它首先以 portrait 方向打开,反之亦然。

我知道我可以做类似的事情:

android:configChanges="orientation|screenSize"

AndroidManifest 中为我的 Activity 覆盖 onConfigurationChanged 以处理旋转并更改那里的 mSize 值,但是,它禁用自动选择在 portraitlandscape 布局之间 (来自 inflating 上的 .xml 个文件)。所以我最终得到了两个方向相同的 xml 文件。

有没有办法使 orientationcontext.getResources().getConfiguration().orientation 的值保持一致?

或者我需要用 onConfigurationChange 做一些解决方法来启用布局选择?(我不想在代码中手动完成它

或者有没有更好的方法来实现我的目标,我只是从一开始就做错了?

请帮助我。

首先我会说在这种情况下不要使用 android:configChanges="orientation|screenSize"。在自定义视图上这样的事情毫无意义。

其次,我认为主要错误是您获取 3 或 6 值的方式。使用 XML.

可以更简单地实现它
res/values/integers.xml
   <integer name="view_fraction">3</integer>
res/values-land/integers.xml
   <integer name="view_fraction">6</integer>

然后在您查看 constructor 期间,您只需调用:

int val = context.getResources().getInteger(R.integer.view_fraction)

此外,我将建议您简单地使用 Google 提供给我们的代码,而不是尝试重新编码,从而提供其他一些改进视图大小计算的建议。使用 android.support.percent

中的 类

如果您的自定义视图扩展自 FrameLayoutRelativeLayout,我建议您改为扩展其对应的百分比 PercentFrameLayout and PercentRelativeLayout

如果自定义视图不从其中之一扩展,您可以按照他们页面上的指南使用他们的助手PercentLayoutHelper

通过这种方式,您可以轻松地在 XML 布局

上动态分配视图大小的百分比