1

ルート要素として RelativeLayout があります。ルート要素の下に 3 つの LinearLayouts があります。最初と最後は固定の高さで、中央のものは画面の残りの部分を取ります。

中央の LinearLayout 内に 2 つの ScrollView があります。それらに新しいビューをプログラムで追加します。画面サイズに関係なく、スクロールビューに3つのアイテムを表示したい。

問題は、アールの高さを計算できないため、それを 3 で割って必要なアイテムの高さを取得できないことです。

measure() と getMeasuredHeight() を呼び出そうとしましたが、LinearLayout は 21 を返し (理由はわかりません)、ScrollViews は 0 を返しました。LinearLayout と ScrollViews の両方に match_parent 属性があります。

では、どうすれば実際の高さを取得できますか? すべての空の領域をカバーしていることがわかるので、どこかで計算されていることがわかります。

デザイン

4

1 に答える 1

2

いいもの

よほどの理由がない限りやめてください。この種のレイアウトは、タブレットや大型のデバイスでは機能せず (巨大なリスト項目があると非常に奇妙に見えます)、一般的な動作ではありません。

悪い人

上部ビューと下部ビューのサイズは固定であり、次の方法で画面の高さを取得できると言いました。

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
// Use getSize on API13+
int displayHeight = display.getHeight();

次に、各行の高さはちょうど

int listHeight = displayHeight - (2 * fixedHeight)
int rowHeight = listHeight/3;

より複雑なレイアウトでは機能しないため、これは良くありません。

ぶさいく

ビューのサイズではonCreate、まだ初期化されていません。ビューにサイズが指定されるまで待つ必要があります。これを行うにはいくつかの方法があります。

  • View.OnLayoutChangeListener(API 11+)を使用する
  • ViewTreeObserver.OnGlobalLayoutListener(API 1+)を使用する
  • カスタム View クラス (サブクラス LinearLayout) を作成してオーバーライドするonSizeChanged
于 2013-06-28T20:33:43.780 に答える