我在一个活动中编写了一个带有视图的Android应用程序,该活动依赖于对视图的包装器的getHeight()函数的回调,使用附加到视图的包装器的viewTreeObserver的OnGlobalLayoutListener来确定它必须使用的空间量,在onCreate期间。通常这小于下面xml中chordDisplay请求的400px。这在Android模拟器中完美运行,适用于使用android 2.1和4.03的各种屏幕尺寸。但是,在我的点火中,当我以横向方式启动应用程序(小于400px可用)时,回调最初不会返回正确的高度,直到我将方向切换为纵向并手动或通过代码返回横向。这意味着我的视图内容最初的大小不正确。
我最初在横向启动应用程序时的示例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>
答案 0 :(得分:1)
你现在可能已经解决了这个问题,但是为后人发布了后代 -
我在Nexus One上遇到了同样的问题,运行自定义2.3.7 ROM,但代码在我的Nexus Galaxy上运行4.1.1。
与您类似,我正在尝试使用onCreate
在ViewTreeObserver
期间调整某些观看次数。我尝试过手动调用dispatchGlobalLayout
,并确定onGlobalLayout
没有解雇不是问题。我玩弄了活动的onWindowFocusChanged
但没有成功(但我希望避免在那里进行大量调整)。这花了我一天多的工作,所以我现在只是使用快速/脏修复。通常情况下,如果我在onCreate
完成后调整有问题的布局/视图:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (!reset) {
LinearLayout frameItem = (LinearLayout) findViewById(R.id.frameItem);
frameItem.setVisibility(LinearLayout.GONE);
frameItem.setVisibility(LinearLayout.VISIBLE);
reset = true;
}
}