Kotlin合成ID碰撞bug

时间:2019-01-23 13:37:48

标签: android kotlin

我有片段和带有Points的片段RecyclerView以及带有PointsDetail的静态视图。

enter image description here

Adaper监听器:

      holder.container.setOnClickListener {
            adapterListener.onItemClick(tmsLightPoint)
      }

      interface OnClickListener {
            fun onItemClick(place: TmsLightPlace)
      }

项目列表xml元素(列表xml):

 <TextView
        android:id="@+id/addressTv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        tools:text="Wrocław (ul. Testowa 44, 00-007 Polska)" />

但是在详细信息视图上,我从这一点开始显示地址,所以我又有了(静态详细信息视图xml):

<TextView
            android:id="@+id/addressTv"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:gravity="center"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/nameTv"
            tools:text="Wrocław (ul. Testowa 44, 00-007 Polska)" />

点击列表项后:

 override fun onItemClick(place: TmsLightPlace) {
        LogMgr.v(TAG, "onItemClick() $place")
        addressTv?.text = place.address
 }

地址正在更改,但不在我的详细信息视图中,而是在列表地址的第一项中。

在片段中,我只有一个合成导入:

import kotlinx.android.synthetic.main.fragment_points.*

是BUG还是FEATURE? :)

1 个答案:

答案 0 :(得分:2)

该行为是预期的。如果您调用view.findViewById(R.id.addressTv)(合成属性在后台执行),也会发生相同的情况,因为它首先深度优先于视图层次结构,并且由于RecyclerView首先出现,因此找到具有此ID的第一项是列表项。

您有两种可能性

更改其中一个视图的ID

指定与片段本身不同的父对象以查找视图,例如detailsLayout.addressTv?.text = place.address。为此,您需要以下导入:

import kotlinx.android.synthetic.main.fragment_points.*
import kotlinx.android.synthetic.main.fragment_points.view.*

在这种情况下,视图不会被缓存,因此对性能的影响最小。