Android ConstraintLayout-あるビューを別のビューの上に置く


105

の上にを追加しようとしProgressBarていますButton(どちらも内にありますConstraintLayout)。

<Button
    android:id="@+id/sign_in_button"
    android:layout_width="280dp"
    android:layout_height="75dp"
    android:layout_marginBottom="75dp"
    android:layout_marginTop="50dp"
    android:text="@string/sign_in"
    android:textColor="@color/white"
    android:textSize="22sp"
    android:textStyle="bold"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/passwordEditText"
    app:layout_constraintVertical_bias="0.0"/>

<ProgressBar
    android:id="@+id/progressBar"
    style="?android:attr/progressBarStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintTop_toTopOf="@+id/sign_in_button"
    android:layout_marginTop="8dp"
    app:layout_constraintBottom_toBottomOf="@+id/sign_in_button"
    android:layout_marginBottom="8dp"
    app:layout_constraintVertical_bias="0.5"
    android:layout_marginLeft="8dp"
    app:layout_constraintLeft_toLeftOf="@+id/sign_in_button"
    android:layout_marginRight="8dp"
    app:layout_constraintRight_toRightOf="@+id/sign_in_button"/>

しかしbringToFrontProgressBarinを呼び出した後でもonCreate、常にの後ろに残りますButton

ProgressBar progressBar = (ProgressBar)findViewById(R.id.progressBar);
progressBar.bringToFront();

これはとても奇妙です。レイアウトを少し変えてみました。チェーンを反転させて、進行状況バーが編集テキストと進行状況バーへのボタンに制約されるようにしましたが、ボタンは常に進行状況バーの上にあるようです
レロマン2017年

FrameLayoutを使用できますか?FrameLayoutでは、レイアウト内の順序によってZ-indexが指定されることを知って、試してみてください(Button 1st、Progress 2nd)
razgraf

app:layout_constraintTop_toBottomOf = "@ + id / passwordEditText"を使用せずに確認したときのpasswordEditTextはどこですか。進行状況バーが表示され、そのpasswordEditTextを提供できます
Pavan

回答:


167

に標高を設定しProgressBarます。2dp動作するようです。

android:elevation="2dp"

同様の質問translationZに対する承認済み回答で提案されている設定を試すこともできます。

私はまた、代替案としてこの答えに出くわしました。


17
しかしelevationtranslationZAPIが21以上の場合のみ、古いAPIはどうなりますか?
q126y 2017

1
@ q126yこれがAPI 21まで問題になるとは思わないので、古いAPIはこれを必要としないはずです。API 17を実行しているエミュレータで試してみましたが、期待どおりに進行状況バーが上部に表示されました。
Cheticamp 2017

@Cheticamp soこれをどのように処理するのですか?ASは警告を出し、APIレベル21以上でのみ機能します。
Ajay S

6
@ q126yViewCompat.setTranslationZ(view, 5)
Silvia H

2
ViewCompat.setElavation(view, 20f)お手伝いします
sagus_helgy

9

これを制御するには、android:elevationを使用する必要があります。

android:elevation="10dp"

この標高属性は、APIレベル21以上でのみ機能します。ただし、その下では、正常に動作します。ボタンビューの下にプログレスを追加すると、下にあるビューが他のビューの上部に表示されます。


6

ほとんどの場合、その下に表示されるはずのビューの後に、目的のビューを単純に定義できます。


XMLが誤って再配置されるのを確実にする方法
RamPrasadBismil

@Cristan、コードスニペットまたは例を提供することをお勧めします。ありがとう
ブルーウェア

1
質問の後で定義されていますがProgressBar、なぜ上にないのですか?ButtonProgressBarButton
Michael Osofsky

私は、これはあまりにも本当だと思ったが、私は、制約レイアウトの順序でImageViewのを配置に関係なく、それは常に、ボタンの後ろに表示されている
behelit

0

Android Sutdio 3.5の更新された回答:

更新されたレイアウトエディターでは、Android Studioリリースノートに示されているように、前面に表示するビューを選択するのがはるかに簡単になりました

..さらに、青いオーバーレイが制約のターゲットを強調表示します。この強調表示は、別のコンポーネントと重複するコンポーネントを拘束しようとするときに特に役立ちます。

https://developer.android.com/studio/releases

さらに簡単に、ビューを上にドラッグすると(コピーペーストまたはレイアウトエディターのコンポーネントツリーから)、優先度が低くなります(他のビューの背後に表示されます)



0

以下のようにラップできます。framelayoutを親として使用し、porosgressバーを制約レイアウトの外側に配置します。これはボタンを重ねます

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
 //your all view inside it with button
 <Button/>......
  .........
 </androidx.constraintlayout.widget.ConstraintLayout>

 <ProgressBar
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

</FrameLayout>

0

ボタンにはデフォルトでTranslationZが設定されているため、2つのオプションがあります

1-プログレスバーTranslationZをボタンの高さより大きくする

ViewCompat.setTranslationZ(progressBar, 5)// to support older api <21

2-ボタンをTranslateZを0にして、ビューがConstraint Layoutで順番に上に表示されるようにします。これを行うには、スタイルをボタンに設定します。

style="@style/Widget.AppCompat.Button.Borderless"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.