これは、setId()
メソッドの説明です。
void android.view.View.setId(int id)
public void setId(int id)
以来:APIレベル1
このビューの識別子を設定します。識別子は、このビューの階層で一意である必要はありません。識別子は正の数である必要があります。
私の質問は、XMLファイルで一意のIDを割り当てるのに、なぜ識別子がこのビューの階層で一意である必要がないのかということです。
私の質問は、xml ファイルで一意の ID を割り当てているのに、このビューの階層で識別子を一意にする必要がないのはなぜですか?
XML ファイル内で一意である必要はandroid:id
ありませんが、通常はそのように記述します。
ウィジェット ID が一意である必要がない理由を理解するには、ListView
. ListView
8 行の があるとしましょう。これらの各行は、レイアウト XML リソース (例: android.R.layout.simple_list_item_1
) を膨張させることによって作成されます。これらの膨張した各行は、の子ですListView
。ただし、これらの各行は同じレイアウト リソースからインフレートされるため、各行のウィジェットは他のすべての行と同じ ID を持ちます。
これは一般的に問題ではありません。これは、Android 開発の基本ルールの 1 つにつながります。それは、求めるウィジェットに固有の結果をもたらす何かを常に呼び出すfindViewById()
ことです。この場合、すべて同じ ID を持つ 8 つのウィジェットがあり、どの行のウィジェットが返されるかわからないため、 行の 1 つの内部でウィジェットを検索するためfindViewById()
にListView
またはを呼び出したくありません。Activity
代わりに、その特定の行から特定のウィジェットを取得するためfindViewById()
に、行を呼び出す必要があります。
ID は一意である必要はありません。任意の正の整数を使用できますが、この場合、同等の ID を持つビューがいくつか存在する可能性があります。
また、Romain Guy はこの投稿で次のように述べています。
findViewById()
深さ優先探索アルゴリズムです。見つかった指定された ID の最初のビューを返します。