【问题标题】:Can i have 2 different views with same id in android我可以在android中有2个具有相同ID的不同视图吗
【发布时间】:2018-12-22 20:22:13
【问题描述】:

TextView 和 ImageView 具有相同的 Id 是否正确? 由于它们属于一个实体,我给了他们两个相同的 ID。 如果是..那么我怎样才能通过 id 分别找到这些视图?

【问题讨论】:

标签: java android textview imageview


【解决方案1】:

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 的孩子的项目 - 所以这是正常情况
  • 让 2 个布局相同且 id 相同的孩子不是一个好主意。但是 2 个不同布局的孩子,或 2 个具有相同 id 的孙子是非常正常的。这可能会导致根上的 findViewById 出现问题,但不会在中间层上出现问题。
【解决方案2】:

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

【讨论】:

  • 这里隐藏的重要一点——你不应该在相同的布局中拥有相同的 id。在不同的布局中使用相同的 id(例如工具栏或其他东西)没有任何问题。
  • @Ridcully 实际上相同的布局/不同的布局没有区别,一旦出现在屏幕上,它们所在的布局就会丢失。处于同一个父视图中通常是不好的。作为同一个视图的孙子通常不是,并且在膨胀的表或列表/回收器视图中相当普遍。
  • @GabeSechan 由 list/recyclerview 适配器生成的视图不会被 activity/fragment 实例保存所怀疑,因此它们拥有什么 ID 并不重要。然而,“正常”内容视图将使用它们的 id 作为键来保存它们的状态(例如 EditText 存储当前输入,CheckBox 存储检查状态),因此复制它会导致冲突。
  • @Pawel 你认为你是如何在 Android 中制作表格(而不是列表)的?您多次膨胀相同的布局。这将重复相同的ID。在高级布局中使用类似的技术或类似的包含文件非常常见。这会导致多次出现相同的 id。
  • @GabeSechan 我不否认你永远不应该有重复,只是指出 ID 也用于存储 saveState 所以除非这些视图的父母禁用了保存状态,否则可能会导致问题
猜你喜欢
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 2012-05-27
  • 1970-01-01
  • 2011-12-30
  • 2016-03-15
  • 1970-01-01
相关资源
最近更新 更多