XMLファイルでは、のようなビューにIDを割り当ててからandroid:id="@+id/something"
呼び出すfindViewById()
ことができますが、プログラムでビューを作成する場合、IDを割り当てるにはどうすればよいですか?
setId()
デフォルトの割り当てと同じではないと思います。setId()
余分です。
誰かが私を訂正できますか?
id
概要Androidid
は、ビューを識別するために一般的に使用される整数です。これid
は、XML(可能な場合)およびコード(プログラム)を介して割り当てることができます。これid
はView
、Inflater
(を使用するなどして)によって生成されたXML定義の参照を取得するのに最も役立ちますsetContentView
。
id
経由で割り当てるXML
android:id="@+id/
somenameの属性を追加"
します。android:id
されると、コードで使用するための一意の が割り当てられint
ます。android:id
のint
値を参照しますR.id.
。int
はビルドごとに変わる可能性があるため、package.name /からIDをコピーしないでください。「somename」を使用してください。gen/
R.java
R.id.
id
割り当てられたものPreference
は、をPreference
生成するときに使用されませんView
。)id
コードを介して割り当てる(プログラムで)id
を使用してsを手動で設定するsomeView.setId(
);
int
正でなければなりませんが、それ以外それはあなたが望むものは何でもすることができarbitrary-される(これは恐ろしいであれば読み続けます。)id
のXML
-割り当てられたid
は一意になります。id
は一意である必要はありませんid
sは、(理論的には)XML
-assignedと競合する可能性id
があります。id
するものは、正しく照会されれば問題になりません(読み続けてください)。id
するかは問題ではありませんfindViewById(int)
指定したビューからビュー階層を再帰的に深さ優先で繰り返し、最初View
に見つかったものを一致するもので返しますid
。id
XML定義の前に割り当てられたコード割り当てがない限りid
、findViewById(R.id.somename)
常にXML定義のビューを返しますid
。ID
のViewGroup
をid
。で定義します。LinearLayout
とandroid:id="@+id/placeholder"
。ViewGroup
にView
sを入力します。id
各ビューに便利なを割り当てます。placeholder.findViewById(convenientInt);を使用してこれらの子ビューをクエリします。
View.generateViewId()
一意のIDを生成できるAPI17が導入されました。
ビューへの参照を周囲に保持することを選択した場合は、でそれらをインスタンス化し、getApplicationContext()
で各参照をnullに設定してくださいonDestroy
。どうやら漏れたActivity
(それは後に破壊されている上にぶら下がっは)無駄な..です:)
android:id
コードで使用するためにXMLを予約する View.generateViewId()
一意のIDを生成するAPI17が導入されました。(これを指摘してくれたtake-chances-make-changesに感謝します。)*
ViewGroup
XMLで定義できない場合(または定義したくない場合)は、XMLを介してIDを予約し、一意のままにすることができます。
ここで、values / ids.xmlはカスタムを定義しますid
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="reservedNamedId" type="id"/>
</resources>
次に、ViewGroupまたはViewが作成されたら、カスタムIDを添付できます
myViewGroup.setId(R.id.reservedNamedId);
id
例難読化された例として明確にするためid
に、舞台裏で競合が発生したときに何が起こるかを調べてみましょう。
layout / mylayout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/placeholder"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>
競合をシミュレートするために、最新のビルドにR.id.placeholder
(@+id/placeholder
)のint
値が割り当てられているとし 12
ます。
次に、MyActivity.javaは、プログラムで(コードを介して)いくつかの追加ビューを定義します。
int placeholderId = R.id.placeholder; // placeholderId==12
// returns *placeholder* which has id==12:
ViewGroup placeholder = (ViewGroup)this.findViewById(placeholderId);
for (int i=0; i<20; i++){
TextView tv = new TextView(this.getApplicationContext());
// One new TextView will also be assigned an id==12:
tv.setId(i);
placeholder.addView(tv);
}
したがってplaceholder
、新しいものの1つはTextView
両方ともid
12です!ただし、プレースホルダーの子ビューを照会する場合、これは実際には問題ではありません。
// Will return a generated TextView:
placeholder.findViewById(12);
// Whereas this will return the ViewGroup *placeholder*;
// as long as its R.id remains 12:
Activity.this.findViewById(12);
*そんなに悪くない
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加