0

我已经编写了一个带有视图的 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>
4

1 回答 1

1

您现在可能已经解决了这个问题,但是为以后可能遇到此问题的人发帖以供后代使用 -

我在运行自定义 2.3.7 ROM 的 Nexus One 上遇到了同样的问题,但代码在我的 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;
    }
}
于 2012-08-08T07:43:44.993 回答