1

ここで問題が発生しRelativeLayoutViewSwitcherいます。誰かが助けてくれるかもしれません。だから私が望むのは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_toRightOfnew の属性になるためViewSwitcher、ID はカスタム ビューの属性のままですが、別のビュー スイッチャーの子であるビューに対してスイッチャーを配置しても機能しません。その理由はわかりません。スイッチャーにもその子と同じ ID を指定した場合にのみ、ポジショニングが機能します。

ここで何がうまくいかないのかについての指針はありますか?

4

1 に答える 1

1

私が正しいかどうかはわかりませんが、ビューを相互に相対的に配置する場合、ビューはビュー階層の同じレベルにある必要がありますか?

したがって、逆に参照を定義する必要があるかもしれません。ビュー1にはandroid:layout_toRLeftOf"@id/two属性があり、作成しViewSwitcherたら、子のレイアウトパラメータをコピーするだけです。

于 2012-05-03T09:39:33.803 に答える