我认为您可以像这样创建自己的 ActionBar 布局:
在你的 BaseActivity(你有一个,对吗?)做这样的事情:
public class BaseActivity extends ActionBarActivity {
private TextView mActionBarTextView;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final android.support.v7.app.ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
actionBar.setDisplayShowCustomEnabled(true);
actionBar.setDisplayShowTitleEnabled(false);
LayoutInflater inflator = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View actionBarView = inflator.inflate(R.layout.ab_custom_view, null);
mActionBarTextView = (TextView) actionBarView.findViewById(R.id.title);
mActionBarTextView.requestFocus();
this.getSupportActionBar().setCustomView(actionBarView);
setTitle(Constants.EMPTY_STRING);
}
}
ab_custom_view.xml 看起来像(设置您自己的 TextView 首选项,这只是一个未经测试的示例):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="5dp"
android:textColor="@color/white"
android:textSize="18sp"
android:maxLines="1"
android:ellipsize="marquee"
android:focusable="true"
android:singleLine="true"
android:focusableInTouchMode="true" />
</RelativeLayout>
回到您的BaseActivity,添加以下便捷方法:
@Override
public void setTitle(final CharSequence title) {
if (mActionBarTextView != null) {
if (title != null) {
mActionBarTextView.setText(title);
} else {
mActionBarTextView.setText(null);
}
requestTitleFocus();
}
}
@Override
public void setTitle(final int titleId) {
if (mActionBarTextView != null) {
if (titleId > 0) {
mActionBarTextView.setText(getString(titleId));
} else {
mActionBarTextView.setText(getString(R.string.some_default_string);
}
requestTitleFocus();
}
}
public void requestTitleFocus() {
if (mActionBarTextView != null) {
mActionBarTextView.requestFocus();
}
}
最后,在您的活动(继承自 BaseActivity)中,如果您需要设置一个不同于空的标题:
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle("Your Title");
}
(为了方便和高效,我假设您将最常用的字符串存储在静态 final 字段中……)
public final class Constants {
public static final String EMPTY_STRING = "";
}
这应该可以解决问题。
您获得的好处是您可以在 ActionBar 中使用自定义字体(如果您使用自定义字体,以匹配您的应用程序的字体),因为您可以完全控制(和引用)您的 ActionBar 的文本视图。 ;)