ここで問題が発生しRelativeLayout
てViewSwitcher
います。誰かが助けてくれるかもしれません。だから私が望むのはViewSwitcher
、を使用して2つのビューを切り替えることですが、スイッチャーが方程式の一部でさえあるという事実は、ユーザー/開発者から隠されるべきです。代わりに、切り替えられる 2 つのビューのいずれかのみを処理する必要があります。
これが機能するために、私が行っているのは、カスタム ウィジェットを提供することです。このウィジェットは、インフレ時にビュー ツリーから削除さViewSwitcher
れ、以前の位置に a を挿入し、ビュー スイッチャーの子として再挿入されます。その部分はうまく機能します。
これらのビューが 2 つある場合、それらを親に対して相対的に配置する (例: を使用layout_alignParentBottom
) は問題なく機能しますが、たとえば を使用して相互に相対的に配置しようとするとうまくいきませんlayout_toRightOf=id
。
ただし、切り替えられたビューの ID を ViewSwitcher (その新しい親) にコピーすると機能しますが、なぜそれが必要なのか理解できず、同じ ID を持つビューが複数ある場合、おそらくカエルや何かが降るでしょう。ビューツリーで?
明確にするためのコードを次に示します。
// 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
new の属性になるためViewSwitcher
、ID はカスタム ビューの属性のままですが、別のビュー スイッチャーの子であるビューに対してスイッチャーを配置しても機能しません。その理由はわかりません。スイッチャーにもその子と同じ ID を指定した場合にのみ、ポジショニングが機能します。
ここで何がうまくいかないのかについての指針はありますか?