web-dev-qa-db-ja.com

android)でのレイアウトパラメータの設定

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

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

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

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

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

17
Jerrin George

すべてのレイアウトクラス(LinearLayoutRelativeLayoutなど)はViewGroupを拡張します。

ViewGroupクラスには、LayoutParamsMarginLayoutParamsの2つの静的内部クラスがあります。そして、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.LayoutParamsRelativeLayout.LayoutParamsは完全に異なる独立したクラスです。それらは、子ビューに関するさまざまな追加情報を格納します。

たとえば、LinearLayout.LayoutParamsweight値を各ビューに関連付けることができますが、RelativeLayout.LayoutParamsはできません。 RelativeLayout.LayoutParamsと同じことです。abovebelowalightWithParentなどの値を各ビューに関連付けることができます。そして、LinearLayout.LayoutParamsにはこれらの機能がありません。


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

19
inazaruk

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

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型変数は、ビューによって返される型である必要があります...ビューによって返される型を確認し、その型をインポートステートメントにインポートします。

10
Sandy Simonton