Подтвердить что ты не робот

BringToFront не работает внутри макета координатора

Android Studio 2.0 Preview 4

Я использую для использования BringToFront, чтобы получить TextView для отображения перед другими элементами управления.

Doc bringToFront() говорит, что вам нужно позвонить requestlayout invalidate. Что я делаю, но не работает.

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

Я использую этот TextView внутри a android.support.design.widget.CoordinatorLayout

Однако следующий код действительно работает. Но поддерживает только API 21 и выше. Но мне нужно поддерживать API 16.

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

Или путем установки свойства атрибута xml android:translationZ("4dp"). Однако только для API 21

4b9b3361

Ответ 1

   /**
     * Change the view z order in the tree, so it 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 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();

и он будет работать, проверьте его.!

Ответ 2

До KITKAT этому методу должны следовать вызовы requestLayout() и invalidate() в родительском представлении, чтобы заставить родительский для перерисовки с новым упорядочением потомков.

Эти методы нужно вызвать в родительском представлении. Вы вызываете их на самом представлении.

Это должно работать.

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

Ответ 3

bringToFront() работайте для меня внутри android.support.design.widget.CoordinatorLayout. Моя среда:

  • Android Studio 1.5.1
  • Устройство: Motorola с 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();

введите описание изображения здесь