2015-06-15 3 views

risposta

3

@avvia, correggimi se sbaglio, vuoi avere il titolo centrato nella barra degli strumenti, quindi CollapsingToolbarLayout è compresso e il tuo layout è qualcosa del genere, giusto?

<android.support.design.widget.CollapsingToolbarLayout 
     android:id="@+id/collapsing_toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_scrollFlags="scroll|exitUntilCollapsed" 
     app:contentScrim="?attr/colorPrimary" 
     app:expandedTitleMarginStart="48dp" 
     app:expandedTitleMarginEnd="64dp" 
     android:fitsSystemWindows="true"> 

     <ImageView 
      android:id="@+id/image" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:scaleType="centerCrop" 
      android:fitsSystemWindows="true" 
      app:layout_collapseMode="parallax"/> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
      app:layout_collapseMode="pin" /> 

    </android.support.design.widget.CollapsingToolbarLayout> 

allora si può fare questo trucco (lo faccio in onCreate del Attività):

try { 
     Field declaredField = toolbar.getClass().getDeclaredField("mTitleTextView"); 
     declaredField.setAccessible(true); 
     TextView titleTextView = (TextView) declaredField.get(toolbar); 
     ViewGroup.LayoutParams layoutParams = titleTextView.getLayoutParams(); 
     layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT; 
     titleTextView.setLayoutParams(layoutParams); 
     titleTextView.setGravity(Gravity.CENTER_HORIZONTAL); 
    } catch (Exception e) { 
     //"Error!" 
    } 

La chiave è che TextView entro Toolbar ha proprietà width "Wrap Contenuto", quindi abbiamo bisogno di cambiarlo in "Abbina genitore". (Vedi di più su questa riflessione here)

Testato su Android 5.1.1 e Android 4.3 (dovrebbe funzionare praticamente ovunque)

+1

Mi capita di lavorare sullo stesso problema. Centrare un titolo personalizzato 'TextView' in una' Barra degli strumenti 'sembra che dovrebbe funzionare, ma per qualche ragione 'layout_gravity =" center "' non centra il testo in questo scenario. Il testo di 'TextView' viene invece allineato a destra. Potenzialmente un bug. – Ryan

+0

@Ryan ottima cattura, lo adoro! Risolto il problema con la mia risposta e testato su Android 5.1.1 e Android 4.3. Grazie per l'avviso! –

+0

la tua risposta aggiornata sembra funzionare correttamente, ma odio dover ricorrere all'utilizzo del reflection. Peccato che non ci sia un approccio più snello a questo problema. – Ryan

43

C'è un attributo expandedTitleGravity che è possibile utilizzare con il CollapsingToolbarLayout per centrare il titolo esteso testo. Aggiungi questo al vostro CollapsingToolbarLayout:

app:expandedTitleGravity="bottom|center_horizontal" 
+4

Risposta perfetta :) –

+0

risposta intelligente :) –

10

Nel mio caso d'uso, ho impostato app:titleEnabled su false, non avevo bisogno comunque. Successivamente, la mia gravità è stata rispettata correttamente all'interno del layout della barra degli strumenti.

+0

Volevo la mia barra degli strumenti personalizzata per mostrare il titolo al centro. impostando questa proprietà in CollapsingToolbarLayout mi ha aiutato con il mio requisito. Grazie mille. – Jigar

+0

buono e semplice. –

0

Come già detto Nguyễn Hoàng Anh, impostare app:titleEnabled su falso lavorato come un incantesimo.

Con questa opzione abilitata, dopo alcuni scavi con l'ispettore di layout, la vista senza nome sospetta viene sempre aggiunta davanti a TextView all'interno di Toolbar, subito dopo il pulsante "Su" (se abilitato).

Quindi, anche se la gravità del layout funziona correttamente, alcune viste sospette occupano tutti gli spazi aggiuntivi all'interno dello Toolbar.

1

Nel caso in cui si sta tentando di centrare il documento nella stato compresso è possibile utilizzare

android:paddingEnd="70dp" 
android:paddingRight="70dp" 

come questo:

<android.support.design.widget.CollapsingToolbarLayout 
      android:id="@+id/collapsing_toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:paddingEnd="70dp" 
      android:paddingRight="70dp" 
      app:collapsedTitleGravity="center_horizontal"   
      app:expandedTitleGravity="start" 
      app:layout_scrollFlags="scroll|exitUntilCollapsed"> 

      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize" 
       app:layout_collapseMode="pin"> 

      </android.support.v7.widget.Toolbar> 

     </android.support.design.widget.CollapsingToolbarLayout>