13

Android がどのように機能するかをより深く理解したいので、ビューが実際に「内部で」どのように機能しているかを説明してくれる人が必要です。

通常の手順では、メソッド「setContentView(R.layout.ourlayoutfile)」を使用して、拡張されたアクティビティの onCreate メソッドで XML からビューをインフレートします (これは正しい言葉ですか?)。次に、その XML からビューを見つけます。

簡単な例: ボタンを見つける必要がある場合は、最初に「setContentVIew()」を呼び出し、次にボタンで「findViewById」を呼び出す必要があります。次に、このボタン/ビューをそれぞれ操作できます。

最近 LayoutInflater をいじり始めたのですが、「setContentView」メソッドがどうにもならないところまで来てしまい、驚いたことに、自分の Android の知識が非常に乏しいことがわかりました。LayoutInflater を機能させることさえできませんでした。恥ずかしかったです。

1 日後、LayoutInflater でビューを膨らませることができました。実際にはそれほど難しいことではありません。私は最初から非常に近くにいましたが、何を渡せばよいかわからないパラメーターが 1 つあります。このコードを見てください: (これはすべて Activity の onCreate メソッドで行われています)

View v = getLayoutInflater().inflate(R.layout.activity_main, (ViewGroup) getWindow().getDecorView());



    final Button b = (Button) v.findViewById(R.id.button1);
    final TextView tv = (TextView) v.findViewById(R.id.textView1);

    b.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {


            tv.setText("Just random text");
        }
    });

}

このコードは正常に動作しますが、私が直面していた問題は、実際には次のコード行でした。

getLayoutInflater().inflate(R.layout.activity_main, null);

私は常に「null」パラメータを渡していましたが、もちろんうまくいきませんでした。ドキュメントでも、このパラメーターはオプションであると書かれています。(なぜ ? 必要な場合) ?

シンプルなレイアウトにしました。それを見て、HiarchyViewer でどのように見えるかを確認してください。

ここに画像の説明を入力

上の図の 2 番目のパラメータは何ですか? なぜそのパラメータが必要なのですか? 私のレイアウト( R.layout.activity_main )をAndroidが提供するビュー(左から右への最初のビュー - 親ビュー)に接続している可能性があります。その場合、Android がこれら 2 つを自動的に接続しないのはなぜですか?!

ここに画像の説明を入力

ビューに関して知っておく必要がある有用なことがあれば、誰かが私に教えてくれる(またはリンクを投稿する)ことができればとてもうれしいです。さらに、ビューの仕組みに関するいくつかのウェブサイトへのリンクを取得できればいいと思います..など。便利なもの。

誰かが私の質問に反対票を投じる場合は、説明してください。皆様、本当にありがとうございました!

4

2 に答える 2

14

Android で表示されるすべてのコンポーネントがView. これには、、、、などButtonが含まれます。プログラムのxmlファイルで定義されているビューにアクセスする方法についても、あなたは正しいです。ビューを膨らませてから、そのIDを使用してビューを見つけます。これを行う通常の方法は、メソッドを使用することです。SpinnerTextViewEditTextsetContentView()

LayoutInflaterしかし、レイアウトを「膨らませる」ために使用できる、非常に便利なクラスがあります。ListViewメソッドを使用して膨らませた xml ファイルにがあるシナリオを考えてみましょうsetContentView()。この ListView では、項目に と を含める必要がありImageViewますTextView。デフォルトのリスト項目にはTextView. TextViewそこで、と をImageView定義した新しい listitems.xml を使用するカスタム アダプターを作成することにしました。アクティビティ全体でこのレイアウトを膨張させるため、この場合は使用できませsetContentView()ん。これは明らかに望ましくありません。したがってLayoutInflater、この場合はあなたを助けるために使用します。を使用してレイアウトを一時的に膨張させますinflate()方法。最初の引数は、インフレートする必要があるレイアウト ファイルを受け取ります。2 番目の引数は、この新しく膨張したレイアウトのルートです。私たちの場合ListView、レイアウトが実際に膨張する場所に設定できます。

したがって、このinflate()メソッドを使用するViewと、膨張した xml 内にあるビューを含む が返されます。この返されたビュー インスタンスを使用findViewById() して、含まれているビューを呼び出して、テキストを に設定しTextView、画像ソースをに設定することができますImageView

多くの場合、LayoutInflaterユースケースはこの議論の範囲よりも広いため、最終的に を使用することになります。

于 2013-11-08T15:36:00.733 に答える
10

このコードを見てください

のかなり珍しい使い方ですLayoutInflater。特に、メイン コンテンツ エリアの外側にあるアクション バーと関連する "クロム" の使用が大幅に台無しになることが予想されます。

私は常に「null」パラメータを渡していましたが、もちろんうまくいきませんでした

nullは、2 パラメーターinflate()メソッドの 2 番目のパラメーターの完全に妥当な値です。そうすることは、インフレートされたView階層をある時点で自分で UI に追加することを意味します (たとえば、addView()目的の親に対する呼び出しを介して)。

ドキュメントでも、このパラメーターはオプションであると書かれています。

これは、パラメーターがオプションであるためです。

(なぜ ? 必要な場合) ?

必要ありません。

上の図の 2 番目のパラメータは何ですか

ですPhoneWindow$DecorView

なぜそこにそれが必要なのですか?

あなたはそこにそれを必要とせずgetDecorView()、控えめに言っても、あなたの選択は典型的ではありません.

私のレイアウト( R.layout.activity_main )をAndroidが提供するビュー(左から右への最初のビュー - 親ビュー)に接続している可能性があります。

はい。documentationを引用すると、2つのパラメーターの2番目のパラメーターinflate()は、「生成された階層の親になるオプションのビュー」です。

その場合、Android がこれら 2 つを自動的に接続しないのはなぜですか?!

なぜでしょうか?結局、Hierarchy View スクリーンショットのバブルを数えることでわかるように、膨らませた 3 つを超えて合計 5 つのビューがあります。他の 1 つではなく、その 1 つをランダムに選択するのはなぜですか? さらに、Android が知っている限りでは、使用する親はまだ存在していません。これは、後のステップで作成するためです。

したがって、目的の親を の 2 番目のパラメーターとして渡すかinflate()(この場合、Android は膨張したレイアウトを子としてその親に追加します)、または渡しますnull(この場合、子を親に追加するのはあなたの仕事です)。適切な時点で自分自身)。

Android自動的に子を親に追加しないようにすることは、次の 2 つの主な用途の標準であることに注意してLayoutInflaterください。

  • の子AdapterView(たとえば、 a の行ListView)
  • フラグメントのコンテンツ (つまり、 で膨張onCreateView())
于 2013-11-08T15:49:11.787 に答える