Я думаю, вы могли бы создать свой собственный макет 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");
}
(Я предполагаю, что вы храните наиболее часто используемые строки в статическом конечном поле для удобства и эффективности…)
public final class Constants {
public static final String EMPTY_STRING = "";
}
Это должно сработать.
Преимущество, которое вы получаете, заключается в том, что вы можете использовать пользовательский шрифт в ActionBar (чтобы соответствовать шрифту вашего приложения, если вы использовали пользовательский), потому что у вас есть полный контроль (и ссылка) на текстовое представление вашего ActionBar. ;)
person
Martin Marconcini
schedule
16.03.2014