2013-03-13 1 views
13

Nella mia app, cambio il titolo in ActionBar da ciascun frammento visualizzato. Quando avvio le mie app per la prima volta, ho ricevuto un elenco di richieste, quindi il mio titolo è "Le mie richieste (20)".Perché Android sta troncando il mio titolo ActionBar?

Quindi, quando si fa clic su un elemento in tale elenco, viene sostituito un frammento nella mia attività e viene impostato su "Azione".

Quando torno alla prima vista (sempre nella stessa attività), reimpostare il titolo su "Le mie richieste (20)", ma Android decide di troncarlo. Quindi il risultato è "La mia richiesta ...".

Dopo molti test, sembra che Android riduca il mio titolo quando inserisco un testo più piccolo. Ma non lo allarga quando inserisco un testo più lungo, anche se c'è molto spazio.

Cosa posso fare per risolvere questo? Vorrei una soluzione migliore rispetto aggiungendo spazi alla fine dei miei brevi titoli :)

Ecco il codice che uso per cambiare il titolo del ActionBar:

getActivity().getActionBar().setTitle(title); 

risposta

2

Ho risolto questo problema utilizzando un titolo personalizzato come descritto in this post.

Questo è il codice che uso per cambiare il titolo quando una scheda cambia

((TextView) actionBar.getCustomView().findViewById(R.id.title)).setText(someTitle); 

Si noti che questa soluzione pone il titolo alla destra delle schede in modalità orizzontale quando si utilizza ActionBar schede.

+0

Grazie! Questa soluzione è semplice e pulita, mi piace! – NLemay

1

io non credo che ci sia molto che può fare su questo. Sembra che il titolo della barra delle azioni abbia una larghezza piuttosto limitata e qualsiasi cosa venga troncata.

Immagino che sarebbe un modo per visualizzare: "Le mie richieste (20)" piuttosto che "Le mie richieste (20)" ma apprezzo che non è l'ideale.

+1

Ciao! Grazie per la risposta! È molto apprezzato! Solo una domanda: è qualcosa che già già incontri? È un comportamento normale per ActionBar? O sto facendo qualcosa di sbagliato? – NLemay

+1

Ciao. Questo è qualcosa che ho già incontrato. Sono un esperto di qualità per un grande giornale globale e anche i nostri Devs Android hanno detto che è normale ... Quindi ho paura che non ci sia alcun modo attorno ... Tranne i miei suggerimenti o forse usando un'immagine. Sebbene il tuo requisito includa numeri interi in aumento che probabilmente non sarebbero sufficienti. –

+1

Bene, questa è anche la mia conclusione dopo diverse ore su questo problema. Questo è strano, perché a volte il titolo viene troncato, a volte non lo è. Ma non ho trovato un modo semplice per risolvere questo ... – NLemay

5

So che questa domanda è stata pubblicata molto tempo fa, ma di recente ho riscontrato questo problema e ha causato un gran mal di testa. Sto lavorando su un Galaxy Note 10.1 e il mio titolo era "BidItems" e avevo solo l'elemento overflow di azione visibile, ma a volte "BidItems" è diventato "BidIt ..." che è semplicemente ridicolo. Dopo molti test, ho scoperto che il motivo di questo comportamento di troncamento nella mia applicazione è che stavo chiamando un metodo usando il metodo ((MyActivity) getApplication()).setTitle(); da uno dei miei frammenti. Il metodo setTitle() nella mia attività chiama getActionBar().setTitle(). Non appena ho chiamato questo metodo, il mio titolo è stato troncato senza motivo. Ma semplicemente chiamando setTitle() dalla mia attività ha funzionato bene.

Spero davvero che questo salvi il mal di testa che mi ha causato.

+0

Grazie! Sembra una buona soluzione! – NLemay

+0

ciao, puoi spiegarlo più chiaramente per favore? – Poutrathor

+0

Continuo ad avere problemi con setTitle() pure. Provo a cambiare titolo dall'interfaccia framment visa ad Activity. Ma non può farlo senza modificare la lunghezza della visualizzazione, ed ecco la svolta: solo ottenere questo problema al primo avvio. Eseguo asynctask al primo avvio. Forse quello fa qualcosa. Nessuna idea. – Karl

1

Vorrei aggiungere che si può assolutamente utilizzare il titolo barra delle operazioni su 2 linee per ottenere più spazio:

//Set the title over 2 lines if needed: 
    int titleId = Resources.getSystem() 
      .getIdentifier("action_bar_title", "id", "android"); 
    if (titleId > 0) { 
     TextView title = (TextView) findViewById(titleId); 
     title.setSingleLine(false); 
     title.setMaxLines(2); 
     //   title.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); 
    } 

Io lo utilizzo relativa alla mia domanda e io sono felice con lui :)

Credito a questo post

1

tuo AndroidManifest.xml ha la vostra definizione di attività in questo modo

<activity 
     android:name="com.example.DetailsView" 
     android:label="Details"> 
</activity> 

Se si cambia android:label="Whatever" a android:label=" ",

Funzionerà. Presumo che ciò accada perché Android crea un TextView per visualizzare l'etichetta e la larghezza non viene ridimensionata quando viene chiamato setTitle. Quindi, impostando il titolo iniziale per avere più caratteri di quelli con cui si imposterà il titolo, non verrà troncato.

