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>