始终有可靠的方向
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
值,但是,它禁用自动选择在 portrait
和 landscape
布局之间 (来自 inflating
上的 .xml
个文件)。所以我最终得到了两个方向相同的 xml
文件。
有没有办法使 orientation
与 context.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
中的 类
如果您的自定义视图扩展自 FrameLayout
或 RelativeLayout
,我建议您改为扩展其对应的百分比 PercentFrameLayout
and PercentRelativeLayout
。
如果自定义视图不从其中之一扩展,您可以按照他们页面上的指南使用他们的助手PercentLayoutHelper
。
通过这种方式,您可以轻松地在 XML 布局
上动态分配视图大小的百分比
基本上我的目标是将一些自定义 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
值,但是,它禁用自动选择在 portrait
和 landscape
布局之间 (来自 inflating
上的 .xml
个文件)。所以我最终得到了两个方向相同的 xml
文件。
有没有办法使 orientation
与 context.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
如果您的自定义视图扩展自 FrameLayout
或 RelativeLayout
,我建议您改为扩展其对应的百分比 PercentFrameLayout
and PercentRelativeLayout
。
如果自定义视图不从其中之一扩展,您可以按照他们页面上的指南使用他们的助手PercentLayoutHelper
。
通过这种方式,您可以轻松地在 XML 布局
上动态分配视图大小的百分比