怪异的火灾布局问题

时间:2012-04-22 21:38:12

标签: android xml screen-orientation kindle-fire

我在一个活动中编写了一个带有视图的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>

1 个答案:

答案 0 :(得分:1)

你现在可能已经解决了这个问题,但是为后人发布了后代 -

我在Nexus One上遇到了同样的问题,运行自定义2.3.7 ROM,但代码在我的Nexus Galaxy上运行4.1.1。

与您类似,我正在尝试使用onCreateViewTreeObserver期间调整某些观看次数。我尝试过手动调用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;
    }
}