2015-07-20 33 views
8

我有以下设置:设置SupportActionBar字幕多

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

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

getSupportActionBar().setSubtitle(targetString); 

@textAllCaps应用,但@maxLines被忽略(我试过也` @minLines)。

如何在字幕中启用多行文字?

TIA

UPDATE:

我添加的代码到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); 
    } 
} 

问题是现在所应用的ellipsize值,但setMaxLines()调用将被忽略...

UPD2:

setSingleLine(false)诀窍。

回答

3

不幸的是,maxLines不是TextAppearance的一部分,所以更改它不会影响字幕外观。此外,没有合法访问Toolbar.mSubtitleTextView的方式,但设置了字幕文本后,您可以通过反射访问它并根据需要更改其外观。

UPDATE

这就是你可以通过反射访问mSubtitleTextView

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

实际上我只想以编程方式设置文本,所以反射或类似将会这样做 – injecteer

+0

如何通过反射访问字幕的“textView”?它会是什么ID? – injecteer

+0

@injecteer我在答案中添加了一个代码示例。您无法通过id找到'mSubtitleTextView',因为它是在运行时创建的,并没有id。因此,除了重新考虑UI或编写自己的“Toolbar”类,或使用自定义视图而不是标题和副标题外,最好的方法是通过反射直接访问“工具栏”的专用字段。 – Michael

0

请尝试添加:

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

如果它不工作,你可以尝试使用自定义视图:

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

哪里R.layout.your_layout_file是您的自定义布局设计你想要的方式它。

+0

支持怎么样,动作条? – injecteer

+0

这是一样的! – thiagolr

-1

使用工具栏和程序兼容性21,你必须使用一个ActionBarActivity和使用:

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