2015-07-20 11 views
8

Ich habe folgendes Setup:Einstellung SupportActionBar Untertitel mehrzeilige

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

und

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

und

getSupportActionBar().setSubtitle(targetString); 

die @textAllCaps angewendet wird, aber @maxLines wird ignoriert (ich habe auch versucht, ` @minLines).

Wie aktiviert man mehrzeiligen Text im Untertitel?

TIA

UPDATE:

ich den Code in das onStart hinzugefügt:

@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); 
    } 
} 

das Problem ist jetzt, dass die ellipsize Werte angewendet werden, aber setMaxLines() Anruf ignoriert ...

UPD2:

setSingleLine(false) hat den Trick gemacht.

Antwort

3

Leider ist maxLines kein Teil von TextAppearance, so dass die Untertitel nicht verändert werden. Außerdem gibt es keine legale Weise, auf Toolbar.mSubtitleTextView zuzugreifen, aber nach dem Setzen eines Untertiteltextes können Sie auf es durch Reflexion zurückgreifen und sein Aussehen ändern, wie Sie wünschen.

UPDATE:

Das ist, wie Sie mSubtitleTextView über Reflektion zugreifen können.

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

eigentlich möchte ich den text nur programmatisch setzen, also würde reflection oder alike – injecteer

+0

genau wie kann ich über die reflexion auf den textView des untertitels zugreifen? Was wäre die ID davon? – injecteer

+0

@injecteer Ich habe der Antwort ein Codebeispiel hinzugefügt. Sie können 'mSubtitleTextView' nicht nach ID suchen, da es zur Laufzeit erstellt wurde und keine ID hat. Das Beste, was Sie tun können, ist, Ihre Benutzeroberfläche zu überdenken oder Ihre eigene 'Toolbar'-Klasse zu schreiben oder eine benutzerdefinierte Ansicht anstelle von Titel und Untertitel zu verwenden, greift direkt auf die privaten Felder der' Toolbar' zu. – Michael

0

Bitte versuchen Sie hinzuzufügen:

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

Wenn es nicht funktioniert, können Sie versuchen, eine benutzerdefinierte Ansicht zu verwenden:

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

Wo R.layout.your_layout_file Ihre benutzerdefinierten Layout ist die Art und Weise entwickelt, die Sie wollen es.

+0

was Support-ActionBar? – injecteer

+0

Es ist das Gleiche! – thiagolr

-1

Um die Toolbar und die AppCompat 21 zu verwenden, haben Sie eine ActionBarActivity verwenden und verwenden:

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