1. ホーム
  2. android

[解決済み] LayoutInflater は、私が指定した layout_width と layout_height レイアウトパラメータを無視するのはなぜですか?

2022-04-22 22:50:03

質問

LayoutInflater を期待通りに動作させるのに大変苦労していますし、他の人もそうでした。 layoutinflator を使って実行時にビューを追加するには? .

LayoutInflater は、なぜ私が指定したレイアウト パラメータを無視するのですか?例:なぜ layout_widthlayout_height の値は尊重されないのですか?

どうすればいいですか?

を参考に、この問題を調査してみました。 LayoutInflater ドキュメント を作成し、小さなサンプルデモプロジェクトを立ち上げました。次のチュートリアルでは、レイアウトに動的にデータを入力する方法について説明します。 LayoutInflater .

始める前に LayoutInflater.inflate() のパラメータはどのように見えるでしょうか。

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

  • 戻り値 : 膨張した階層のルート View。root が指定され attachToRoottrue それ以外の場合は,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);
    }
}

パラメータを変化させた実際の結果は、コードに記録されています。

SYNOPSIS: 呼び出し LayoutInflater rootを指定しない場合、XMLのレイアウトパラメータを無視したinflateコールが発生する。ルートが等しくない状態で inflate を呼び出すと nullattachRoot=true はレイアウトパラメータをロードしますが、ルートオブジェクトを再び返すので、ロードされたオブジェクトに対してそれ以上レイアウトを変更することはできません( findViewById() ). したがって、あなたが最も使いたい呼び出し規則は、このようなものです。

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

レイアウトの問題を解決するために レイアウトインスペクター を強くお勧めします。