ActionBarCompat: как скрыть/удалить «название» «основной» активности?

Я использую ActionBarCompat, привязанный к 1 базовому действию. И есть ряд фрагментов, по которым можно перемещаться с помощью панели навигации.

И каждый фрагмент имеет соответствующий заголовок, установленный программно.

Такие приложения, как официальное приложение Gmail, имеют чистую активность запуска, то есть самый первый экран, который вы видите на короткое время, не имеет ни значка, ни заголовка на панели действий. Как я могу добиться того же?

После того, как приложение загружено со следующими фрагментами, панель ActionBar была программно оформлена соответствующим образом с соответствующими заголовками и значками, как упоминалось ранее.

Я попробовал следующий код, поместив его в style.xml и вызвав из манифеста. Но эта панель действий отключена во всем приложении, чего я не хочу.:

      <style name="Theme.AppCompat.Light.NoActionBar" parent="@style/Theme.AppCompat">

          <item name="android:windowNoTitle">true</item>

      </style>

person sabergeek    schedule 16.03.2014    source источник
comment
Используете ли вы «‹item name=android:windowNoTitle›true‹/item›» в качестве стиля активности?   -  person Michal    schedule 16.03.2014
comment
Да, я пытался установить его в файле style.xml активности. Приложение вылетает при запуске, если я так делаю.   -  person sabergeek    schedule 16.03.2014


Ответы (3)


Просто добавьте setTitle(""); в свою активность при создании.

person Hbibna    schedule 16.03.2014
comment
Это не работает для активности, которая сначала отображается на секунду. - person sabergeek; 16.03.2014
comment
Вы делаете setTitle до или после setContent? - person Martin Marconcini; 16.03.2014

Я думаю, вы могли бы создать свой собственный макет 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
comment
Спасибо @Martín, я попробую и дам вам знать. Ну, у меня есть 1 базовое действие, а остальные — это фрагменты, доступ к которым осуществляется через панель навигации. Итак, если мне нужно установить заголовок каждого фрагмента, загружаемого через ящик, мне нужно поставить setTitle (Ваш заголовок); внутри onCreateView() каждого фрагмента? - person sabergeek; 16.03.2014
comment
Это правильно, вам нужно будет либо создать интерфейс, либо привести его к Activity и использовать setTitle(); ;) - person Martin Marconcini; 16.03.2014

Попробуйте использовать стиль для своей активности в файле манифеста. Помните, что в вашем методе onCreate() вы должны вызывать setStyle() или requestWindowFeature() перед setContentView(), когда хотите вернуть панель действий или стиль приложения.

    <style name="MyApp.Fullscreen" parent="android:Theme.Black.NoTitleBar">
    <item name="android:windowBackground">@color/app_background</item>
</style>
person Michal    schedule 16.03.2014
comment
Спасибо @Michal. Я попробовал аналогичный код, чтобы сделать его совместимым с AppCompat. Взгляните на обновленный пост. Но это полностью отключило панель действий во всем приложении. Я просто хочу скрыть «заголовок» панели действий, показывающий имя приложения на короткое время во время запуска. - person sabergeek; 16.03.2014
comment
о, я вижу, наследование от titleTextStyle должно работать, я думаю, проверьте developer.android.com /guide/topics/ui/actionbar.html Общий вид. Хотя я не тестировал. - person Michal; 16.03.2014