1

5 つの LinearLayouts があります。書きやすく理解しやすいように、それらをビュー A ~ E と呼びます。

ビュー A は、ビュー B、C、D、および E の親です。

ビュー A の layout_weight を 8.0f に設定し、ビュー B ~ E の重みをそれぞれ 1.0f、3.0f、1.0f、3.0f に設定しました。

これは親ビューの空きスペースを管理するためであることは理解していますが、ビューとサブビューのサイズを変更して、空きスペースだけで競合するのではなく、画面のパーセンテージを所有することを望んでいました。

ただし、これはすべてプログラムで行われるため、LinearLayouts の高さをそのgetHeight()親 (ビュー A) のメソッド/アクセサーの係数に設定する必要がありますか? もしそうなら、ビューがまだ親に追加されていない場合、親の高さを取得するにはどうすればよいですか? MATCH_PARENT で高さを設定しますか?

このメソッドは、、および最初のgetHeight()に対して 0 を返すため、答えを探し続けなければなりませんでした。とが見つかりました。これにより、 が設定されたときに通知されます。ただし、描画が発生する前に高さを取得していただければ幸いです。それは不可能ですか?onCreateonStartonResumeViewTreeObserverOnGlobalLayoutListenerLayout

4

3 に答える 3

2

これをプログラムで行う必要がない場合は、xml で行うことができます。子 LinearLayouts が親 LinearLayout (LinearLayout A) の割合を占めるようにするには、親の weightSum=(Total layout_weight of child LinearLayouts) を設定し、子 LinearLayouts の width/height プロパティを "0dip" に設定する必要があります。それらの layout_weight を目的のパーセンテージに設定します。

垂直方向のサンプル コードは次のようになります。

<LinearLayout
     android:id="@+id/A"
     android:layout_height="fill_parent"
     android:layout_width="fill_parent"
     android:weightSum="8.0"
     android:orientation="vertical">
     <LinearLayout
          android:id="@+id/B"
          android:layout_height="0dip"
          android:layout_width="fill_parent"
          android:layout_weight="1.0"/>
     <LinearLayout
          android:id="@+id/C"
          android:layout_height="0dip"
          android:layout_width="fill_parent"
          android:layout_weight="3.0"
</LinearLayout>
于 2013-01-25T00:48:30.867 に答える
1

残念ながら、描画される前にビューのサイズを取得することはできません (私が知らないハックがある場合を除きます)。ビューは、レイアウトの準備が整うまで、そのサイズに関する情報を保持しません。将来のリリースで、ビューが描画される前にシステムがビューの寸法を保持するように設計されているとよいでしょう。

カスタム クラスを作成し、View クラスを拡張し、システムによって呼び出されるメソッドをオーバーライドして、ディメンションをアクティビティ内のオブジェクト参照に返すことができます。ただし、これは役立つというよりも頭痛の種になる可能性が高く、実際には何のメリットもありません。

ViewTreeObserver と OnGlobalLayoutListener を使用することをお勧めします。

于 2013-01-25T00:40:45.687 に答える
1

上記のフラグメントでこれを行う方法は次のとおりです。

最初に onAttach メソッドでコンテキストへの参照を保存します (いずれにせよ、アクティビティへのコールバックを設定する必要があるでしょう:

Context context;

@Override
public void onAttach(Activity activity){
    super.onAttach(activity);

    context = activity;


} 

次に、onViewCreate で測定値を取得して使用します。

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    Display display = ((WindowManager)
        context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
    DisplayMetrics metrics = new DisplayMetrics();
    display.getMetrics(metrics);

    float pixHeight = metrics.heightPixels;
    float pixWidth = metrics.widthPixels;
    float density  = context.getResources().getDisplayMetrics().density;
    float dpHeight = pixHeight / density;
    float dpWidth  = pixWidth / density;

    // make various layouts using your measurements, send the
    // measure of each parent to each custom drawn child, or 
    // send the bounds of each child as determined by the size of each parent

    return someView;
}
于 2013-01-25T01:30:14.107 に答える