我可以在Android中使用2个具有相同ID的不同视图吗

时间:2018-07-14 18:26:08

标签: java android textview imageview

为TextView和ImageView设置相同的ID是否正确? 由于它们属于一个实体,因此我给了他们两个相同的ID。 如果是的话..那我怎样才能分别通过id查找这些视图呢?

2 个答案:

答案 0 :(得分:1)

  

为TextView和ImageView设置相同的ID是否正确?

简短回答:

长答案:使用相同的ID是的权利,因为这样做可能会导致运行时错误。考虑下面的例子

layout.xml

NullInjectorError

LocationActivity.java

        <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" />

在这里,您将在Activites中遇到问题,因为应该混淆从两个元素中选择哪个元素。

顺便说一句,,您可以在不同的布局中使用相同的ID,因为它不会出现任何运行时错误,因为它将仅在膨胀的布局中搜索ID。

编辑:您可以在相同布局中使用相同的ID。当您通过setContentView(R.layout.activity_profile); //inflated layout txtLocation = (TextView) findViewById(R.id.location); 调用它时会引起问题,并引发类似的异常

findViewById()

建议:我不知道为什么要为两个元素分配相同的ID,但是如果您希望可读性强,那么我建议您设置ID的方式应易于识别像java.lang.ClassCastException android.support.v7.widget.AppCompatImageView cannot be cast to android.widget.TextView android:id="@+id/txtLocation"这样的ID,仅读取ID即可轻松识别元素类型。您可以通过在android:id="@+id/imgLocation"之类的开头添加布局名称来使其更加容易。现在,这将为您提供帮助,而编码为自动完成功能将为您提供帮助。只需键入布局名称,您将获得所有布局元素的列表,然后键入您将获得布局中所有要求的元素(例如textViews)列表的元素类型。

答案 1 :(得分:0)

从理论上讲您可以,但是强烈建议不要这样做。同一布局内的ID重复,因为它会阻止按ID查找视图(您将需要遍历子视图或以其他方式引用它们),并且在这些视图尝试存储/恢复其savedInstanceState时会导致冲突/彻底崩溃。 / p>