2015-04-29 12 views
6

Sto impostando una visualizzazione personalizzata in una barra delle azioni. Riempie la larghezza della barra delle azioni quando si utilizza la barra delle azioni dell'SDK, ma non quando si utilizza la versione app. Perché il layout lineare non riempie la larghezza quando si utilizza appcompat e barra degli strumenti? E cosa posso fare a riguardo?Perché la mia barra delle azioni personalizzata non visualizza "confronta padre" quando si utilizza appcompat e barra degli strumenti?

Ecco quello che sembra pre-appcompat:

enter image description here

Ed ecco quello che sembra con appcompat. (Il colore rosso indica l'entità del mio punto di vista personalizzato.):

enter image description here

Edit: Ecco come appare utilizzando @ esplicito punta il layout params di Seidan. (Da testo nero dove dovrebbe essere bianco):

enter image description here

Ecco il mio layout personalizzato:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="horizontal" 
    android:background="#800" 
    > 

    <FrameLayout 
     android:id="@+id/actionbar_discard" 
     style="?attr/actionButtonStyle" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="1" 
     > 

     <TextView 
      style="?android:actionBarTabTextStyle" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:drawableLeft="@drawable/ic_close_white_24dp" 
      android:drawablePadding="8dp" 
      android:gravity="center_vertical" 
      android:paddingRight="20dp" 
      android:text="@string/actionbar_cancel" /> 
    </FrameLayout> 

    <FrameLayout 
     android:id="@+id/actionbar_done" 
     style="?attr/actionButtonStyle" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" 
     android:layout_weight="1" > 

     <TextView 
      style="?android:actionBarTabTextStyle" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:drawableLeft="@drawable/ic_check_white_24dp" 
      android:drawablePadding="8dp" 
      android:gravity="center_vertical" 
      android:paddingRight="20dp" 
      android:text="@string/actionbar_done" /> 
    </FrameLayout> 
</LinearLayout> 

Ed ecco come sto impostando la barra delle azioni:

ActionBar ab = getSupportActionBar(); 
ab.setDisplayHomeAsUpEnabled(false); 
ab.setDisplayOptions(
     ActionBar.DISPLAY_SHOW_CUSTOM, 
     ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE); 
ab.setCustomView(R.layout.actionbar_discard_done); 

Sia appcompat-v7: 22.0.0 che il nuovo appcompat-v7: 22.1.0 presentano questo problema.

+0

hai controllare questa risposta http://stackoverflow.com/a/16652485/1880784 ?. – Seidan

+0

Hmm. Che funzioni! Ma ora il mio testo è in stile sbagliato. (Devo gonfiare la mia vista personalizzata ora piuttosto che passare l'ID. Suppongo che qualche contesto o tema non sia impostato correttamente.) –

risposta

8

Grazie a @Seidan per il tuo commento. Mi ha portato a una soluzione. Il problema di stile era dovuto al fatto che l'inflater stava usando il tema sbagliato quando gli ho dato il numero della mia attività.

In sintesi, al posto di questa linea dal mio codice in questione ...

ab.setCustomView(R.layout.actionbar_discard_done); 

... ho ...

View v = LayoutInflater 
     .from(ab.getThemedContext()) 
     .inflate(R.layout.actionbar_discard_done, null); 
ActionBar.LayoutParams params = new ActionBar.LayoutParams(
     ActionBar.LayoutParams.MATCH_PARENT, 
     ActionBar.LayoutParams.MATCH_PARENT); 
ab.setCustomView(v, params); 

che mi dà ...

correct action bar

È un mistero il motivo per cui dobbiamo specificare match_parent nel layout e nel codice, ma Ci posso convivere.

+0

non funziona nel mio caso –

+0

grazie, grazie, grazie. Ho appena trascorso ore su questo problema e poi ho trovato la tua domanda :) – velis

1

In onCreate

RelativeLayout relativeLayout_custombar = (RelativeLayout)findViewById(R.id.relativeLayout_custombar); 

Display display = getWindowManager().getDefaultDisplay(); 
int x_size = display.getWidth(); 


LayoutInflater mInflater = LayoutInflater.from(this); 
View mCustomView = mInflater.inflate(R.layout.your_customview, null); 


getSupportActionBar().setCustomView(mCustomView); 
getSupportActionBar().setDisplayShowCustomEnabled(true); 


Toolbar parent = (Toolbar) mCustomView.getParent(); 
parent.setContentInsetsAbsolute(0, 0); 


parent.findViewById(R.id.relativeLayout_custombar).getLayoutParams().width = x_size; 
Problemi correlati