【问题标题】:Why does view.bringToFront() doesn't work?为什么 view.bringToFront() 不起作用?
【发布时间】:2011-12-08 15:27:15
【问题描述】:

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

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

findViewByTag 似乎有效,我已经在调试模式下检查过了。 我也试过了:

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

我还有其他事情要做吗?

编辑:抱歉,问题是 MapView 隐藏了控制栏,它应该在所有视图的顶部,因为调用了 bringToFront()。

【问题讨论】:

  • 有什么问题? MapView 不会消失?或者控件不在MapView之上?

标签: android android-layout


【解决方案1】:

您可以将RelativeLayout 包装在LinearLayout 中,并将控件放在LinearLayout 中。这样,无论您对 RelativeLayout 做什么,控件都可以正常工作。

【讨论】:

  • 这看起来很草率,但它是我尚未想出的唯一完美的解决方案。
【解决方案2】:

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

来自FrameLayout documentation

子视图在堆栈中绘制,最近添加的子视图在顶部。 FrameLayout 的大小是其最大子项(加上填充)的大小,可见与否(如果 FrameLayout 的父项允许)。仅当 setConsiderGoneChildrenWhenMeasuring() 设置为 true 时,才会使用 GONE 的视图来调整大小。

我希望这会有所帮助!如果您还有其他问题,请告诉我。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      你可以试试这个代码。似乎适用于新旧版本的 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();
      

      【讨论】:

        【解决方案5】:

        我使用bringtofront() 解决了这个问题。它是用于将孩子放在屏幕上的父项。有一个属性为.isEnabled = true 的按钮。将属性设置为false 后,view.child.bringtofront() 工作正常。

        【讨论】:

          猜你喜欢
          • 2016-02-26
          • 1970-01-01
          • 1970-01-01
          • 2013-03-07
          • 2019-08-06
          • 2016-07-05
          • 2011-08-06
          • 2013-01-18
          相关资源
          最近更新 更多