设置 SupportActionBar 字幕多行
Setting SupportActionBar subtitle multiline
我有以下设置:
<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 );
}
}
现在的问题是,应用了椭圆大小值,但是 setMaxLines()
调用被忽略了...
UPD2:
setSingleLine( false )
成功了。
请尝试添加:
<item name="android:singleLine">false</item>
如果不行,您可以尝试使用自定义视图:
ActionBar actionBar = getActionBar();
actionBar.setDisplayShowCustomEnabled(true);
actionBar.setCustomView(R.layout.your_layout_file);
其中 R.layout.your_layout_file
是按照您想要的方式设计的自定义布局。
遗憾的是,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;
}
}
}
要使用工具栏和 Appcompat 21,您必须使用 ActionBarActivity 并使用:
((ActionBarActivity) getActivity()).getSupportActionBar().setSubtitle("About");
我有以下设置:
<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 );
}
}
现在的问题是,应用了椭圆大小值,但是 setMaxLines()
调用被忽略了...
UPD2:
setSingleLine( false )
成功了。
请尝试添加:
<item name="android:singleLine">false</item>
如果不行,您可以尝试使用自定义视图:
ActionBar actionBar = getActionBar();
actionBar.setDisplayShowCustomEnabled(true);
actionBar.setCustomView(R.layout.your_layout_file);
其中 R.layout.your_layout_file
是按照您想要的方式设计的自定义布局。
遗憾的是,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;
}
}
}
要使用工具栏和 Appcompat 21,您必须使用 ActionBarActivity 并使用:
((ActionBarActivity) getActivity()).getSupportActionBar().setSubtitle("About");