2015-07-20 32 views
8

Mam następującą konfigurację:Ustawianie SupportActionBar napisów multilinii

<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"/> 

i

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

i

getSupportActionBar().setSubtitle(targetString); 

@textAllCaps jest stosowany, ale @maxLines jest ignorowany (próbowałem też ` @minLines).

Jak włączyć tekst wielowierszowy w podtytule?

TIA

UPDATE:

I dodaje kod do 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); 
    } 
} 

problem jest teraz, że wartości ellipsize są stosowane, ale setMaxLines() wezwanie jest ignorowany ...

UPD2:

setSingleLine(false) załatwił sprawę.

Odpowiedz

3

Niestety, maxLines nie jest częścią TextAppearance, więc zmiana nie wpłynie na wygląd podtytułu. Co więcej, nie ma możliwości uzyskania dostępu do Toolbar.mSubtitleTextView, ale po ustawieniu tekstu napisów można uzyskać do niego dostęp za pomocą odbicia i zmienić jego wygląd, jak chcesz.

UPDATE:

W ten sposób można uzyskać dostęp mSubtitleTextView poprzez odbicie.

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

w rzeczywistości chcę ustawić tekst tylko programowo, więc odbicie lub podobny zrobiłby – injecteer

+0

jak dokładnie mogę uzyskać dostęp do "textView" napisów przez odbicie? jaki byłby jego identyfikator? – injecteer

+0

@ Injecteer Dodałem próbkę kodu do odpowiedzi. Nie można znaleźć 'mSubtitleTextView' według id, ponieważ jest on tworzony w czasie wykonywania, a nie ma i id. Najlepszą rzeczą, którą możesz zrobić, oprócz ponownego przemyślenia interfejsu użytkownika lub napisania własnej klasy "paska narzędzi" lub użycia niestandardowego widoku zamiast tytułu i podtytułu, jest dostęp do prywatnych pól 'Toolbar'ów bezpośrednio przez odbicie. – Michael

0

Spróbuj dodać:

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

Jeśli to nie działa, można spróbować użyć niestandardowego widoku:

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

Gdzie R.layout.your_layout_file jest Twój układ zaprojektowane specjalnie tak, jak chcesz to.

+0

co o poparciu-actionbar? – injecteer

+0

To jest to samo! – thiagolr

-1

Aby korzystać z paska narzędzi i AppCompat 21, trzeba użyć ActionBarActivity i użyć:

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