FindViewById returns 错误视图

FindViewById returns wrong view

我使用 ViewFlipper 通过动画在两个相同的视图之间切换。

这个ViewFlipper的xml如下

<ViewFlipper
    android:id="@+id/advise_viewflipper"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include android:id="@+id/product_select_one" layout="@layout/product_select_view" />
    <include android:id="@+id/product_select_two" layout="@layout/product_select_view" />
</ViewFlipper>

现在在我的片段中,我用 ButterKnife 检索了它们,并且获取它们的 ID 表明它们确实是两个不同的视图。

currentViewId = currentView.getId();
otherViewId = otherView.getId();
Log.d("Compare", currentView.getId() + " " + otherView.getId());

所以现在在这两个相同的视图中是一个 FlowLayout,id 为 advise_item_layout。但是,从 both 查询此视图会看到 return 相同的 FlowLayout.

如果我这样做:

final FlowLayout itemLayout = ButterKnife.findById(currentView, R.id.advise_item_layout);
final FlowLayout otherLayout = ButterKnife.findById(otherView, R.id.advise_item_layout);

Log.d("item vs other layout", itemLayout.getId() + " " + otherLayout.getId());

即使我通过不同的视图,也会打印相同的 ID? 使用 Android.

的 FindViewById 时也是如此

我知道 FindViewById 进行深度优先搜索并获取第一个匹配项,但我是否明确指定了要在其中搜索的不同视图?那么我做错了什么,解决方法是什么?

您将 getId() 返回的视图标识符误认为是视图引用标识。视图标识符不需要是唯一的,并且您的视图层次结构具有多个具有相同标识符的视图。观点还是不一样objects.

Log.d("Compare", currentView.getId() + " " + otherView.getId()); return different ids. So I am pretty sure they are different objects

是的,它们有不同的标识符,并且暗示它们是不同的 object。

However, Log.d("item vs other layout", itemLayout.getId() + " " + otherLayout.getId()); reports the SAME id, even though I pass different parents to the findById function

是的。两个视图可以具有相同的标识符。您可以使用 depth-first first-match 搜索找到它们,因为您是使用不同的 parent.

开始搜索的

如果您比较了 object 个参考文献

Log.d("item vs other layout", "" + itemLayout == otherLayout);

您会看到 false 被记录以实际验证它们是不同的视图 object。