我可以在 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)的列表。