在ViewSwitcher中使用视图的相对定位

时间:2012-05-03 09:17:48

标签: android android-layout relativelayout viewswitcher

我在这里遇到RelativeLayoutViewSwitcher的问题,也许有人可以提供帮助。所以我想要的是使用ViewSwitcher切换两个视图,但是,切换器甚至是等式的一部分应该对用户/开发人员隐藏;相反,他们应该只处理正在切换的两个视图中的任何一个。

为了实现这一点,我正在做的是提供一个自定义小部件,在通胀后,将自己从视图树中移除,在其先前位置插入ViewSwitcher,然后将其自身重新插入为子节点视图切换器。那部分工作正常。

如果现在我有两个这样的视图,相对于父视图定位它们(​​例如使用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成为新ViewSwitcher的属性,而ID仍然是自定义视图的属性,因此将切换器相对于另一个视图切换器的子视图对齐不起作用,我不明白为什么。只有当我也给切换台提供与其子项相同的ID时,定位才有效。

关于这里出了什么问题的任何指示?

1 个答案:

答案 0 :(得分:1)

不确定我是否正确,但是当您将它们相对于彼此定位时,视图是否必须位于视图层次结构的同一级别?

所以也许你应该反过来定义你的引用: 查看一个具有android:layout_toRLeftOf"@id/two属性,创建ViewSwitcher后,您只需复制子项的布局参数。