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


243

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

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

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

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

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

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

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

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

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


Для Theme.AppCompat.Light... используйте это Как ответить [1] [1]: stackoverflow.com/a/25365193/1364896
Сами Эльтамави

Ответы:


335

Установка 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

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

Но сейчас есть другая проблема. После помещения 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: Если вы показываете и скрываете панель действий несколько раз, возможно, вы заметили, что первый показ не анимирован. С тех пор показ и сокрытие анимированы. Если вы хотите использовать анимацию при первом показе, вы можете использовать это:

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

2
@newton_guima да, это работает. Только не забудьте использовать supportRequestWindowFeature (Window.FEATURE_ACTION_BAR)
скана

@Cleric - Как ты заставляешь все это работать setTheme? Потому что ваш ответ прекрасно работает, если я задаю тему из Манифеста, но если я делаю это в onCreate(в моем случае тема зависит от предпочтения светлой темной темы), панель голографического действия по умолчанию мигает раньше, чем та, которую я установил в своей теме тем не мение. Но, может быть, это стоит другого полного ТАК вопроса.
dentex

2
@ Клирик Спасибо. Я решил свою проблему android:theme="@android:style/Theme.NoTitleBar"в Манифесте, а затем setTheme(R.style.MyTheme)в основной деятельности onCreate; Это гарантирует (в Android 4+) предотвращение вспышки голографического изображения по умолчанию ActionBarдо того, которое я определил в своей теме (я прибыл сюда в поисках способа обойти это; мне фактически не нужен экран-заставка).
dentex

2
Я звоню getSupportActionBar().hide();после, getWindow().requestFeature(Window.FEATURE_ACTION_BAR);и все взрывается с NPE. Любые идеи? Проблема с Theme.AppCompat?
loeschg

1
@loeschg: у меня была та же проблема, и я нашел это решение: stackoverflow.com/a/20315456/3514976
nonzaprej

50

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

getSupportActionBar().hide();

37

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

1
То же самое относится и к стандартным Android 3+ ActionBar (без Шерлока): <activity android:theme="@android:style/Theme.NoActionBar">.
Алекс Семенюк

Идеальное решение :) Спасибо.
alicanbatur

7
Я не понимаю, как это ответ на вопрос Ильи. Установка темы Theme.Sherlock.NoActionBarбудет означать, что вызов getActionBar()или getSupportActionBar()(чтобы впоследствии отобразить панель действий) возвращает нуль ...
Адиль Хуссейн

@AlexSemeniuk Когда я использую эту строку в манифесте, я получаю эту ошибку:error: Error: No resource found that matches the given name (at 'theme' with value '@android:style/ Theme.NoActionBar').
Si8

1
@ SiKni8 Вы уверены, что используете библиотеку API13 + для своего приложения?
Алекс Семенюк

19

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

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


В заключение! Работал на меня. Спасибо. :)
Dhofca

Это не работает на Android 2.3.3 с AppCompat. ActionBar отображается. Тем не менее, это работает на т.е. KitKat.
Яр

17

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

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

15

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

в 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>

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


12

Лучшим результатом для меня было создание деятельности с 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

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

getSupportActionBar().hide();

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

getSupportActionBar().show();

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


6

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

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

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

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

6

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

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


6

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>

4

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

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

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

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

Это на самом деле работает, если вы используете другую тему для заставки, чем на главной странице вашего приложения. Просто используйте android: theme = "@ style / mytheme" как для основного действия (вашего заставки), так и для первого действия вашего приложения, которое не является заставкой для замены тем.
Спасибо, господин

1
Это дает ошибку на текущих уровнях API: «В атрибуте отсутствует префикс пространства имен Android». <item android:name="android:windowActionBar">true</item>избавляется от этой ошибки, но я не знаю, работает ли она до сих пор.
LarsH

3

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

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

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

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

@ Крис, О, я понимаю, что ты имеешь в виду, спасибо!
user3862873

3

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

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

ура


Зачем публиковать что-то не так хорошо, как топ-ответ в таком старом вопросе?
Гсамарас

«верхний ответ» не помог мне, поэтому я нашел этот ответ и разместил его здесь.
ralphgabb

2

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

Manifest:

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

BaseActivity:

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

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


1

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

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

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

1

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


1

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

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

это работа на AndroidX. Просто добавьте после setContentView () этот рядsupportActionBar?.apply { hide() }
Black_Zerg

0

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

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

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


Это не работает. Когда onCreate () запускается, панель действий уже видна. Это хорошо видно в отладке.
Илья Ижовкин

0

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

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


0

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


0

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

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>

0

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

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

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

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


-1

это лучший способ, которым я использовал Go to java file, после 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(); 
        } 
    }

-3

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

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

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

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


-4

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

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

getActionBar().hide();

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

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

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


getSupportActionBar () скрыть (). был упомянут в ответе с наибольшим количеством голосов, getActionBar (). hide (); был упомянут в вопросе, и DarkActionBar был упомянут в ответе Сон Нгуен Тхань. Плюс этому вопросу 4 года, и у него уже есть несколько высоко оцененных ответов.
Авгрей
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.