我在这里遇到RelativeLayout
和ViewSwitcher
的问题,也许有人可以提供帮助。所以我想要的是使用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时,定位才有效。
关于这里出了什么问题的任何指示?
答案 0 :(得分:1)
不确定我是否正确,但是当您将它们相对于彼此定位时,视图是否必须位于视图层次结构的同一级别?
所以也许你应该反过来定义你的引用:
查看一个具有android:layout_toRLeftOf"@id/two
属性,创建ViewSwitcher
后,您只需复制子项的布局参数。