Як приховати панель дій перед створенням діяльності, а потім показати її знову?


243

Мені потрібно реалізувати заставку в моєму додатку для соти. Я використовую цей код у діяльності onCreate для показу сплеску:

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

і цей код повинен відображати основний інтерфейс користувача через деякий час:

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

Але перед тим, як onCreate буде викликаний і з'явиться сплеск, на екрані відображається рядок часу.

Як я можу зробити панель дій невидимою?

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

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

але в такому випадку getActionBar () завжди повертає null, і я не знайшов способу показати це знову.


Для Theme.AppCompat.Light... використовувати це Як відповісти [1] [1]: stackoverflow.com/a/25365193/1364896
Самі Eltamawy

Відповіді:


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"теми, Активність малює звичайний заголовок вікна замість 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();

але може знадобитися додаткова логіка, щоб перевірити, чи це перше показ активності.

Ідея полягає в тому, щоб трохи затягнути приховування ActionBar. Деяким чином ми дозволяємо показувати ActionBar, але потім негайно приховуємо його. Таким чином, ми виходимо за рамки першого не анімаційного показу, а наступне показ будемо вважати другим, таким чином воно буде анімоване.

Як ви могли здогадатися, є ймовірність, що ActionBar можна побачити до того, як він був прихований затримкою операції. Це насправді так. Більшість випадків нічого не видно, але все ж, раз у раз, ви можете бачити мерехтіння ActionBar на частку секунди.

У будь-якому випадку це не дуже гарне рішення, тому я вітаю будь-які пропозиції.

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

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

2
@newton_guima так, це працює. Просто не забудьте скористатися supportRequestWindowFeature (Window.FEATURE_ACTION_BAR)
scana

@Cleric - Як ти все це працюєш setTheme? Оскільки ваша відповідь чудово працює, якщо я встановив тему з "Маніфесту", але якщо я це роблю onCreate(у моєму випадку тема залежить від уподобання до темної теми), панель дій за замовчуванням починає блимати перед тією, яку я встановив у своїй темі все одно. Але, можливо, для цього варто ще одне повне питання ТА.
дентекс

2
@Cleric Спасибі Я вирішив налаштування своєї проблеми android:theme="@android:style/Theme.NoTitleBar"на Маніфест, а потім setTheme(R.style.MyTheme)на основну діяльність onCreate; Це забезпечує (в Android 4+) уникнення спалаху за замовчуванням ActionBarперед тим, як я визначив у своїй темі (я приїхав сюди, шукаючи спосіб вирішити це; мені фактично не потрібен сплеск-екран).
дентекс

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 - діяльність, у якій ви хочете показати ActionBar. Використовуючи два стилі, ви не побачите панель дій під час завантаження переглядів.

Перевірте це посилання 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". Нарешті я вирішив проблему, змінивши 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, але в моєму випадку я просто хотів показати програму безпосередньо.

Маніфест:

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

Це має бути те саме з рідним ActionBarAndroid.


6

@Clerics рішення працює. Але це, мабуть, також є проблемою з деякими власними програмами googles: googles, магазином ігор, розмов. Також інші великі програми, такі як skype.

EDIT : Рішення Bellow дало мені проблему для 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: topic = "@ 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();
    }

Поясніть, будь ласка, чому це працює чи чому ви вважаєте, що це має працювати. Просто вставлення коду не дає повної відповіді.
Кріс

@Kris, О, я бачу, що ти маєш на увазі, дякую!
користувач3862873

3

це може бути зручно
додати це до маніфесту

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

ура


Чому слід ставити щось не таке велике, як головна відповідь у такому старому питанні?
gsamaras

"відповідь" не допомогла мені, тому я опинився з цією відповіддю і розмістив її тут.
ralphgabb

2

Найкращим способом, який я знаходжу після прочитання всіх доступних варіантів, встановити головну тему без ActionBar, а потім встановити MyTheme в коді в батьківській програмі всієї діяльності.

Маніфест:

<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 () із запитомCode> = 0 під час початкової роботи onCreate (пакет збереженихInstanceState) / 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 після 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 (). hid (); згадувався у найвищому відповіді, getActionBar (). hid (); згадувалося у запитанні, а DarkActionBar згадувався у відповіді сина Нгуєна Тхана. Плюс це питання вже 4 роки і вже має декілька високовідповідальних відповідей.
augray
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.