LayoutInflater が指定した layout_width と layout_height レイアウトパラメータを無視するのはなぜですか? 質問する

LayoutInflater が指定した layout_width と layout_height レイアウトパラメータを無視するのはなぜですか? 質問する

LayoutInflater を期待通りに動作させるのに私は大きな問題を抱えていましたが、他の人も同様でした。実行時に layoutinflator を使用してビューを追加するにはどうすればよいでしょうか?

LayoutInflater が指定したレイアウト パラメータを無視するのはなぜですか? たとえば、リソース XML のlayout_widthおよび値が考慮されないのはなぜですか?layout_height

ベストアンサー1

私はこの問題を調査し、LayoutInflater ドキュメント小さなサンプル デモ プロジェクトをセットアップします。次のチュートリアルでは、 を使用してレイアウトを動的に作成する方法を示しますLayoutInflater

始める前に、LayoutInflater.inflate()パラメータがどのようになっているかを確認してください。

  • リソース: 読み込む XML レイアウト リソースの ID (例: R.layout.main_page)
  • : 生成された階層の親となるオプションのビュー (attachToRootの場合)、または返される階層のルートに値のtrueセットを提供するオブジェクト(の場合)。LayoutParamsattachToRootfalse
  • ルートにアタッチLayoutParams: 拡張された階層をルート パラメータに添付するかどうか。false の場合、ルートはXML 内のルート ビューの正しいサブクラスを作成するためにのみ使用されます。

  • 戻り値: 拡張された階層のルート ビュー。ルートが指定されていてattachToRootである場合true、これはルートです。それ以外の場合は、拡張された XML ファイルのルートです。

次に、サンプルのレイアウトとコードを示します。

メインレイアウト(main.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</LinearLayout>

このコンテナーには別の TextView が追加され、レイアウト パラメーターが XML から正常に適用された場合は小さな赤い四角として表示されます ( red.xml)。

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="25dp"
    android:layout_height="25dp"
    android:background="#ff0000"
    android:text="red" />

現在はLayoutInflaterいくつかの呼び出しパラメータのバリエーションで使用されています

public class InflaterTest extends Activity {

    private View view;

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      setContentView(R.layout.main);
      ViewGroup parent = (ViewGroup) findViewById(R.id.container);

      // result: layout_height=wrap_content layout_width=match_parent
      view = LayoutInflater.from(this).inflate(R.layout.red, null);
      parent.addView(view);

      // result: layout_height=100 layout_width=100
      view = LayoutInflater.from(this).inflate(R.layout.red, null);
      parent.addView(view, 100, 100);

      // result: layout_height=25dp layout_width=25dp
      // view=textView due to attachRoot=false
      view = LayoutInflater.from(this).inflate(R.layout.red, parent, false);
      parent.addView(view);

      // result: layout_height=25dp layout_width=25dp 
      // parent.addView not necessary as this is already done by attachRoot=true
      // view=root due to parent supplied as hierarchy root and attachRoot=true
      view = LayoutInflater.from(this).inflate(R.layout.red, parent, true);
    }
}

パラメータの変化の実際の結果はコードに記録されます。

概要:ルートを指定せずに を呼び出すとLayoutInflater、XML からのレイアウト パラメータを無視して inflate が呼び出されます。ルートが等しくなくnull、かつ でない状態で inflate を呼び出すattachRoot=trueと、レイアウト パラメータがロードされますが、ルート オブジェクトが再度返され、ロードされたオブジェクトに対するレイアウトの変更がさらに防止されます ( を使用して見つけられる場合を除くfindViewById())。したがって、最も使用したい呼び出し規約は次のようになります。

loadedView = LayoutInflater.from(context)
                .inflate(R.layout.layout_to_load, parent, false);

レイアウトの問題に対処するために、レイアウトインスペクタ強くお勧めします。

おすすめ記事