2016-06-26 6 views
1

Я использую ViewFlipper, чтобы чередовать два одинаковых вида с анимацией.FindViewById возвращает неверный вид

xml этого ViewFlipper выглядит следующим образом.

<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> 

Теперь в моем фрагменте я получить оба из них с ножом для масла и кокетливые их идентификаторы показывают, что они действительно две разных точки зрения.

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

Так что теперь внутри этих двух идентичных зрения является FlowLayout с идентификатором advise_item_layout. Однако, запрашивая этот вид от , оба изображения возвращают те же 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()); 

Те же идентификаторы печатаются, даже если я прохожу другую точку зрения? То же самое можно использовать при использовании FindViewById для Android.

Я знаю, что FindViewById выполняет поиск по глубине и захватывает первое совпадение, но я четко указываю другое представление для поиска в? Итак, что я делаю неправильно и что будет исправить?

+0

Вы сравниваете идентификаторы вида, и они одинаковы. Сами мнения могут быть разными. Проверьте саму ссылку, например. 'itemLayout == otherLayout' – laalto

+0

Нет, у родителей FlowLayout есть разные идентификаторы. Поэтому я предполагаю, что они разные объекты в памяти. – Gooey

+0

В любом случае идентификаторы, возвращаемые 'getId()', не обязательно должны быть уникальными, а в вашем случае они не являются. Вы не можете использовать идентификатор идентификатора ссылки. – laalto

ответ

1

Вы ошибочно считаете идентификатор вида, возвращенный getId() с идентификационным номером ссылки. Идентификаторы просмотра не обязательно должны быть уникальными, и ваша иерархия представлений имеет более одного представления с тем же идентификатором. Представления все еще разные объекты.

Log.d("Compare", currentView.getId() + " " + otherView.getId()); возврат различных идентификаторов. Поэтому я уверен, что это разные объекты.

Да, у них есть разные идентификаторы, а также импликация - это разные объекты.

Однако Log.d("item vs other layout", itemLayout.getId() + " " + otherLayout.getId()); сообщает тот же идентификатор, даже если я прохожу разные родители к findById функции

Да. Два представления могут иметь один и тот же идентификатор. Вы можете найти их с поиском первого поиска по глубине, так как вы начинаете поиск с другого родителя.

Если сравнить объект ссылается

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

вы увидите false после входа на самом деле проверить, что они отличаются объектом зрения.

+0

О да, я понимаю. Тогда есть ли способ заставить два вида иметь разные идентификаторы? Это необходимо для, например, транзакция фрагмента, для которой требуется уникальный идентификатор. – Gooey

Смежные вопросы