Как скрыть панель действий до создания активности, а затем снова показать ее?

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

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

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

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

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

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

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

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

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


person Ilya Izhovkin    schedule 14.12.2011    source источник
comment
Для Theme.AppCompat.Light... используйте этот Как ответить[1] [1]: stackoverflow.com/a/25365193/1364896   -  person Sami Eltamawy    schedule 03.11.2014


Ответы (27)


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

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

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

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

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

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

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

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

и все готово. Активность начнется без мерцания панели действий и без отображения заголовка окна.

ДОБАВЛЕНИЕ: если вы несколько раз показываете и скрываете панель действий, возможно, вы заметили, что первое отображение не анимировано. С этого момента показ и скрытие анимированы. Если вы хотите, чтобы анимация отображалась и при первом показе, вы можете использовать это:

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();

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

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

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

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

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

getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
getSupportActionBar().hide();
person Cleric    schedule 05.01.2013
comment
@newton_guima да, это работает. Просто не забудьте использовать supportRequestWindowFeature(Window.FEATURE_ACTION_BAR) - person scana; 05.01.2014
comment
@Cleric - Как заставить все это работать с setTheme? Потому что ваш ответ отлично работает, если я устанавливаю тему из манифеста, но если я делаю это в onCreate (в моем случае тема зависит от предпочтения светлой темной темы), панель голографических действий по умолчанию мигает перед тем, что я установил в моем тема во всяком случае. Но, возможно, это стоит еще одного полного вопроса SO. - person dentex; 07.03.2014
comment
@dentex Нет проблем установить свою собственную тему с помощью setTheme в onCreate и по-прежнему использовать тему, определенную в манифесте. Другими словами, тема манифеста служит только для отключения панели действий и скрытия панели заголовков до достижения onCreate. - person Cleric; 12.03.2014
comment
@Клерик Спасибо. Я решил свою проблему, установив android:theme="@android:style/Theme.NoTitleBar" в манифесте, а затем setTheme(R.style.MyTheme) в основной деятельности onCreate; Это гарантирует (в Android 4+) отсутствие вспышки стандартного голографического ActionBar перед тем, который я определил в своей теме (я пришел сюда в поисках способа обойти это; на самом деле мне не нужен заставка). - person dentex; 12.03.2014
comment
Я звоню getSupportActionBar().hide(); после getWindow().requestFeature(Window.FEATURE_ACTION_BAR);, и все взрывается NPE. Любые идеи? Проблема с Theme.AppCompat? - person loeschg; 02.04.2014
comment
@Cleric это работает для Activity, но у меня есть Activity с двумя фрагментами, такими как фрагмент входа в систему и фрагмент домашнего экрана, я хочу скрыть панель действий только на фрагменте входа. Я использовал getSupportActionBar().hide(); но панель действий отображается в течение нескольких секунд, а затем скрывается. Я думаю, что тема переопределения активности скрывается в обоих фрагментах. - person Ramprasad; 10.06.2014
comment
почему бы просто не создать отдельный SplashActivity с другой темой? - person gor; 07.10.2014
comment
@loeschg: у меня была та же проблема, и я нашел это решение: stackoverflow.com/a/20315456/3514976 - person nonzaprej; 04.08.2015
comment
просто супер! Это наиболее важно для моего проекта Xamarin. Спасибо. - person Ramesh_D; 20.04.2017

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

getSupportActionBar().hide();
person gaurav    schedule 17.04.2015

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

<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>
person kaubatak    schedule 06.02.2013
comment
То же самое относится и к стандартной Android 3+ ActionBar (без Шерлока): <activity android:theme="@android:style/Theme.NoActionBar">. - person Alex Semeniuk; 13.03.2013
comment
Идеальное решение :) Спасибо. - person alicanbatur; 29.03.2013
comment
Не понимаю, как это ответ на вопрос Ильи. Установка темы на Theme.Sherlock.NoActionBar будет означать, что вызов getActionBar() или getSupportActionBar() (для последующего отображения панели действий) возвращает значение null... - person Adil Hussain; 15.08.2013
comment
@AlexSemeniuk Когда я использую эту строку в манифесте, я получаю эту ошибку: error: Error: No resource found that matches the given name (at 'theme' with value '@android:style/ Theme.NoActionBar'). - person Si8; 20.08.2013
comment
@ SiKni8 SiKni8 Вы уверены, что используете библиотеку API13+ для своего приложения? - person Alex Semeniuk; 22.08.2013
comment
Каким-то образом Eclipse загрузил 3.0, и это вызвало ошибку. Наконец исправил. Спасибо. - person Si8; 22.08.2013
comment
Облегченная версия этого, которая работала для меня: android:theme="@style/Theme.Sherlock.Light.NoActionBar" - person treejanitor; 05.10.2013
comment
Тема Holo также имеет NoActionBar: android:Theme.Holo.Light.NoActionBar - person J. Costa; 23.06.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: скрыть панель действий при просмотре загрузки

