【问题标题】:Setting SupportActionBar subtitle multiline设置 SupportActionBar 字幕多行
【发布时间】:2015-10-09 11:28:42
【问题描述】:

我有以下设置:

<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

更新:

我将代码添加到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 ) 成功了。

【问题讨论】:

    标签: android android-actionbar android-appcompat multiline subtitle


    【解决方案1】:

    要使用工具栏和 Appcompat 21,您必须使用 ActionBarActivity 并使用:

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

    【讨论】:

    • 您好,请在回答之前阅读并理解问题。谢谢。
    【解决方案2】:

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

    更新

    这就是您可以通过反射访问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;
            }
        }
    }
    

    【讨论】:

    • 实际上我只想以编程方式设置文本,所以反射或类似的东西会做
    • 如何通过反射访问字幕的textView?它的 id 是什么?
    • @injecteer 我在答案中添加了一个代码示例。您无法通过 id 找到 mSubtitleTextView,因为它是在运行时创建的并且没有 id。所以除了重新思考你的 UI,或者编写你自己的 Toolbar 类,或者使用自定义视图而不是标题和副标题之外,你能做的最好的事情就是通过反射直接访问 Toolbar 的私有字段。
    • 虽然我最终得到了带有椭圆的单行字幕,因为两行字幕看起来很难看,但您的回答提供了有关该主题的宝贵提示
    【解决方案3】:

    请尝试添加:

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

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

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

    R.layout.your_layout_file 是您按照您想要的方式设计的自定义布局。

    【讨论】:

    • 支持操作栏怎么样?
    猜你喜欢
    • 2017-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 2013-07-29
    • 2021-01-29
    • 2010-12-18
    相关资源
    最近更新 更多