2015-07-20 29 views
8

Ho la seguente configurazione:Impostazione SupportActionBar sottotitolo multilinea

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:subtitleTextAppearance="@style/TitleTextStyle" 
     app:theme="@style/ActionBarStyle.Light"/> 

e

<style name="TitleTextStyle"> 
    <item name="android:maxLines">2</item> 
    <item name="android:textAllCaps">false</item> 
</style> 

e

getSupportActionBar().setSubtitle(targetString); 

il @textAllCaps viene applicato, ma @maxLines viene ignorato (ho provato anche ` @minLines).

Come abilitare il testo multilinea nei sottotitoli?

TIA

UPDATE:

ho aggiunto il codice nel onStart:

@Override 
public void onStart() { 
    super.onStart(); 
    try{ 
     Field field = Toolbar.class.getDeclaredField("mSubtitleTextView"); 
     field.setAccessible(true); 
     subtitleTextView = (TextView)field.get(toolbar); 
     subtitleTextView.setSingleLine(false); 
     subtitleTextView.setMaxLines(2); 
     subtitleTextView.setEllipsize(TruncateAt.END); 
    }catch(Exception e) { 
     Logg.e(this, "", e); 
    } 
} 

il problema è ora, che i valori ellipsize vengono applicati, ma setMaxLines() chiamata viene ignorata ...

UPD2:

setSingleLine(false) ha fatto il trucco.

risposta

3

Sfortunatamente, maxLines10 non è una parte di TextAppearance, pertanto la modifica non influirà sull'aspetto dei sottotitoli. Inoltre, non esiste il legale modo per accedere a Toolbar.mSubtitleTextView, ma dopo aver impostato un testo per i sottotitoli è possibile accedervi tramite riflessione e modificarne l'aspetto come si desidera.

UPDATE:

Ecco come è possibile accedere mSubtitleTextView attraverso la riflessione.

public class SubtitleAccessor { 
    private static final Field sSubtitleTextViewField = getSubtitleTextViewField(); 

    private static Field getSubtitleTextViewField() { 
     try { 
      Field field = Toolbar.class.getDeclaredField("mSubtitleTextView"); 
      field.setAccessible(true); 
      return field; 
     } catch (NoSuchFieldException exception) { 
      return null; 
     } 
    } 

    public static TextView getSubtitleTextView(Toolbar toolbar) { 
     if (sSubtitleTextViewField == null) { 
      return null; 
     } 

     try { 
      return (TextView) sSubtitleTextViewField.get(toolbar); 
     } catch (IllegalAccessException exception) { 
      return null; 
     } 
    } 
} 
+0

in realtà voglio impostare il testo solo a livello di programmazione, quindi riflessione o simili farebbero – injecteer

+0

in che modo posso accedere al 'textView' del sottotitolo tramite riflessione? quale sarebbe l'id di esso? – injecteer

+0

@injecteer Ho aggiunto un esempio di codice alla risposta. Non puoi trovare 'mSubtitleTextView' da id perché è stato creato in fase di runtime e non ha ID. Quindi, la cosa migliore che puoi fare oltre a ripensare la tua interfaccia utente, o scrivere la tua classe 'Toolbar', o usare una vista personalizzata invece del titolo e del sottotitolo è accedere direttamente ai campi privati ​​di' Toolbar' tramite riflessione. – Michael

0

Si prega di provare ad aggiungere:

<item name="android:singleLine">false</item> 

Se non funziona, si può tentare di utilizzare una visualizzazione personalizzata:

ActionBar actionBar = getActionBar(); 
actionBar.setDisplayShowCustomEnabled(true); 
actionBar.setCustomView(R.layout.your_layout_file); 

Dove R.layout.your_layout_file è il vostro layout personalizzato progettato nel modo desiderato esso.

+0

per quanto riguarda il supporto-ActionBar? – injecteer

+0

È lo stesso! – thiagolr

-1

Per utilizzare la barra degli strumenti e la AppCompat 21, è necessario utilizzare un ActionBarActivity ed impiego:

((ActionBarActivity) getActivity()).getSupportActionBar().setSubtitle("About");