0

onCreate中に、ビューのラッパーのviewTreeObserverにアタッチされたOnGlobalLayoutListenerを使用して、ビューのラッパーのgetHeight()関数へのコールバックに依存するアクティビティ内のビューを使用して、Androidアプリを作成しました。通常、これは、以下のxmlでchordDisplayによって要求された400px未満です。これは、Android 2.1および4.03を使用するさまざまな画面サイズで、Androidエミュレーターで完全に機能します。ただし、キンドルファイアでは、アプリを横向きで起動したときに(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>
4

1 に答える 1

1

あなたは今ではこれを解決しているかもしれませんが、後でこれに出くわす可能性のある人のために後世のために投稿してください -

カスタム 2.3.7 ROM を実行している Nexus One で同じ問題が発生していますが、コードはストック 4.1.1 の Nexus Galaxy で動作します。

あなたと同様に、onCreate使用中に特定のビューのサイズを変更しようとしてViewTreeObserverいます。手動で呼び出してみましたが、発砲dispatchGlobalLayoutしないことによる問題ではないことを確認しました。onGlobalLayoutそして、要素をアクティビティに移動してonWindowFocusChanged成功しませんでした(ただし、そこでサイズ変更を行うことは避けたいと思います)。これは私に 1 日以上の作業を要したので、今のところクイック/ダーティ フィックスを使用しています。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 に答える