始终有可靠的方向

时间:2016-07-01 14:27:50

标签: android view orientation

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

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

  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的{​​{1}}中覆盖Activity以处理轮播并更改onConfigurationChanged值,但是,会禁用{{1}之间的自动选择}和mSize布局(来自portrait上的landscape个文件)。因此,我最终会为两个方向使用相同的.xml文件。

有没有办法让inflating值与xml保持一致?

或者我需要使用orientation进行一些解决方法以启用布局选择?(我不想在代码中以实际方式执行

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

请帮帮我。

1 个答案:

答案 0 :(得分:1)

首先我会说在这种情况下不使用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>

然后在您的视图构造函数中,您只需调用:

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

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

中的类

如果您的自定义视图来自FrameLayoutRelativeLayout,我建议您改为从对应的PercentFrameLayoutPercentRelativeLayout延伸。

如果自定义视图没有延伸到其中一个,您可以按照其页面上的指南使用他们的帮助器PercentLayoutHelper

通过这种方式,您可以轻松地在视图上确定XML布局上视图大小的百分比