Как скрыть панель действий перед созданием активности, а затем показать ее снова? - PullRequest
235 голосов
/ 14 декабря 2011

Мне нужно реализовать заставку в моем сотовом приложении. Я использую этот код в onCreate действия, чтобы показать всплеск:

setContentView(R.layout.splash);
getActionBar().hide();

и этот код для отображения основного интерфейса через некоторое время:

setContentView(R.layout.main);
getActionBar().show();

Но до вызова onCreate и появления всплывающей подсказки, когда показывается панель действий, мало времени.

Как сделать панель действий невидимой?

Я пытался применить тему к активности без панели действий:

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

но в этом случае getActionBar () всегда возвращает ноль, и я не нашел способа показать это снова.

Ответы [ 26 ]

331 голосов
/ 05 января 2013

Установка android:windowActionBar="false" действительно отключает ActionBar, но тогда, как вы говорите, getActionBar(); возвращает ноль. Это решается с помощью:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
    getActionBar().hide();

    setContentView(R.layout.splash); // be sure you call this AFTER requestFeature

Это создает панель действий и сразу же скрывает ее, прежде чем она смогла отобразиться.

Но теперь есть другая проблема. После добавления windowActionBar="false" в тему, Activity рисует свой обычный заголовок окна вместо ActionBar.
Если мы попытаемся избежать этого, используя некоторые из *.NoTitleBar стандартных тем, или попытаемся добавить <item name="android:windowNoTitle">true</item> в нашу собственную тему, это не сработает.
Причина в том, что ActionBar зависит от заголовка окна, чтобы отображать себя - то есть ActionBar является преобразованным заголовком окна.
Таким образом, хитрость, которая может помочь нам, состоит в том, чтобы добавить еще одну вещь в нашу тему Activity xml:

<item name="android:windowActionBar">false</item>
<item name="android:windowTitleSize">0dp</item>

Это сделает заголовок окна с нулевой высотой, таким образом, практически невидимым.

В вашем случае, после того, как вы закончили с отображением заставки, вы можете просто позвонить

setContentView(R.layout.main);
getActionBar().show();

и все готово. Действие начнется без мерцания ActionBar и отображения заголовка окна.

ADDON: Если вы показываете и скрываете панель действий несколько раз, возможно, вы заметили, что first показ не анимирован. С тех пор показ и сокрытие анимированы. Если вы хотите использовать анимацию при первом показе, вы можете использовать это:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_ACTION_BAR);

    // delaying the hiding of the ActionBar
    Handler h = new Handler();
    h.post(new Runnable() {     
        @Override
        public void run() {
            getActionBar().hide();
        }
    });

То же самое можно сделать с помощью:

