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。
我使用 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 thefindById
function
是的。两个视图可以具有相同的标识符。您可以使用 depth-first first-match 搜索找到它们,因为您是使用不同的 parent.
开始搜索的如果您比较了 object 个参考文献
Log.d("item vs other layout", "" + itemLayout == otherLayout);
您会看到 false
被记录以实际验证它们是不同的视图 object。