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