我可以在 android 中有 2 个具有相同 ID 的不同视图吗
Can i have 2 different views with same id in android
TextView 和 ImageView 具有相同的 Id 是否正确?
因为它们属于同一个实体,所以我给了它们相同的 ID。
如果是..那我如何通过id分别找到这些视图?
理论上可以,但强烈建议不要这样做。同一布局中的重复 ID,因为它会阻止通过 ID 查找视图(您将需要遍历子项或以其他方式引用它们),并导致 collision/outright 当这些视图尝试 store/restore 它们的 [=10] 时崩溃=].
Is it right to have same Id for a TextView and a ImageView ?
简答:否
长答案:不使用相同的 ID 是正确的,因为这样做会导致运行时错误。考虑下面的例子
layout.xml
<TextView
android:id="@+id/location"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="0dp"
android:layout_marginTop="12dp" />
<ImageView
android:id="@+id/location"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginStart="33dp"
android:layout_marginTop="5dp"
app:srcCompat="@drawable/openLoc" />
LocationActivity.java
setContentView(R.layout.activity_profile); //inflated layout
txtLocation = (TextView) findViewById(R.id.location);
在这里你会遇到Activites中的问题,因为它会混淆应该从两个元素中挑选哪个元素。
顺便说一句 YES 你可以在不同的布局中使用相同的 ID,因为它不会产生任何运行时错误,因为它只会在膨胀的布局上搜索 ID。
编辑: 您可以在同一布局中使用相同的 ID。当您通过 findViewById()
调用它并抛出类似的异常时,它会导致问题
java.lang.ClassCastException
android.support.v7.widget.AppCompatImageView cannot be cast to android.widget.TextView
建议:我不知道你为什么要为两个元素分配相同的ID,但如果你想要可读性,那么我建议你以元素的方式设置id可以通过 ID 轻松识别,例如 android:id="@+id/txtLocation"
android:id="@+id/imgLocation"
仅通过读取 ID 即可轻松识别元素类型。您可以通过在开头附加布局名称(如 android:id="@+id/profileTxtLocation"
)来使其更容易。现在这将在编码时帮助您,因为自动完成功能将帮助您。只需键入布局名称,您将获得所有布局元素的列表,然后您将键入元素的种类,您将获得布局中所有要求的元素(例如:textViews)的列表。
TextView 和 ImageView 具有相同的 Id 是否正确? 因为它们属于同一个实体,所以我给了它们相同的 ID。 如果是..那我如何通过id分别找到这些视图?
理论上可以,但强烈建议不要这样做。同一布局中的重复 ID,因为它会阻止通过 ID 查找视图(您将需要遍历子项或以其他方式引用它们),并导致 collision/outright 当这些视图尝试 store/restore 它们的 [=10] 时崩溃=].
Is it right to have same Id for a TextView and a ImageView ?
简答:否
长答案:不使用相同的 ID 是正确的,因为这样做会导致运行时错误。考虑下面的例子
layout.xml
<TextView
android:id="@+id/location"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="0dp"
android:layout_marginTop="12dp" />
<ImageView
android:id="@+id/location"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginStart="33dp"
android:layout_marginTop="5dp"
app:srcCompat="@drawable/openLoc" />
LocationActivity.java
setContentView(R.layout.activity_profile); //inflated layout
txtLocation = (TextView) findViewById(R.id.location);
在这里你会遇到Activites中的问题,因为它会混淆应该从两个元素中挑选哪个元素。
顺便说一句 YES 你可以在不同的布局中使用相同的 ID,因为它不会产生任何运行时错误,因为它只会在膨胀的布局上搜索 ID。
编辑: 您可以在同一布局中使用相同的 ID。当您通过 findViewById()
调用它并抛出类似的异常时,它会导致问题
java.lang.ClassCastException
android.support.v7.widget.AppCompatImageView cannot be cast to android.widget.TextView
建议:我不知道你为什么要为两个元素分配相同的ID,但如果你想要可读性,那么我建议你以元素的方式设置id可以通过 ID 轻松识别,例如 android:id="@+id/txtLocation"
android:id="@+id/imgLocation"
仅通过读取 ID 即可轻松识别元素类型。您可以通过在开头附加布局名称(如 android:id="@+id/profileTxtLocation"
)来使其更容易。现在这将在编码时帮助您,因为自动完成功能将帮助您。只需键入布局名称,您将获得所有布局元素的列表,然后您将键入元素的种类,您将获得布局中所有要求的元素(例如:textViews)的列表。