ConstraintLayout Android: posiziona una vista sopra un'altra vista


106

Sto cercando di aggiungere un ProgressBarsopra a Button(entrambi sono all'interno di a 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"/>

Ma anche dopo aver chiamato bringToFrontsul ProgressBarin onCreate, è sempre soggiorni dietro la Button.

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

è così strano, ho provato a giocare un po 'con il tuo layout, anche invertendo la catena in modo che la barra di avanzamento sia vincolata al testo di modifica e il pulsante alla barra di avanzamento ma il pulsante sembra essere sempre in cima alla barra di avanzamento
lelloman

Sei in grado di utilizzare un FrameLayout? Provalo, sapendo che in FrameLayout, lo z-index è dato dall'ordine all'interno del layout (quindi Button 1st, Progress 2nd)
razgraf

dov'è la tua passwordEditText come ho controllato senza app: layout_constraintTop_toBottomOf = "@ + id / passwordEditText" posso vedere la barra di avanzamento in alto puoi fornire quella passwordEditText
Pavan

Risposte:


168

Impostare un'elevazione su ProgressBar; 2dpsembra funzionare.

android:elevation="2dp"

Puoi anche provare a impostare translationZcome suggerito nella risposta accettata a una domanda simile .

Ho anche trovato questa risposta come alternativa.


17
Ma elevatione translationZsono solo per API> = 21, che dire delle API meno recenti?
q126y

1
@ q126y Non credo che questo sia diventato un problema fino all'API 21, quindi le API meno recenti non dovrebbero averne bisogno. L'ho provato su un emulatore con API 17 e la barra di avanzamento è apparsa in alto come previsto.
Cheticamp

@Cheticamp quindi Come gestire questo? AS sta dando un avviso che funziona solo con il livello API 21 e superiore.
Ajay S

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

2
ViewCompat.setElavation(view, 20f)ti aiuta
sagus_helgy

9

Dobbiamo usare Android: Elevation per controllarlo.

android:elevation="10dp"

Questo attributo di elevazione funziona solo a livello API> = 21. Ma sotto si comporterà normalmente. Se aggiungiamo Avanzamento sotto la visualizzazione Pulsante, viene mostrata la visualizzazione che si trova in basso nella parte superiore dell'altra visualizzazione.


6

Nella maggior parte dei casi, puoi semplicemente definire la vista che desideri in alto dopo quella che dovrebbe apparire sotto di essa.


Come ti assicuri che l'xml possa accidentalmente essere riorganizzato
RamPrasadBismil

@ Cristan, è meglio fornire uno snippet di codice o un esempio. Grazie
blueware

1
Mi chiedo perché ProgressBarnon sia in cima Buttonanche se ProgressBarè definito dopo Buttonnella domanda.
Michael Osofsky

Ho pensato che anche questo fosse vero, ma non importa dove posiziono un'immagine vista nell'ordinamento del layout dei vincoli, appare sempre dietro un pulsante
behelit

1

Nel layout Constraint dovresti usare

traslationz

più in alto rispetto alla vista che desideri di seguito.


0

Risposta aggiornata per Android Sutdio 3.5:

Nell'editor di layout aggiornato è ora molto più semplice scegliere quale vista sarà davanti, come dimostrato nelle note di rilascio di Android Studio

.. Inoltre, una sovrapposizione blu ora evidenzia l'obiettivo del vincolo. Questa evidenziazione è particolarmente utile quando si tenta di vincolare un componente che si sovrappone a un altro.

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

Ancora più semplice, se trascini la vista verso l'alto (copia incolla o dall'albero dei componenti nell'editor di layout) avrà una priorità inferiore (quindi sarà dietro le altre viste)


0

Puoi avvolgerlo come sotto Usa framelayout come genitore e metti la barra di porogress fuori dal layout dei vincoli. Questo si sovrapporrà al pulsante

<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

Il pulsante per impostazione predefinita ha TranslationZ impostato, quindi hai due opzioni

1 - rendere la barra di avanzamento TranslationZ maggiore dell'elevazione del pulsante

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

2 - crea il pulsante TraduciZ su 0 in modo che le viste appaiano una sopra l'altra in ordine nel layout dei vincoli, puoi farlo impostando lo stile sul pulsante

style="@style/Widget.AppCompat.Button.Borderless"

0

Anche se android:elevation="4dp"o traslationzfunzionerà, ma per quel livello API dovrebbe almeno 21. Se per qualche motivo non puoi farlo, assicurati che la vista che vuoi in alto sia menzionata dopo le altre viste. Ad esempio, se voglio progressBar sopra ImageView:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   tools:context=".ImageActivity">

<ImageView
   android:id="@+id/image_view"
   android:layout_width="0dp"
   android:layout_height="0dp"
   app:layout_constraintBottom_toBottomOf="parent"
   app:layout_constraintDimensionRatio="6:4"
   app:layout_constraintEnd_toEndOf="parent"
   app:layout_constraintStart_toStartOf="parent"
   app:layout_constraintTop_toTopOf="parent" />

<ProgressBar
   android:id="@+id/progress_bar"
   style="?android:attr/progressBarStyle"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   app:layout_constraintBottom_toBottomOf="parent"
   app:layout_constraintEnd_toEndOf="parent"
   app:layout_constraintStart_toStartOf="parent"
   app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.