4

Immagino che questo problema venga risolto aggiornando l'interfaccia utente della barra delle azioni.

Quindi mi ero risolto con i codici seguenti.

ActionBar actionBar = getActivity().getActionBar(); 
actionBar.setTitle(title); 

// for refreshing UI 
actionBar.setDisplayHomeAsUpEnabled(false); 
actionBar.setDisplayHomeAsUpEnabled(true); 
+1

Dopo molte sofferenze, la tua soluzione era un buon vantaggio, ma non funzionava per me perché non sempre voglio mostrare (o nascondere) il pulsante Indietro. Ho trovato un modo più semplice per aggiornare l'interfaccia utente: 'actionBar.setDisplayShowTitleEnabled (true);' In questo caso ci sono più possibilità che vogliamo sempre mostrare il titolo :-) –

2

Nel mio caso il testo è stato troncato, ma non con i puntini di sospensione (...), l'ultimo carattere era sempre tagliata, in questo modo:

screenshot

ho scoperto che modificando la larghezza barra degli strumenti da "wrap_content", a "match_parent" risolve il problema:

<android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:layout_weight="1" 
     android:background="?attr/colorPrimary" 
     app:popupTheme="@style/AppTheme.PopupOverlay" /> 
2

messo setTitle() in onCreateOptionsMenu mi aiuta a solv e questo problema

Nel vostro frammento aggiungere setHasOptionsMenu(true); in onCreateView(){}

Poi ignorare onCreateOptionsMenu().

Esempio:

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    super.onCreateOptionsMenu(menu, inflater); 
    // put getActivity in onCreateOptionsMenu will not return null 
    if (getActivity() != null) { 
     getActivity().setTitle(getResources().getString(R.string.Studies)); 
    } 
} 

Riferimento: How to display android actionbar title without truncation occurring

3

Nel mio caso particolare, sto sviluppando un'applicazione ibrida con una complessa struttura di menu nativo. Vedrei questo problema a intermittenza quando chiamerò un deeplink dal contenuto ibrido che aggiornerebbe l'opzione di menu selezionata e imposterà il titolo.

Ho provato molte delle soluzioni suggerite con non fortuna. Ma l'impostazione di una visualizzazione personalizzata ha prodotto uno strano risultato che mi ha dato la sensazione di avere a che fare con una condizione di gara.

Ciò è dimostrato vero. Ho scoperto che semplicemente ignorando la funzione setTitle la propria attività e avvolgendo la chiamata a super in un postDelay eseguibile risolto questo per me:

@Override 
public void setTitle(final CharSequence title) { 
    toolBar.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      MainActivity.super.setTitle(title); 
     } 
    }, 200); 
} 

sto usando postDelayed della barra degli strumenti come un metodo comodo. Ma puoi sicuramente usare un gestore qui. Spero che questo ti aiuti.

1

Perché ListView/GridView/RecyclerView è chiamato notifyDataSetChanged() allo stesso tempo. Per qualche motivo, ciò causerebbe l'aggiornamento del layout, che presumo causerebbe il caos dell'aggiornamento del layout del titolo della barra delle azioni.

Fondamentalmente, è possibile postDelay() per aggiornare il titolo per risolvere questo problema, ma non mi piace in questo modo.

Decido di sovrascrivere BaseAdapter.notifyDateSetChanged() e aggiornare la visualizzazione degli elementi a mano. Funziona:

public abstract class BaseListAdapter<BEAN extends Unique, VH extends BaseListViewHolder<BEAN>> extends BaseAdapter { 
    // data 
    private List<BEAN> mList; 
    // view holder 
    private List<VH> mViewHolderList = new ArrayList<>(); 

    protected abstract void onBindViewHolder(VH holder, int position); 

    protected abstract VH onCreateViewHolder(ViewGroup parent, int viewType); 

    ... 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     VH viewHolder; 
     if (convertView == null) { 
      viewHolder = onCreateViewHolder(parent, getItemViewType(position)); 
      convertView = viewHolder.itemView; 
      convertView.setTag(viewHolder); 
      mViewHolderList.add(viewHolder); 
     } else { 
      //noinspection unchecked 
      viewHolder = (VH) convertView.getTag(); 
     } 

     viewHolder.setData(getItem(position)); 
     viewHolder.setPosition(position); 
     onBindViewHolder(viewHolder, position); 

     return convertView; 
    } 

    @Override 
    public void notifyDataSetChanged() { 
     if (mViewHolderList.size() == 0) { 
      super.notifyDataSetChanged(); 
     } else { 
      for (VH vh : mViewHolderList) { 
       onBindViewHolder(vh, vh.getPosition()); 
      } 
     } 
    } 

} 

public class BaseListViewHolder<T> { 
    public View itemView; 
    private T data; 

    private int position; 

    public BaseListViewHolder(View itemView) { 
     this.itemView = itemView; 
    } 

    @Override 
    public T getData() { 
     return data; 
    } 

    @Override 
    public void setData(T data) { 
     this.data = data; 
    } 

    public int getPosition() { 
     return position; 
    } 

    public void setPosition(int position) { 
     this.position = position; 
    } 
} 

Ci scusiamo per il mio pessimo inglese.