2 つの異なるレイアウトの 2 つの異なるビューに同じ ID を使用している場合、R.java のクラス「id」の ID に対して 1 つの参照しか作成されていないことがわかります。実際、ビルド時にクラス「id」に同じ名前の定数を追加しようとすると、エラーが表示されるはずだと思います.なぜエラーが表示されないのですか?.そして、単一のIDで2つの異なるビューをどのように識別しますか?
3 に答える
2 つの異なるグループに 2 人の異なる人物がいて、どちらも Vicky という名前である場合、名前 (=id) を呼び出すときにその人物が誰であるかは問題ではありません。最初のグループで「Vicky」と呼ぶと、そのグループの Vicky が応答します。setContentView(<layout file>)
Android では、グループの場所を使用して、ビューの「グループ」をアクティビティに割り当てます<layout file>
。使用できない ID (読み込まれたレイアウト ファイルにないなど) を使用して findViewWithId() によってビューを要求すると、null が返されます。
例:
layout1.xml に含まれるもの
<View id="@+id/name1"/>
<View id="@+id/name2"/>
<View id="@+id/name3"/>
layout2.xml が含まれています
<View id="@+id/name1"/>
<View id="@+id/name3"/>
1 番目と 2 番目のレイアウト ファイルを呼び出すfindViewById(R.id.name1)
と、最初のビューが返されます。しかしfindViewById(R.id.name2)
、2 番目のレイアウトで呼び出すと、 が返されnull
ます。ID は A レイアウト ファイルに存在しますが、単に「ロードされた」レイアウト ファイルには存在しません。
Id は View オブジェクトへの参照ではありません。これらは、異なるレイアウトの複数のビューで使用できる識別子です。レイアウト ファイルで識別子を検索すると、それを使用してビューへの参照を取得できます。
ids
同じファイルではなく、異なるxml
ファイルで表示するために同じ文字列名を使用できます。そして、それがコンパイラが異なるレイアウト内の異なるビューを区別する方法です
2 つの異なるビューに同じ文字列を使用している場合、ID は 1 つしか生成されず、同じになります。これは、たとえば RelativeLayouts で非常に便利な機能です。@+id を複数回使用でき、同じ ID を参照することがわかっているためです。ビュー自体には一意の ID が必要ですが、ID はレイアウトステートメント。
これは設計された方法であり、エラーではありません。