protected void onPostResume() {
    super.onPostResume();
    getActionBar().hide();

но может потребоваться дополнительная логика, чтобы проверить, является ли это первым показом Действия.

Идея состоит в том, чтобы немного задержать сокрытие ActionBar. В некотором смысле мы позволяем отображать ActionBar, но затем скрываем его немедленно. Таким образом, мы выходим за пределы первого неанимированного показа, и следующий показ будет считаться вторым, поэтому он будет анимированным.

Как вы уже догадались, есть вероятность, что ActionBar можно будет увидеть до того, как он будет скрыт отложенной операцией. Это на самом деле так. В большинстве случаев ничего не видно, но время от времени вы можете увидеть мерцание ActionBar на долю секунды.

В любом случае это не очень хорошее решение, поэтому я приветствую любые предложения.

Добавление для пользователя панели поддержки v7, код будет:

getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
getSupportActionBar().hide();
48 голосов
/ 17 апреля 2015

Использование этого простого кода в вашем файле .class для скрытия панели действий

getSupportActionBar().hide();
37 голосов
/ 07 февраля 2013

Если вы используете ActionBarSherlock, тогда используйте Theme.Sherlock.NoActionBar Theme в своей деятельности

<activity 
    android:name=".SplashScreenActivity"
    android:theme="@style/Theme.Sherlock.NoActionBar">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
19 голосов
/ 26 января 2014

Создать два стиля:

<style name="AppThemeNoBar" parent="Theme.AppCompat.Light">
     <item name="android:windowNoTitle">true</item>
</style>

<style name="AppThemeBar" parent="Theme.AppCompat.Light">
    <item name="android:windowNoTitle">false</item>
</style>

Установите AppThemeNoBar в качестве темы приложения, а AppThemeBar - на активность, в которой вы хотите отобразить панель действий. Используя два стиля, вы не увидите панель действий во время загрузки представлений.

Проверьте эту ссылку Android: скрыть панель действий при загрузке просмотра

17 голосов
/ 03 июня 2013

Привет У меня есть простое решение с использованием 2 тем

  1. Тема заставки (добавьте ее в манифест):

    <style name="SplashTheme" parent="@android:style/Theme.Holo.NoActionBar"> <item name="android:windowBackground">@color/red</item> </style>

  2. обычная тема (добавьте ее в свою деятельность с помощью setTheme (R.style.Theme)):

    <style name="Theme" parent="@style/Theme.Holo"> <item name="android:windowBackground">@color/blue</item> </style>

Для поддержки SDK10:

@Override    
public void onCreate(Bundle savedInstanceState) {

    setTheme(R.style.Theme);      
    super.onCreate(savedInstanceState);

      ...........
      ...........
}
15 голосов
/ 08 апреля 2015

Я также пытался скрыть панель действий на Android 2.2, но ни одно из этих решений не помогло.Все заканчивается крахом.Я проверил журнал DDMS, он говорил мне использовать «Theme.AppCompat». Наконец, я решил проблему, изменив android:theme="@android:style/Theme.Holo.Light.NoActionBar" Line

на android:theme="@style/Theme.AppCompat.NoActionBar", и это сработало, но интерфейс былdark.

затем я попробовал android:theme="@style/Theme.AppCompat.Light.NoActionBar" и, наконец, получил то, что хотел.

После этого, когда я искал "AppCompat" на сайте разработчика, я получил это.

Так что я думаю, что решение для Android 2.2 -

<activity
    android:name=".MainActivity"
    android:theme="@style/Theme.AppCompat.Light.NoActionBar" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

И извините за мой плохой английский, как всегда.

11 голосов
/ 07 марта 2014

Лучшим результатом для меня было создание деятельности с ThemeNoTitleBar и без содержимого в качестве средства запуска. Тогда это занятие призываем непосредственно к другому.

Конечно, если вы хотите, вы можете добавить контент в Splash Activity, но в моем случае я просто хотел показать приложение напрямую.

Manifest:

<activity
        android:name="com.package.SplashActivity"
        android:theme="@android:style/Theme.Black.NoTitleBar" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

Активность:

public class SplashActivity extends Activity{

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    //start StartActivity
    Intent intent = new Intent(this, StartActivity.class);
    startActivity(intent);
    finish();
}

}

9 голосов
/ 14 сентября 2012

Если вы используете один Activity с включенным заставкой, то вы можете сделать это, если используете SherlockActionBar

getSupportActionBar().hide();

После заставки вы можете снова показать его с ...

getSupportActionBar().show();

То же самое должно быть с родным ActionBar Android.

6 голосов
/ 28 июля 2015

2015, используя библиотеку поддержки v7 с темой AppCompat, установите эту тему для своей деятельности.

<style name="AppTheme.AppStyled" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimaryDark">@color/md_indigo_100</item>
    <item name="colorPrimary">@color/md_indigo_500</item>
    <item name="colorAccent">@color/md_red_500</item>
    <item name="android:textColorPrimary">@color/md_white_1000</item>
    <item name="android:textColor">@color/md_purple_500</item>
    <item name="android:textStyle">bold</item>
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
</style>
6 голосов
/ 04 октября 2012

@ Решение Clerics работает. Но, похоже, это также проблема с некоторыми нативными приложениями googles: googles, play store, talk. Также другие большие приложения, такие как Skype.

РЕДАКТИРОВАТЬ : сильфонное решение дало мне проблему с actionbarherlock на api <4.0, причина была установлена. Тема не работает до бутерброда с мороженым </p>

Добавьте в свой манифест следующее в тегах приложения или активности:

android:theme="@style/Theme.NoActionBar"

А потом в вашей основной деятельности:

    // Set theme
    setTheme(R.style.YOUR_THEME);
    getSupportActionBar().setTitle(R.string.title);

    // Start regular onCreate()
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
...