10

私が欲しいのは、2つのビューを垂直に配置したレイアウトにすることです。上面図をA、底面図をBと呼びましょう。Bに与えられる高さの量を通常の高さ(つまり、ラップコンテンツ)にします。ただし、使用可能なスペースの半分以上を与えたくない場合を除きます。Aは残っているものを取得します。

別の言い方をすれば、Aは常に利用可能な高さの少なくとも50%を取得し、Bは最大で50%を取得する必要があるということです。

それを達成する簡単な方法を見つけることができないようです。両方のレイアウトの高さを0に設定し、それらに等しい重みを指定して、両方を常に50%にすることができますが、Bが50%より小さい場合は、必要なものだけを指定する必要があります。

私が見ることができる唯一の方法は、AまたはBのカスタムクラスを使用し、onMeasureをオーバーライドして、高さを親の50%に制限することですが、もっと簡単な方法があるはずです。

4

4 に答える 4

3

わかりました、今わかりました。私が正しく理解しているなら、あなたはそれを次のようにしたいと思っています:

if A > B -> do nothing 
if B > A & B > parent layout -> 50% to both of them
if B > A & B < parent layout -> A = parent layout - B

そうしないと onCreate でビューの高さが 0 を返すため、すべてを実行する必要がありましonWindowFocusChangedた。子レイアウトとして 2 つの LinearLayouts を使用して実行しましたが、好きなように使用できます。

私のXML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:id="@+id/parent_lay"
    android:orientation="vertical"
    android:layout_height="match_parent" >

//Layout A:
    <LinearLayout
        android:id="@+id/lay_1"
        android:layout_width="match_parent"
       android:background="@android:color/background_dark"
        android:layout_height="10dp" >
    </LinearLayout>
//Layout B:
    <LinearLayout
        android:id="@+id/lay_2"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="#123456" >

    </LinearLayout>

</LinearLayout>

主な活動:

public class MainActivity extends Activity {
    LinearLayout parent_lay;
    LinearLayout lay_1;
    LinearLayout lay_2;
    int parent_height;
    int lay_1_height;
    int lay_2_heigth;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        // TODO Auto-generated method stub
        super.onWindowFocusChanged(hasFocus);
        parent_lay = (LinearLayout) findViewById(R.id.parent_lay);
        lay_1 = (LinearLayout) findViewById(R.id.lay_1);
        lay_2 = (LinearLayout) findViewById(R.id.lay_2);
        lay_1_height = lay_1.getHeight();
        lay_2_heigth = lay_2.getHeight();
        parent_height = parent_lay.getHeight();


        if (lay_2.getHeight() > lay_1.getHeight()
                && lay_2.getHeight() > (parent_lay.getHeight() / 2)) {

            lay_1.setLayoutParams(new LinearLayout.LayoutParams(
                    LayoutParams.MATCH_PARENT, 0, 1));

            lay_2.setLayoutParams(new LinearLayout.LayoutParams(
                    LayoutParams.MATCH_PARENT, 0, 1));

        } else if (lay_2.getHeight() < (parent_lay.getHeight() / 2)) {
            lay_1.setLayoutParams(new LinearLayout.LayoutParams(
                    LayoutParams.MATCH_PARENT, (parent_height - lay_2_heigth)));

        }

    }

}

例: A が60 dpで B が40 dpの場合:

ここに画像の説明を入力

A が60 dpで B が400 dpの場合:

ここに画像の説明を入力

于 2012-10-18T06:47:12.687 に答える
0

これを実現するには、独自のコンポーネントを作成する必要があります。

たとえば、ここで LinearLayout を使用すると、onMeasure メソッドをオーバーライドして LinearLayout を拡張できます。次のように onMeasure を実装できます。

@Override
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    final int width = getMeasuredWidth();
    final int height = getMeasuredHeight();
    setMeasuredDimension(width, height / 2);
}

このコードは十分にエレガントではありません。本当にうまくやりたい場合は、Android ソース コード (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/) から元の onMeasure メソッドをコピーします。 android/widget/LinearLayout.java#LinearLayout.onMeasure%28int%2Cint%29) で、 をmeasureVertical(int widthMeasureSpec, int heightMeasureSpec)設定しmTotalLength = mTotalLength / 2ます。

onMeasure の詳細については、http ://developer.android.com/guide/topics/ui/custom-components.htmlおよびhttp://developer.android.com/reference/android/view/View.html#onMeasureをご覧ください。 (整数、整数)。

于 2012-10-18T15:35:37.903 に答える
-1

.5それぞれに重みのある2つの内部フレームを使用して線形レイアウトを作成します。それらのフレームwrap_contentに、ビューを配置し、それらを適切に設定しmatch_parentます。

于 2012-10-18T01:47:33.743 に答える