person Laranjeiro    schedule 26.01.2014
comment
Ну наконец то! Работал на меня. Спасибо. :) - person Dhofca; 24.06.2014
comment
Это не работает на Android 2.3.3 с AppCompat. Отображается панель действий. Однако это работает, например, на KitKat. - person Yar; 12.07.2014

Привет, у меня есть простое решение с использованием 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>

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

@Override    
public void onCreate(Bundle savedInstanceState) {

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

      ...........
      ...........
}
person Abdullah    schedule 02.06.2013

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

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

затем я попробовал 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>

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

person S.Ahsan    schedule 08.04.2015

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

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

Манифест:

<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();
}

}

person javak    schedule 06.03.2014

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

getSupportActionBar().hide();

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

getSupportActionBar().show();

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

person Luser_k    schedule 14.09.2012

Решение @Clerics работает. Но это, похоже, также проблема с некоторыми родными приложениями Google: Google, Play Store, Talk. Также другие большие приложения, такие как скайп.

EDIT: Нижеприведенное решение вызвало у меня проблему с actionbarsherlock на API ‹ 4.0, причина в том, что setTheme не работает перед бутербродом с мороженым

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

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);
person Warpzit    schedule 04.10.2012

лучший и простой

requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

person arslan haktic    schedule 02.04.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>
person Son Nguyen Thanh    schedule 28.07.2015

Для Splashscreen вы должны использовать эту строку в manifest и не использовать getActionBar()

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

и один раз, когда Splash Activity закончен, в основном Activity используйте ниже или ничего

<item name="android:windowActionBar">true</item>
person ingsaurabh    schedule 14.12.2011
comment
Это действительно работает, если вы используете другую тему для страницы-заставки, а не для главной страницы вашего приложения. Просто используйте android:theme=@style/mytheme как для основного действия (ваш экран-заставка), так и для первого действия вашего приложения, которое не является заставкой, заменяющей темы. - person ThanksMister; 04.10.2012
comment
Это дает ошибку на текущих уровнях API: в атрибуте отсутствует префикс пространства имен Android. <item android:name="android:windowActionBar">true</item> избавляется от этой ошибки, но я не знаю, работает ли она до сих пор. - person LarsH; 13.08.2015

Попробуйте это, это работает для меня:

Ниже избавляется от строки заголовка активности

 requestWindowFeature(Window.FEATURE_NO_TITLE);

Ниже убрана панель уведомлений, чтобы действие стало полноэкранным.

 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
        WindowManager.LayoutParams.FLAG_FULLSCREEN);

(Полный пример ниже) Обратите внимание: эти методы были вызваны до того, как мы установили представление содержимого нашей деятельности.

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

        // Sets Application to full screen by removing action bar
        requestWindowFeature(Window.FEATURE_NO_TITLE);    
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
        WindowManager.LayoutParams.FLAG_FULLSCREEN);

        setContentView(R.layout.activity_main); 

        // without this check, we would create a new fragment at each orientation change!
        if (null == savedInstanceState)
            createFragment();
    }
person user3862873    schedule 29.07.2014
comment
Пожалуйста, объясните, почему это работает или почему вы думаете, что это должно работать. Просто вставка кода не дает полного ответа. - person Kris; 29.07.2014
comment
@Kris, о, я понимаю, что ты имеешь в виду, спасибо! - person user3862873; 02.08.2014

это может быть удобно
добавьте это в свой манифест

 android:theme="@android:style/Theme.Light.NoTitleBar" 

ваше здоровье

person ralphgabb    schedule 10.11.2014
comment
Зачем публиковать что-то не такое замечательное, как лучший ответ на такой старый вопрос? - person gsamaras; 10.11.2014
comment
«верхний ответ» мне не помог, поэтому я нашел этот ответ и разместил его здесь. - person ralphgabb; 10.11.2014

Лучший способ, который я нашел после прочтения всех доступных параметров, - это установить основную тему без ActionBar, а затем настроить MyTheme в коде в родительском элементе для всех действий.

Манифест:

<application
...
        android:theme="@android:style/Theme.Holo.Light.NoActionBar"
...>

Базовая активность:

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(R.style.GreenHoloTheme);
}

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

person DmRomantsov    schedule 16.01.2015

Уже опубликованные решения имели побочный эффект: первый вызов .show() не анимировал для меня панель действий. Я получил еще одно хорошее решение, которое исправило это:

Создайте прозрачный рисунок - что-то вроде этого:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid
       android:color="#00000000" />
</shape>

Установите фактический фон панели действий на невидимый настраиваемый вид, который вы установили на панели действий:

getSupportActionBar().setCustomView(R.layout.actionbar_custom_layout);
      getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM,
              ActionBar.DISPLAY_SHOW_CUSTOM | ActionBar.DISPLAY_SHOW_HOME | ActionBar.DISPLAY_SHOW_TITLE);

Установите прозрачный фон для панели действий в onCreate:

getSupportActionBar().setBackgroundDrawable(getResources().getDrawable(R.drawable.background_transparent));

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

getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    getSupportActionBar().hide();
                }
            });

Перед вашим первым вызовом .show() установите видимость пользовательского представления:

_actionbarRoot.setVisibility(View.VISIBLE);
getSupportActionBar().show();
person mAx    schedule 03.04.2013

