基本上我的目标是将一些自定义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
进行一些解决方法以启用布局选择?(我不想在代码中以实际方式执行)
或者是否有更好的方法来实现我的目标,而我从一开始就做错了?
请帮帮我。
答案 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
如果您的自定义视图来自FrameLayout
或RelativeLayout
,我建议您改为从对应的PercentFrameLayout
和PercentRelativeLayout
延伸。
如果自定义视图没有延伸到其中一个,您可以按照其页面上的指南使用他们的帮助器PercentLayoutHelper
。
通过这种方式,您可以轻松地在视图上确定XML布局上视图大小的百分比