Perché Android tronca il mio titolo ActionBar?

Nella mia applicazione, cambio il titolo in ActionBar da each frammento visualizzato. Quando innanzitutto iniziano le mie applicazioni, ho un elenco di richieste, quindi il mio titolo è "Le mie richieste (20)".

Quindi, quando si fa clic su un elemento in quell'elenco, sostituisce un frammento nella mia Attività e imposta il titolo in "Azione".

  • Android - Commutare il button BackButton di ActionBar sul button di navigazione
  • Sax - ExpatParser $ ParseException
  • Android Studio: recupera le coordinate GPS della posizione del marcatore corrente in Google Maps
  • passando i dati dalla vista di elenco ad un'altra attività
  • Perché non possiamo utilizzare barre di sistema traslucenti con e ActionBar
  • Le perdite di memory bitmap
  • Quando tornerò alla prima visione (sempre nella stessa Attività), ripristo il titolo a "Le mie richieste (20)", ma Android decide di troncare. Quindi il risultato è "La mia richiesta …".

    Dopo tante prove, sembra che Android sta riducendo il mio titolo quando ho inserito un text più piccolo. Ma non lo allarga quando metto un text più lungo, anche se c'è abbondanza di spazio.

    Cosa posso fare per risolvere questo problema? Vorrei una soluzione migliore di aggiungere spazi alla fine dei miei brevi titoli 🙂

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

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

  • Differenza tra navigatore di navigazione Doc Android e navigationDrawerActivity
  • Ottieni gli angoli SW & NE dell'API di Google Static Maps
  • Cosa serve il cursor.setNotificationUri ()?
  • Problema dell'orientamento dell'image di Android con l'attività della camera personalizzata
  • Qual è il modo migliore per creare una connessione DB GreenDAO solo una volta per singola esecuzione di applicazione?
  • Icona di avvio dell'image di Android Studio Image Color di background dell'icona
  • 11 Solutions collect form web for “Perché Android tronca il mio titolo ActionBar?”

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

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

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

    Tieni presente che questa soluzione mette il titolo alla destra delle tabs in modalità orizzontale quando si utilizza le tabs della barra di azione.

    So che questa domanda è stata pubblicata molto tempo fa, ma recentemente ho incontrato questo problema e ha causato un inferno di mal di testa. Sto lavorando su una Galaxy Note 10.1 e il mio titolo era "BidItems" e ho solo visualizzato l'elemento di overflow dell'azione, ma a volte "BidItems" è diventato "BidIt …", che è semplicemente ridicolo. Dopo molte prove, ho scoperto che la causa di questo comportmento di troncamento nella mia applicazione è che stavo chiamando un metodo utilizzando ((MyActivity) getApplication()).setTitle(); metodo da uno dei miei frammenti. Il metodo setTitle() nella mia attività chiama getActionBar().setTitle() . Appena ho chiamato questo metodo, il mio titolo è stato troncato per nessun motivo. Ma chiamando semplicemente setTitle() dalla mia attività ha funzionato bene.

    Spero davvero che questo risparmia la gente la mal di testa che mi ha causato.

    Suppongo che questo problema venga risolto aggiornando la barra di azione UI.

    Così ho risolto con i codici sotto.

     ActionBar actionBar = getActivity().getActionBar(); actionBar.setTitle(title); // for refreshing UI actionBar.setDisplayHomeAsUpEnabled(false); actionBar.setDisplayHomeAsUpEnabled(true); 

    Nel mio caso particolare, sto sviluppando un'applicazione ibrida con una struttura di menu nativa complessa. Vorrei vedere questo problema in modo intermittente durante la chiamata di un collegamento profondo dal contenuto ibrido che aggiornerebbe l'opzione di menu selezionata e impostare il titolo.

    Ho provato diverse correzioni suggerite senza fortuna. Ma l'impostazione di una visualizzazione personalizzata ha prodotto un risultato strano che mi ha dato la sensazione di trattare con una condizione di gara.

    Questo si è rivelato vero. Ho scoperto che semplicemente superando la function setTitle dell'attività e avvolgendo la chiamata a super in un postdelay runnable fissato per me:

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

    Sto utilizzando la barra degli strumenti postDelayed come metodo di convenienza. Ma tu puoi certamente usare un gestore qui. Spero che questo ti aiuti.

    Nel mio caso il text era troncato, ma non con ellissi (…), l'ultimo carattere era sempre tagliato, così:

    immagine dello schermo

    Ho scoperto che la modifica della width della 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" /> 

    mettere setTitle() in onCreateOptionsMenu mi aiuta a risolvere questo problema.

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

    Poi sovrascrivere 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: come mostrare il titolo di azione della barra degli strumenti android senza troncamento

    Non credo che ci sia molto da fare per questo. Sembra che il titolo della barra d'azione ha una width abbastanza limitata e tutto ciò che viene troncato.

    Immagino che in un modo rotondo sarebbe stato quello di mostrare: "Le mie richieste (20)" piuttosto che "Le mie richieste (20)" ma apprezzo che non è ideale.

    Aggiungo che puoi utilizzare totalmente il titolo della barra delle azioni su 2 righe per get 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); } 

    Lo sto usando nella mia applicazione e sono contento di questo 🙂

    Credito a questo post

    Dovresti scoprire che la domanda che ho postato qui è il problema simile e ho anche inviato la soluzione.

    Perché il mio Android ActionBar non viene aggiornato quando viene modificato in modo esplicito

    Il tuo AndroidManifest.xml ha la definizione dell'attività così

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

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

    Funzionerà. Suppongo che questo accade perché Android crea un TextView per visualizzare l'etichetta e la width non viene ridimensionata quando viene chiamato setTitle. Quindi, impostando il titolo iniziale per avere più caratteri di quello che intendi impostare il titolo, non verrà troncato.

    Poiché ListView / GridView / RecyclerView viene chiamato notifyDataSetChanged () contemporaneamente. Per qualche motivo, questo potrebbe causare l'aggiornamento del layout, che suppongo di provocare il caos dell'aggiornamento del layout del titolo dell'area di azione.

    In sostanza, puoi postDelay () per aggiornare il titolo per risolvere questo problema, ma non mi piace questo modo.

    Decido di ignorare il BaseAdapter.notifyDateSetChanged () e aggiornare manualmente la visualizzazione degli elementi. 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; } } 

    Scusa per il mio cattivo inglese.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.