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

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

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

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

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

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

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

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

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

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

Ответ 1

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

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

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

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

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

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

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

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

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

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

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

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

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

getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
getSupportActionBar().hide();

Ответ 2

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

getSupportActionBar().hide();

Ответ 3

Если вы используете 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>

Ответ 4

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

<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 для активности, в которой вы хотите показать ActionBar. Используя два стиля, вы не увидите панель действий во время загрузки просмотров.

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

Ответ 5

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

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

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

  • нормальная тема (добавьте ее в свою деятельность с помощью 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);

      ...........
      ...........
}

Ответ 6

Я также пытался скрыть панель действий на 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>

И прошу прощения за мой плохой английский, как всегда.

Ответ 7

Лучший результат для меня заключался в создании активности с 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();
}

}

Ответ 8

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

getSupportActionBar().hide();

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

getSupportActionBar().show();

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

Ответ 9

Решение

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

EDIT: решение Bellow дало мне проблему для 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);

Ответ 10

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

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

Ответ 11

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>

Ответ 12

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

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

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

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

Ответ 13

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

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

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

Ответ 14

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

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

веселит

Ответ 15

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

манифеста:

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

BaseActivity:

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

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

Ответ 16

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

Создайте прозрачный drawable - что-то вроде этого:

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

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

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

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

_actionbarRoot.setVisibility(View.VISIBLE);
getSupportActionBar().show();

Ответ 17

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

Ответ 18

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

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

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

Ответ 19

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

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

Ответ 20

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

Ответ 21

Просто добавьте это в свои styles.xml

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

Ответ 22

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

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>

Ответ 23

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

First Step to Create new Activity

Select select Full screen Activity

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

Ответ 24

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

val actionBar = supportActionBar?.apply { hide() }

Ответ 25

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

Включение ссылки всегда меняется, ее можно найти в официальной документации по Android в разделе Обучение начало работы Рекомендации по использованию пользовательского интерфейса strong > → Управление системой ui

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

enter image description here

Ответ 26

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

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

getActionBar().hide();

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

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

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