16

AndroidのIDを生成するときに

@+id/foo

Androidは、次のようなR.javaのエントリを作成します。

 public static final class id {
        public static final int foo=0x7f060005;
 }

異なるxmlファイル(たとえば、2つのレイアウト内)で名前の衝突が発生した場合はどうなりますか?@ + idメカニズムは、別のID名がまだ存在する場合にID名を上書きすることを保証しますが、R.javaで生成されるID名はどれですか?

4

3 に答える 3

25

@+id/fooIDが存在しない場合、または既存のIDを使用する場合、構文が追加されます。
findViewByIdを見つけると、メソッドを呼び出したビューで動作します。

したがって、ネストされたビューがある場合、IDはビューごとに一意になります。たとえば、View1->View2には両方ともfooがあります。 View1.findViewById(R.id.foo)とは異なりますView2.findViewById(R.id.foo)

編集:私が言及する主なことは、2つのレイアウトが同じIDを持つことはできないということだと思います。ID制約の詳細については、http://d.android.com/guide/topics/ui/declaring-layout.htmlをご覧ください。

于 2010-01-21T17:55:32.070 に答える
4

次のxmlを使用して単純なHelloWorldアプリケーションを試しました。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

<TextView
        android:id="@+id/textview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="text1"
/>

<TextView
        android:id="@+id/textview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="text2"
/>

</LinearLayout>

私の両方のテキストビューは同じIDを持っています。正常にコンパイルされ、正常に実行され、両方のTextViewがレンダリングされます。また、findViewByid()を実行すると、最初のものが検出され、setTextなどのすべての関数呼び出しが適用されます。理想的には、AAPTはこれをキャッチする必要がありますが、明らかにキャッチしません。プログラマーがIDに依存しない限り、何かをひどく壊すことはありません。つまり、そのようなコードを書くのに十分愚かであるなら、クラッシュするに値するというようなものです。

AAPTはそれについてあまり気にしません。そのため、これは、プログラマーによって明示的なIDが提供されていないViewsの単純な拡張のようなものです。

于 2012-01-23T19:12:10.273 に答える
2

すでに生成されている場合は、識別子を再利用するだけだと思います。私はIDをかなり再利用する傾向があり、問題が発生したことはありません。

于 2010-01-21T17:53:13.383 に答える