17

パラメータを次のように指定できるため、XML ファイルの操作は簡単でした。

<android:layout_width="fill_parent" android:layout_height="wrap_content">

しかし、コードで指定するときに混乱します。ビューごとに、次を使用してパラメーターを指定します

view.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.FILL_PARENT)); 

相対レイアウト、フレーム レイアウトなどとして指定するオプションがあることがわかりました。現在、画像、テキスト、グリッドビューなどのすべてのビューに線形レイアウトを使用しています。親要素のレイアウトに基づいてビュー パラメーターを定義する必要がありますか? それとも、ビューがフレームレイアウトなどの子であっても、線形レイアウトとして指定しても問題ありませんか? 申し訳ありませんが、私は違いを見つけることができませんでした。

4

2 に答える 2

19

すべてのレイアウト クラス ( LinearLayoutRelativeLayoutなど) は extendsViewGroupです。

クラスには 2 つのViewGroup静的内部クラスがあります:LayoutParamsMarginLayoutParams. そしてViewGroup.MarginLayoutParams実際に拡張しViewGroup.LayoutParamsます。


レイアウト クラスでは、子ビューに関連付ける追加のレイアウト情報が必要になる場合があります。このために、内部静的LayoutParamsクラスを定義します。たとえば、次のLinearLayoutとおりです。

public class LinearLayout extends ViewGroup {
   ...
   public static class LayoutParams extends ViewGroup.MarginLayoutParams {  
   ...
   }
}

についても同じですRelativeLayout

public class RelativeLayout extends ViewGroup {
   ...
   public static class LayoutParams extends ViewGroup.MarginLayoutParams {  
   ...
   }
}

しかしLinearLayout.LayoutParams、 とRelativeLayout.LayoutParamsは完全に異なる独立したクラスです。子ビューに関するさまざまな追加情報を保存します。

たとえば、値を各ビューにLinearLayout.LayoutParams関連付けることはできますが、関連付けることはできません。、、などの値を各ビューに関連付けることができます。そして、単にこれらの機能を持っていません。weightRelativeLayout.LayoutParamsRelativeLayout.LayoutParamsabovebelowalightWithParentLinearLayout.LayoutParams


したがって、一般に、LayoutParamsビューを正しく配置してレンダリングするには、囲みレイアウトを使用する必要があります。ただし、すべてLayoutParams同じ親クラスを持つことに注意してくださいViewGroup.LayoutParams。また、そのクラスで定義されている機能のみを使用する場合 (あなたの場合WRAP_CONTENTやのように)、間違ったクラスを使用してレイアウト パラメーターを指定しFILL_PARENTたとしても、動作するコードを取得できます。LayoutParams

于 2011-06-23T12:42:27.960 に答える
10

レイアウトを変更するビューの数に応じて、ヘルパーメソッドを作成し、変更するビューを、変更する高さと幅の値とともにメソッドに渡す方がよいと思います。

public void setWidthHeight(View v, int width, int height){
    LayoutParams lp;
    lp = v.getLayoutParams();
    lp.width = width;
    lp.height = height;
    v.setLayoutParams(lp);
}

ここで幅と高さを設定すると、xmlの同じ値と一致しないことに注意してください。つまり、android:layout_width="32dp"はlp.width=32と同じではありません。

また、lpと呼ばれるLayoutParams型変数は、ビューによって返される型である必要があります...ビューによって返される型を確認し、その型をインポートステートメントにインポートします。

于 2012-05-01T22:37:56.580 に答える