【发布时间】:2018-12-22 20:22:13
【问题描述】:
TextView 和 ImageView 具有相同的 Id 是否正确? 由于它们属于一个实体,我给了他们两个相同的 ID。 如果是..那么我怎样才能通过 id 分别找到这些视图?
【问题讨论】:
-
如果他们在分开的活动中是的,你可以
标签: java android textview imageview
TextView 和 ImageView 具有相同的 Id 是否正确? 由于它们属于一个实体,我给了他们两个相同的 ID。 如果是..那么我怎样才能通过 id 分别找到这些视图?
【问题讨论】:
标签: java android textview imageview
TextView 和 ImageView 使用相同的 Id 是否正确?
简短回答:否
详细回答:不使用相同的 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,以便元素可以通过以下方式轻松识别像android:id="@+id/txtLocation"android:id="@+id/imgLocation"这样的ID,它可以很容易地通过读取ID来识别元素类型。您可以通过在开头附加布局名称(如android:id="@+id/profileTxtLocation")来使其更容易。现在,这将对您有所帮助,而自动完成功能将为您提供帮助。只需输入布局名称,您将获得所有布局元素的列表,然后您将输入您获得布局中所有询问元素(es:textViews)列表的元素类型。
【讨论】:
ListView / RecyclerView 中,您都有具有相同 ID 的孩子的项目 - 所以这是正常情况
理论上可以,但强烈建议不要这样做。在同一布局中重复 ID,因为它会阻止按 ID 查找视图(您将需要遍历子视图或以其他方式引用它们),并在这些视图尝试存储/恢复其 savedInstanceState 时导致冲突/彻底崩溃。
【讨论】:
activity/fragment 实例保存所怀疑,因此它们拥有什么 ID 并不重要。然而,“正常”内容视图将使用它们的 id 作为键来保存它们的状态(例如 EditText 存储当前输入,CheckBox 存储检查状态),因此复制它会导致冲突。
saveState 所以除非这些视图的父母禁用了保存状态,否则可能会导致问题