2014-11-25 10 views
6

Sto migrando alla nuova funzione Barra degli strumenti in appcompat v21 dalla precedente barra delle azioni. Voglio comunque mantenere il logo nella parte in alto a sinistra della barra delle azioni (barra degli strumenti). Per fare ho aggiunto nel mio layout la barra degli strumenti di supporto e ne ho creato un nuovo thene.AppCompat v21 Barra degli strumenti che modifica la dimensione del logo

app:theme="@style/NewToolBarStyle" 

Aggiungo il registro a livello di codice poiché è presente una logica nell'app per questo.

  actionBar.setLogo(R.drawable.myicon); 

riferimento al mio nuovo stile (vuoto per il momento):

<style name="NewToolBarStyle" parent="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 
</style> 

Tuttavia il risultato sta mostrando un'immagine il è troppo grande per quello che sto cercando, e mi chiedo come ridurre la dimensione dell'icona.

Esiste un modo (stile, layout o programmazione) per ridurre le dimensioni del logo?

risposta

5

In seguito alla suggestiong dare da @brightstar vorrei sviluppare ulteriormente la risposta.

Il modo migliore per controllare la dimensione e la posizione del logo nella nuova barra degli strumenti è in realtà non utilizzarlo. Il concetto è completamente diverso, quello che devi fare è creare una barra degli strumenti da zero. Quindi devi prendere una decisione, o usi il layout dato da actionBar o includi tutto ciò che è nuovo incluso il titolo.

Se smetti di usare il logo ma continui a utilizzare il titolo, vedrai finalmente che il logo si trova sopra la creazione del titolo e la situazione ideale.

Così, un esempio di che cosa fare è la seguente:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 
<android.support.v7.widget.Toolbar 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/my_toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@drawable/action_bar_background" 
     app:theme="@style/NewToolBarStyle" 
     android:minHeight="?attr/actionBarSize" /> 
<RelativeLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <TextView 
     android:id="@+id/text_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerVertical="true" 
     android:layout_marginLeft="17dp" 
     android:textSize="20sp" 
     android:layout_toRightOf="@+id/logo_image" 
     android:text="@string/app_name" 
     android:textColor="@color/white" /> 

    <ImageView 
     android:id="@+id/logo_image" 
     android:layout_width="45dp" 
     android:layout_height="45dp" 
     android:layout_alignParentLeft="true" 
     android:layout_centerVertical="true" 
     android:scaleType="centerInside" /> 

</RelativeLayout> 
</FrameLayout> 

si crea questo file come my_toolbar.xml.Notare i seguenti dettagli:

  • Non ho incluso un src del mio ImageView perché lo sto cambiando dinamicamente. Ma funziona aggiungendolo.
  • Ho utilizzato un layout relativo per poter centrare l'icona e il testo.
  • Ho ancora bisogno di includere il pulsante Home.

In seguito, come descritto da @brightstar, è necessario includere nella parte superiore dei propri layout per inclusione, tuttavia .... ricordarsi di aggiungere un ID in modo che sia possibile referenziare tutte le altre visualizzazioni su di esso.

<include layout="@layout/toolbar_sharemup" 
    android:id="@+id/including" /> 
+0

Qual è lo scopo del tuo FrameLayout esterno? Nella tua barra degli strumenti di layout dovrebbe essere sufficiente. Inoltre, l'id in include è necessario solo se desideri sovrascrivere l'id dell'elemento che stai includendo. L'unica volta che è veramente necessario è quando lo si utilizza in un layout relativo e si desidera posizionare altri elementi relativi all'elemento incluso; In tal caso, assicurati che sia l'ID di inclusione sia la corrispondenza dell'ID dell'articolo incluso. –

+0

Il mio include sta avendo un ID in modo da poter posizionare altri oggetti relativamente. Ho incluso il FrameLayout perché non ero in grado di includere sia il layout relativo che la barra degli strumenti nello stesso layout. Hai un'altra proposta? –

7

Non c'è un'icona logo nel design del materiale: http://www.google.com/design/spec/layout/structure.html#, quindi suppongo che questo non sia ben testato scenerio - o semplicemente (rotto) dal design. Puoi aggiungere ImageView come widget figlio della tua barra degli strumenti e utilizzarlo per mostrare qualsiasi immagine. Verrà visualizzato a destra di tutti gli altri widget interni, ad esempio lo spinner, ma anche la modalità elenco di navigazione è deprecata.

Se si insiste per avere il logo, la mia soluzione per questo è di assicurarsi che la barra degli strumenti sia di altezza fissa - questo si occupa dell'altezza dell'icona sbagliata. Anche dopo dovrai impostare setAdjustViewBounds su true sulle barre degli strumenti con il logo interno ImageView, altrimenti creerà un grande riempimento sinistro e destro.

Ecco come il mio toolbar somiglia (altezza impostata attr/actionBarSize?):

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/toolbar" 
    android:layout_height="?attr/actionBarSize" 
    android:layout_width="match_parent" 
    android:minHeight="?attr/actionBarSize" 
    android:background="?attr/colorPrimary" 
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"> 
</android.support.v7.widget.Toolbar> 

riferimento all'interno il layout di attività utilizzando:

<include layout="@layout/toolbar_actionbar"/> 

non cambiano layout_height in include.

Il secondo passo è quello di setAdjustViewBounds (veri) sul logo icona:

Drawable logo = getDrawable(iconRes); 
    toolbar.setLogo(logo); 
    for (int i = 0; i < toolbar.getChildCount(); i++) { 
     View child = toolbar.getChildAt(i); 
     if (child != null) 
     if (child.getClass() == ImageView.class) { 
      ImageView iv2 = (ImageView) child; 
      if (iv2.getDrawable() == logo) { 
      iv2.setAdjustViewBounds(true); 
      } 
     } 
    } 
+0

Grazie per il consiglio. Quello che voglio fare è solo modificare le dimensioni del logo mantenendo costante la barra delle azioni (rendendo il logo più piccolo rispetto alla barra delle azioni). Quindi, seguendo la tua idea, ho preso iv2 (la mia visione d'immagine del logo) e ho provato a modificare i parametri del logo e lo ho schiacciato. Sai se posso farlo? –

+0

@TrebiaProject. se si verificano arresti anomali, esaminare logcat/exceptions, ma questo è il modo di hackerare, perché non si aggiunge ImageView come widget figlio della barra degli strumenti? – marcinj

+0

Ok ... non sapevo che fosse possibile. Ma ciò implicherà anche il cambio del titolo in una textview. Che cos'è il pulsante Home, sai come posso ottenere la dimensione di esso in modo che l'immagine che presento non si sovrapponga a esso? –

Problemi correlati