Если у вас есть нуль, потому что вы используете библиотеку поддержки, вместо getActionBar() вам нужно вызвать getSupportActionBar().

person Naskov    schedule 17.02.2015

Просто добавьте это в свою MainActivity в функции onCreate.

val actionBar = supportActionBar?.apply { hide() }
person MöritzRo    schedule 23.05.2019
comment
это работа на androidx. Просто добавьте после setContentView() эту строку supportActionBar?.apply { hide() } - person Black_Zerg; 12.10.2019

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

В качестве особого случая, если вы вызываете startActivityForResult() с requestCode >= 0 во время начального onCreate(Bundle saveInstanceState)/onResume() вашей активности, ваше окно не будет отображаться до тех пор, пока результат не будет возвращен обратно из начатой ​​активности . Это делается для того, чтобы избежать видимого мерцания при перенаправлении на другое действие.

Вероятно, вам следует делать это только в том случае, если аргумент onCreate равен null (указывающий на новый запуск вашей активности, а не на перезапуск из-за изменения конфигурации).

person Ted Hopp    schedule 14.12.2011
comment
Это не работает. Когда onCreate() запускается, панель действий уже видна. Это хорошо видно в отладке. - person Ilya Izhovkin; 14.12.2011

У меня все еще была ошибка с нулевым указателем, и, наконец, это помогло, когда я сначала вызвал getWindow().requestFeature(), а затем super.onCreate()

public void onCreate(Bundle savedInstanceState) {
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
super.onCreate(savedInstanceState);
getActionBar().show();
person Matwosk    schedule 12.04.2014

Просто добавьте это в свой файл styles.xml.

<item name="android:windowNoTitle">true</item>
person Jakub Trzcinka    schedule 14.10.2014

На самом деле, вы можете просто установить всплеск Activity с помощью NoActionBar и установить основной activity с помощью панели действий.

person Chauyan    schedule 27.07.2014

Лучший способ сделать это — сделать первое действие пустым и контентом, который вы хотите поместить, а затем через некоторое время запустить другое действие. Следуя этому пути, вы можете сделать первое действие в качестве экрана-заставки без панели действий или чего-либо еще. Вот моя первая деятельность

package com.superoriginal.rootashadnasim.syllabus;

import android.content.Intent;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class first_screen extends AppCompatActivity {



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_first_screen);


    final Handler h=new Handler();
    h.postDelayed(new Runnable() {
        @Override
        public void run() {
            Intent intent=new     Intent(getApplicationContext(),DrawerChooseBranchMainActivity.class);
            startActivity(intent);
        }
    },2000);

}
}

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

    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
person ashad    schedule 01.06.2018

Студия Android предоставляет шаблон сборки для полноэкранного режима. Если вы используете студию Android, вы можете выполнить следующий шаг, чтобы реализовать полноэкранную активность.

Первый шаг к созданию нового действия

Выберите выберите Полноэкранное действие

Сделанный. Студия Android выполнила свою работу, теперь вы можете проверить код на весь экран.

person Hitesh Dhamshaniya    schedule 06.10.2018

это лучший способ, которым я использовал Перейти к файлу Java после onCreate:

@Override
    protected void onCreate(Bundle savedInstanceState) 
    { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 

        // Take instance of Action Bar 
        // using getSupportActionBar and 
        // if it is not Null 
        // then call hide function 
        if (getSupportActionBar() != null) { 
            getSupportActionBar().hide(); 
        } 
    }
person DJEMAL Mohamed    schedule 01.06.2020

Я понимаю, что размещение ссылок — не лучший способ сделать что-то, но я настоятельно рекомендую вам прочитать следующую документацию от самих Google. Это официальный документ Android о том, как управлять пользовательским интерфейсом системы (например, панелью действий, панелью навигации и т. д.). К сожалению, информации слишком много, чтобы публиковать ее напрямую, но после прочтения вы поймете, как именно отображать и скрывать функции, независимо от того, для какой версии вы разрабатываете, это так просто!

Если ссылка когда-либо изменится, ее можно найти в официальной документации Android в разделе обучение -> начало работы -> Рекомендации по пользовательскому интерфейсу - > управление системным интерфейсом

https://developer.android.com/training/system-ui/index.html

введите здесь описание изображения

person Chris    schedule 08.08.2014

вы можете использовать это:

getSupportActionBar().hide(); если это не работает, попробуйте это:

getActionBar().hide();

если выше не работает, попробуйте так:

в вашем каталоге = res/values/style.xml откройте style.xml -> есть атрибут parent изменить на parent="Theme.AppCompat.Light.DarkActionBar"

если все это тоже не работает. я больше не знаю. но для меня это работает.

person Sen    schedule 04.10.2015
comment
получитьSupportActionBar(). скрыть(); был упомянут в ответе с наибольшим количеством голосов, getActionBar().hide(); был упомянут в вопросе, а DarkActionBar был упомянут в ответе Son Nguyen Thanh. Кроме того, этому вопросу 4 года, и у него уже есть несколько ответов с высоким рейтингом. - person augray; 04.10.2015