У меня возникла проблема с RelativeLayout
и ViewSwitcher
здесь, и, возможно, кто-то сможет помочь. Итак, я хочу переключить два представления с помощью ViewSwitcher
, однако тот факт, что переключатель является частью уравнения, должен быть скрыт от пользователя/разработчика; вместо этого они должны иметь дело только с одним из двух переключаемых представлений.
Чтобы это работало, я предоставляю настраиваемый виджет, который при раздувании удаляет себя из дерева представлений, вставляет ViewSwitcher
в свою предыдущую позицию, а затем повторно вставляет себя в качестве дочернего элемента переключателя представлений. Эта часть работает нормально.
Если теперь у меня есть два таких представления, позиционирование их относительно родителя (например, с использованием layout_alignParentBottom
) работает просто отлично, но не тогда, когда я пытаюсь расположить их относительно друг друга, используя, например, layout_toRightOf=id
.
Однако это работает, когда я копирую идентификатор переключаемого представления в ViewSwitcher (его новый родитель), но я не понимаю, почему это необходимо, и, вероятно, будет дождь из лягушек или что-то в этом роде при наличии более одного представления с одним и тем же идентификатором. в дереве просмотра?
Вот код для пояснения:
// onLayout of the custom view that automatically inserts itself under a ViewSwitcher
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if (!(getParent() instanceof ViewSwitcher)) {
// uncommenting this line fixes the issue,
// but I don't want duplicate IDs!
//switcher.setId(getId());
// "migrate" this view's LPs to the new parent
switcher.setLayoutParams(getLayoutParams());
ViewGroup parent = (ViewGroup) this.getParent();
System.out.println("PARENT: " + parent);
int selfIndex = parent.indexOfChild(this);
parent.removeView(this);
parent.addView(switcher, selfIndex);
ViewSwitcher.LayoutParams newParams = new ViewSwitcher.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
switcher.addView(this, newParams);
}
}
Затем в XML-файле макета пользователю просто нужно раздуть это пользовательское представление:
<com.myview.CustomView android:id="@+id/one" ... />
<!-- this works: -->
<com.myview.CustomView android:layout_alignParentTop="true" ... />
<!-- this doesn't without the ID hack: -->
<com.myview.CustomView android:layout_toRightOf="@id/one" ... />
другими словами, поскольку layout_toRightOf
становится атрибутом нового ViewSwitcher
, а идентификатор остается атрибутом пользовательского представления, выравнивание переключателя относительно представления, являющегося дочерним элементом другого переключателя представлений, не работает, и я понятия не имею, почему. Только если я также дам коммутатору тот же идентификатор, что и его дочерний элемент, тогда позиционирование будет работать.
Любые указатели на то, что здесь происходит не так?