【问题标题】:BringToFront doesn't work inside a coordinator layoutBringToFront 在协调器布局中不起作用
【发布时间】:2015-12-26 08:04:42
【问题描述】:
Android Studio 2.0 Preview 4

我使用BringToFront 来获取TextView 以显示在其他控件的前面。

医生的bringToFront() 说你必须打电话给requestlayout invalidate。我这样做了,但不起作用。

tvLevel.bringToFront();
tvLevel.requestLayout();
tvLevel.invalidate();

我在android.support.design.widget.CoordinatorLayout 中使用这个TextView

但是,以下代码确实有效。但只支持 API 21 及以上。但我需要支持 API 16。

  if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
      tvLevel.setTranslationZ(4);
      tvLevel.invalidate();
  }

或者通过设置xml 属性属性android:translationZ("4dp") 起作用。但是,仅适用于 API 21

【问题讨论】:

    标签: android bringtofront


    【解决方案1】:
       /**
         * Change the view's z order in the tree, so it's on top of other sibling
         * views. This ordering change may affect layout, if the parent container
         * uses an order-dependent layout scheme (e.g., LinearLayout). Prior
         * to {@link android.os.Build.VERSION_CODES#KITKAT} this
         * method should be followed by calls to {@link #requestLayout()} and
         * {@link View#invalidate()} on the view's parent to force the parent to redraw
         * with the new child ordering.
         *
         * @see ViewGroup#bringChildToFront(View)
         */
        public void bringToFront() {
            if (mParent != null) {
                mParent.bringChildToFront(this);
            }
        }
    

    根据这个你可能会漏掉这一行:

    ((View)myView.getParent()).requestLayout();
    

    它会起作用的,检查一下。!

    【讨论】:

    • 与我相反,适用于android 4.4-但不适用于5.0+,只需调用bringToFront()+requestLayout()+invalidate()...
    【解决方案2】:

    bringToFront()android.support.design.widget.CoordinatorLayout 内为我工作。我的环境:

    • Android Studio 1.5.1
    • 设备:搭载 Android 4.1.2 (API 16) 的摩托罗拉

    activity_main.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/main_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">
    
        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            android:textStyle="bold"
            android:textSize="20sp"/>
    
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_launcher"/>
    
    </android.support.design.widget.CoordinatorLayout>
    

    MainActivity.java:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        TextView textView = (TextView) findViewById(R.id.textView);
        textView.bringToFront();
    }
    

    以下是截图:

    textView.bringToFront();

    没有textView.bringToFront();

    【讨论】:

      【解决方案3】:

      在 KITKAT 之前,此方法之后应调用 requestLayout() 和 invalidate() 在视图的父级上强制 父级以新的子级排序重绘。

      这些方法必须在视图的父级上调用。您是在视图本身上调用它们。

      这应该可行。

      tvLevel.bringToFront();
      tvLevel.getParent().requestLayout();
      tvLevel.getParent().invalidate();
      

      【讨论】:

        猜你喜欢
        • 2015-08-14
        • 2019-01-31
        • 2017-05-05
        • 1970-01-01
        • 1970-01-01
        • 2017-07-29
        • 1970-01-01
        • 2017-04-18
        • 2019-11-06
        相关资源
        最近更新 更多