我已经编写了一个带有视图的 android 应用程序,该活动依赖于对视图包装器的 getHeight() 函数的回调,该函数使用附加到视图包装器的 viewTreeObserver 的 OnGlobalLayoutListener 来确定它在 onCreate 期间必须使用的空间量。通常这小于 chordDisplay 在下面的 xml 中请求的 400px。这在 android 模拟器中完美运行,适用于使用 android 2.1 和 4.03 的各种屏幕尺寸。但是,在我的 kindle fire 上,当我以横向方式启动应用程序时(小于 400 像素可用),回调最初不会返回正确的高度,直到我手动或通过代码将方向切换为纵向并返回横向。这意味着我的视图内容最初的大小不正确。
当我最初以横向启动应用程序时的示例 logcat 输出:
04-22 17:31:28.249: D/onGlobalLayout(12979): chordDisplay.getHeight(): 400
然后我切换到纵向并返回横向:
04-22 17:32:44.546: D/onGlobalLayout(12979): chordDisplay.getHeight(): 350
考虑到在方向更改期间发生的所有事情都是应用程序中对 onCreate() 的另一个调用,我不明白这是怎么发生的,对吧?这与我启动应用程序时发生的事情相同。
有没有人在他们的应用程序中遇到过类似的方向切换/布局错误?/知道为什么会发生这种情况吗?任何帮助将不胜感激......谢谢。
代码:
OnGlobalLayoutListener thelistener;
RelativeLayout chordDisplayWrapper;
TableRow.LayoutParams lp;
private ChordAdapter chordAdapter;
private HorizontalListView chordDisplay
thelistener = new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
chordDisplayWrapper.getViewTreeObserver().removeGlobalOnLayoutListener(this);
Log.d("onGlobalLayout", "chordDisplay.getHeight(): " + chordDisplay.getHeight());
lp = new TableRow.LayoutParams(chordDisplay.getHeight()/6 -2,chordDisplay.getHeight()/6 -2); //6 just works. I shrink it a tiny bit to compensate for some weird bug.
chordAdapter = (new ChordAdapter(mcontext, R.layout.row, magicbundle, lp));
chordDisplay.setAdapter(chordAdapter);
}
};
chordDisplayWrapper.getViewTreeObserver().addOnGlobalLayoutListener(thelistener);
涉及的视图的 xml 布局:
<RelativeLayout
android:id="@+id/chordDisplayWrapper"
android:layout_width="wrap_content"
android:layout_height="0dip"
android:layout_weight="1"
android:gravity="center" >
<berry.chordsfree.HorizontalListView
android:id="@+id/testerList"
android:layout_width="wrap_content"
android:layout_height="400px"
android:layout_centerInParent="true"
android:gravity="center" />
</RelativeLayout>