为什么view.bringToFront()不起作用?

时间:2011-12-08 15:27:16

标签: android android-layout

我有一个RelativeLayout,我在顶部有控件。在运行时,我想显示一个MapView,它刚刚添加到Layout中,隐藏了它下面的所有其他视图,但不是顶部的控件。 稍后MapView再次隐藏。

layout_main.bringChildToFront(layout_main.findViewWithTag("paramsUI"));
layout_main.invalidate();

findViewByTag似乎工作,我已经在调试模式下检查过。 我也尝试过:

layout_main.findViewWithTag("paramsUI").bringToFront();

我还有别的什么要做吗?

编辑:对不起,问题是,由于bringToFront()调用,MapView隐藏了控制栏,控制栏应位于所有视图的顶部。

4 个答案:

答案 0 :(得分:0)

您可以将RelativeLayout包装在LinearLayout中,并将控件放在LinearLayout中。这样,无论你对RelativeLayout做什么,控件都没问题。

答案 1 :(得分:0)

您可能需要考虑使用FrameLayout而不是RelativeLayoutRelativeLayout更适用于部分视图,而FrameLayout则针对全屏应用进行了优化。这样,您就可以控制项目的绘制位置。

来自FrameLayout documentation

  

子视图以堆栈形式绘制,最近添加的子项位于顶部。 FrameLayout的大小是其最大子项(加上填充)的大小,可见或不可见(如果FrameLayout的父级允许)。仅当setConsiderGoneChildrenWhenMeasuring()设置为true时,GONE视图才会用于调整大小。

我希望这有帮助!如果您有更多问题,请与我们联系。

答案 2 :(得分:0)

对于Android 4.x,您需要在两次调用之间调用requestLayout():

layout_main.bringChildToFront(layout_main.findViewWithTag("paramsUI"));
layout_main.requestLayout();
layout_main.invalidate();

答案 3 :(得分:0)

您可以尝试使用此代码。似乎适用于Android的新旧版本

if (android.os.Build.VERSION.SDK_INT >= 21) //Lollipop
{
    view.setZ(5);

    for (int i = 0; i < view.getParent().getChildCount(); i++)
    {
        if(view != view.getParent().getChildAt(i))
        {
            view.getParent().getChildAt(i).setZ(4);
        }
    }
}

view.bringToFront();
for (int i = 0; i < view.getParent().getChildCount(); i++)
{
    view.getParent().getChildAt(i).invalidate();
}
view.getParent().requestLayout();
view.getParent().invalidate();