Jak ukryć pasek akcji przed utworzeniem działania, a następnie pokazać go ponownie?

243

Muszę zaimplementować ekran powitalny w mojej aplikacji o strukturze plastra miodu. Używam tego kodu w działaniu onCreate, aby pokazać powitanie:

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

i ten kod, aby po pewnym czasie pokazać główny interfejs użytkownika:

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

Ale zanim zadzwoni onCreate i pojawi się splash, jest mało czasu na wyświetlenie paska akcji.

Jak mogę uczynić pasek akcji niewidocznym?

Próbowałem zastosować motyw do aktywności bez paska akcji:

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

ale w takim przypadku getActionBar () zawsze zwraca null i nie znalazłem sposobu, aby pokazać go ponownie.

Ilya Izhovkin
źródło
Dla Theme.AppCompat.Light... użyj tego Jak odpowiedzieć [1] [1]: stackoverflow.com/a/25365193/1364896
Sami Eltamawy

Odpowiedzi:

335

Ustawienie android:windowActionBar="false"naprawdę wyłącza pasek ActionBar, ale następnie, jak mówisz, getActionBar();zwraca null. Rozwiązuje to:

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

Spowoduje to utworzenie ActionBar i natychmiast ukrywa go, zanim miał szansę zostać wyświetlony.

Ale teraz jest inny problem. Po wstawieniu windowActionBar="false"motywu działanie rysuje normalny tytuł okna zamiast paska działań.
Jeśli spróbujemy tego uniknąć, używając niektórych *.NoTitleBarpodstawowych motywów lub spróbujemy wprowadzić <item name="android:windowNoTitle">true</item>własny motyw, nie zadziała.
Powodem jest to, że pasek akcji zależy od wyświetlanego tytułu okna - to znaczy pasek akcji jest przekształconym tytułem okna.
Zatem sztuczka, która może nam pomóc, polega na dodaniu jeszcze jednej rzeczy do naszego tematu aktywności xml:

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

Spowoduje to, że tytuł okna o zerowej wysokości będzie praktycznie niewidoczny.

W twoim przypadku po zakończeniu wyświetlania ekranu powitalnego możesz po prostu zadzwonić

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

i gotowe. Aktywność rozpocznie się bez migania paska ActionBar ani wyświetlania tytułu okna.

ADDON: Jeśli wielokrotnie wyświetlasz i ukrywasz pasek ActionBar, być może zauważyłeś, że pierwszy pokaz nie jest animowany. Od tego momentu pokazywanie i ukrywanie się jest animowane. Jeśli chcesz mieć animację również przy pierwszym pokazie, możesz użyć tego:

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

To samo można osiągnąć dzięki:

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

ale może potrzebować dodatkowej logiki, aby sprawdzić, czy jest to pierwszy pokaz działania.

Chodzi o to, aby nieco opóźnić ukrywanie paska ActionBar. W pewien sposób pozwalamy wyświetlać pasek ActionBar, ale natychmiast go ukrywamy. W ten sposób wykraczamy poza pierwszy nie animowany pokaz, a następny pokaz będzie uważany za drugi, a zatem będzie animowany.

Jak można się domyślić, jest szansa, że ActionBar mogłyby być postrzegane zanim została ukryta przez działanie opóźnione. Tak jest w rzeczywistości. Przez większość czasu nic nie jest widoczne, ale od czasu do czasu widać pasek ActionBar migający na ułamek sekundy.

W każdym razie nie jest to ładne rozwiązanie, dlatego z zadowoleniem przyjmuję wszelkie sugestie.

Dodatek dla użytkownika paska akcji obsługi v7 będzie następujący:

getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
getSupportActionBar().hide();
Duchowny
źródło
2
@newton_guima tak, to działa. Pamiętaj tylko, aby użyć funkcji supportRequestWindowFeature (Window.FEATURE_ACTION_BAR)
scana
@Cleric - Jak to wszystko działa setTheme? Ponieważ twoja odpowiedź działa świetnie, jeśli ustawię motyw z manifestu, ale jeśli to zrobię onCreate(w moim przypadku motyw zależy od preferencji jasnego ciemnego motywu), domyślny pasek działań holo miga przed tym, który ustawiłem w moim motywie tak czy siak. Ale może to jest warte kolejnego kompletnego pytania SO.
dentex
2
@Cleric Thanks. Rozwiązałem problem z ustawieniem android:theme="@android:style/Theme.NoTitleBar"w Manifeście, a następnie setTheme(R.style.MyTheme)w głównej działalności onCreate; To gwarantuje (w Androidzie 4+) uniknięcie flashowania domyślnego holo ActionBarprzed tym, który zdefiniowałem w moim motywie (przybyłem tutaj, szukając sposobu na obejście tego; w rzeczywistości nie potrzebuję żadnego ekranu powitalnego).
dentex
2
Dzwonię getSupportActionBar().hide();później getWindow().requestFeature(Window.FEATURE_ACTION_BAR);i wszystko wysadza w powietrze NPE. Jakieś pomysły? Problem z Theme.AppCompat?
loeschg
1
@loeschg: Miałem ten sam problem i znalazłem to rozwiązanie: stackoverflow.com/a/20315456/3514976
nonzaprej
50

Używanie tego prostego kodu w pliku .class do ukrywania paska akcji

getSupportActionBar().hide();
gaurav
źródło
37

Jeśli używasz ActionBarSherlock, użyj Theme.Sherlock.NoActionBar Theme w swoim działaniu

<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>
kaubatak
źródło
1
To samo odnosi się do standardowych Android 3+ ActionBar (bez Sherlocka) <activity android:theme="@android:style/Theme.NoActionBar">.
Alex Semeniuk
Idealne rozwiązanie :) Dzięki.
alicanbatur
7
Nie rozumiem, jak to jest odpowiedź na pytanie Ilyi. Ustawienie tego motywu Theme.Sherlock.NoActionBarbędzie oznaczać dzwonienie getActionBar()lub getSupportActionBar()(aby następnie wyświetlić pasek akcji) wartość null ...
Adil Hussain
@AlexSemeniuk Kiedy używam tej linii w manifeście, pojawia się następujący błąd:error: Error: No resource found that matches the given name (at 'theme' with value '@android:style/ Theme.NoActionBar').
Si8,
1
@ SiKni8 Czy na pewno używasz biblioteki API13 + do swojej aplikacji?
Alex Semeniuk
19

Utwórz dwa style:

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

Ustaw AppThemeNoBar jako motyw aplikacji, a AppThemeBar na działanie, w którym chcesz wyświetlić pasek ActionBar. Używając dwóch stylów, nie zobaczysz paska akcji podczas ładowania widoków.

Sprawdź ten link Android: ukryj pasek akcji podczas wyświetlania obciążenia

Laranjeiro
źródło
Wreszcie! Pracował dla mnie. Dzięki. :)
Dhofca
To nie działa na Androidzie 2.3.3 z AppCompat. ActionBar jest pokazany. Działa to jednak np. Na KitKat.
Yar
17

Cześć Mam proste rozwiązanie, używając 2 motywów

  1. Motyw ekranu powitalnego (dodaj go do manifestu):

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

  2. normalny motyw (dodaj go do swojej działalności przez setTheme (R.style.Theme)):

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

Aby obsługiwać SDK 10:

@Override    
public void onCreate(Bundle savedInstanceState) {

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

      ...........
      ...........
}
Abdullah
źródło
15

Próbowałem też ukryć pasek akcji w Androidzie 2.2, ale żadne z tych rozwiązań nie działało. Wszystko kończy się katastrofą. Sprawdziłem DDMS LOg. Mówiło mi, żebym używał „Theme.AppCompat”. W końcu rozwiązałem problem, zmieniając android:theme="@android:style/Theme.Holo.Light.NoActionBar"wiersz

do android:theme="@style/Theme.AppCompat.NoActionBar"i to działało, ale interfejs było ciemno.

potem próbowałem android:theme="@style/Theme.AppCompat.Light.NoActionBar"i w końcu dostałem to, czego chciałem.

Potem, kiedy szukałem „AppCompat” na stronie programisty, dostałem to.

Myślę więc, że rozwiązaniem dla Androida 2.2 jest

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

I przepraszam za mój zły angielski jak zawsze.

S.Ahsan
źródło
12

Najlepszy wynik dla mnie to utworzenie działania z ThemeNoTitleBar i bez zawartości jako program uruchamiający. Następnie ta aktywność wywołuje bezpośrednio drugą.

Oczywiście, jeśli chcesz, możesz dodać treść do działania Splash, ale w moim przypadku chciałem tylko pokazać aplikację bezpośrednio.

Oczywisty:

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

Czynność:

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

}

javak
źródło
9

Jeśli używasz Activitydołączonego ekranu powitalnego, możesz to zrobić, jeśli używaszSherlockActionBar

getSupportActionBar().hide();

Po ekranie powitalnym możesz go ponownie wyświetlić za pomocą ...

getSupportActionBar().show();

Powinno być tak samo z rodzimym ActionBarsystemem Android.

Luser_k
źródło
6

Rozwiązanie @Clerics działa. Ale wydaje się, że jest to również problem z niektórymi natywnymi aplikacjami Google: Google, sklep z zabawkami, rozmowa. Również inne duże aplikacje, takie jak Skype.

EDYCJA : Poniższe rozwiązanie dało mi problem z blokadą akcji na interfejsie API <4.0, ponieważ ustawiono przyczynę Nie działa przed kanapką z lodami

Dodaj w swoim manifeście tagi aplikacji lub aktywności:

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

A następnie w głównej działalności:

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

    // Start regular onCreate()
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
Warpzit
źródło
6

najlepszy i prosty

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

arslan haktic
źródło
6

2015 r., Używając biblioteki obsługi v7 z motywem AppCompat, ustaw ten motyw dla swojej aktywności.

<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>
Son Nguyen Thanh
źródło
4

Bo Splashscreenpowinieneś użyć tej linii manifesti nie używaćgetActionBar()

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

i raz, gdy Splash Activityjest zakończony w głównym Activityużyciu poniżej lub nic

<item name="android:windowActionBar">true</item>
ingsaurabh
źródło
To faktycznie działa, jeśli używasz innego motywu dla strony powitalnej niż głównej strony aplikacji. Wystarczy użyć Androida: theme = "@ style / mytheme" zarówno dla głównej aktywności (ekranu powitalnego), jak i pierwszej aktywności aplikacji, która nie jest ekranem powitalnym zamiany motywów.
ThanksMister
1
Daje to błąd na bieżących poziomach API: „W atrybucie brakuje prefiksu przestrzeni nazw systemu Android”. <item android:name="android:windowActionBar">true</item>pozbywa się tego błędu, ale nie wiem, czy nadal działa.
LarsH
3

Wypróbuj to, działa dla mnie:

Poniżej pozbywa się paska tytułu aktywności

 requestWindowFeature(Window.FEATURE_NO_TITLE);

Poniżej eliminuje pasek powiadomień, aby aktywność przechodziła na pełny ekran

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

(Pełny przykład poniżej) Uwaga: metody te zostały wywołane przed ustawieniem widoku zawartości naszej działalności

@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();
    }
użytkownik3862873
źródło
Wyjaśnij, dlaczego to działa lub dlaczego uważasz, że to powinno działać. Samo wklejenie kodu nie daje pełnej odpowiedzi.
Kris,
@Kris, Oh rozumiem, co masz na myśli, dzięki!
user3862873,
3

może to być przydatne,
dodaj to do swojego manifestu

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

Twoje zdrowie

ralphgabb
źródło
Po co publikować coś nie tak wspaniałego, jak najlepsza odpowiedź na tak stare pytanie?
gsamaras
„najlepsza odpowiedź” nie pomogła mi, więc znalazłem się z tą odpowiedzią i opublikowałem ją tutaj.
ralphgabb
2

Najlepszy sposób, jaki znajduję po przeczytaniu wszystkich dostępnych opcji, to ustawienie głównego motywu bez ActionBar, a następnie skonfigurowanie MyTheme w kodzie nadrzędnym dla wszystkich działań.

Oczywisty:

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

BaseActivity:

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

W ten sposób unikam paska ActionBar podczas uruchamiania aplikacji!

DmRomantsov
źródło
1

Rozwiązania, które już opublikowano, zawierały efekt uboczny, że pierwsze wywołanie .show () nie animowało dla mnie paska ActionBar. Mam inne fajne rozwiązanie, które naprawiło:

Utwórz przezroczystą rysownię - coś takiego:

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

Ustaw rzeczywiste tło paska akcji na niewidoczny widok niestandardowy ustawiony na pasku akcji:

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

Ustaw przezroczyste tło dla paska akcji w programie onCreate:

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

Ważne: Nie ukrywaj paska akcji natychmiast w programie onCreate, ale z pewnym opóźnieniem później - np. Po zakończeniu tworzenia układu:

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

Przed pierwszym wywołaniem .show () ustaw widok niestandardowy widoczny:

_actionbarRoot.setVisibility(View.VISIBLE);
getSupportActionBar().show();
mAx
źródło
1

Jeśli masz wartość NULL, ponieważ korzystasz z biblioteki wsparcia , zamiast getActionBar()dzwonić getSupportActionBar().

Naskov
źródło
1

Po prostu dodaj to do MainActivity w funkcji onCreate.

val actionBar = supportActionBar?.apply { hide() }
MöritzRo
źródło
działa na Androidzie. Wystarczy dodać po setContentView () ten wierszsupportActionBar?.apply { hide() }
Black_Zerg
0

Umieść ekran powitalny w osobnym działaniu i użyj metody startActivityForResultgłównej, onCreateaby go wyświetlić. Działa to, ponieważ zgodnie z dokumentami:

W szczególnym przypadku, jeśli wywołasz startActivityForResult () z requestCode> = 0 podczas początkowego działania onCreate (pakiet zapisanyInstanceState) / onResume () działania, wówczas okno nie będzie wyświetlane, dopóki wynik nie zostanie zwrócony z rozpoczętego działania . Ma to na celu uniknięcie widocznego migotania podczas przekierowywania do innej aktywności.

Prawdopodobnie powinieneś to zrobić tylko wtedy, gdy argumentem onCreatejest null(wskazujący na ponowne uruchomienie twojej działalności, w przeciwieństwie do ponownego uruchomienia z powodu zmiany konfiguracji).

Ted Hopp
źródło
To nie działa. Po uruchomieniu onCreate () pasek akcji jest już widoczny. Widać to wyraźnie w debugowaniu.
Ilya Izhovkin,
0

Nadal miałem błąd ze wskaźnikiem zerowym i wreszcie pomogło, gdy najpierw wywołałem metodę getWindow (). RequestFeature (), a następnie super.onCreate ()

public void onCreate(Bundle savedInstanceState) {
getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
super.onCreate(savedInstanceState);
getActionBar().show();
Matwosk
źródło
0

Po prostu dodaj to do swojego styles.xml

<item name="android:windowNoTitle">true</item>
Jakub Trzcinka
źródło
0

Faktycznie, można po prostu ustawić powitalny Activityz NoActionBar i ustawić główny activityz paska akcji.

Chauyan
źródło
0

Najlepszym sposobem na zrobienie tego jest zrobienie z pierwszego działania jako pustego działania i zawartości, którą chcesz umieścić, a następnie po pewnym czasie uruchomić inną aktywność. Postępując w ten sposób, możesz wykonać pierwszą aktywność jako ekran powitalny bez paska akcji lub czegokolwiek. Oto moja pierwsza aktywność

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

}
}

Następnie możesz umieścić dowolną aktywność jako pierwszą aktywność. Jeśli nie chcesz mieć paska akcji na żadnym ekranie, po prostu dodaj go do swoich stylów

    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
Ashad
źródło
0

Android studio zapewnia szablon kompilacji dla pełnego ekranu, jeśli używasz Android studio, możesz wykonać poniższy krok, aby zaimplementować aktywność na pełnym ekranie.

Pierwszy krok do utworzenia nowej aktywności

Wybierz wybierz Aktywność na pełnym ekranie

Gotowe. Android studio wykonało swoją pracę, teraz możesz sprawdzić kod na pełnym ekranie.

Hitesh Dhamshaniya
źródło
-1

to jest najlepszy sposób, w jaki użyłem Idź do pliku Java, po 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(); 
        } 
    }
DJEMAL Mohamed
źródło
-3

Zdaję sobie sprawę, że publikowanie linków nie jest najlepszym sposobem na robienie różnych rzeczy, ale gorąco polecam przeczytanie poniższej dokumentacji od Google. Jest to oficjalny dokument systemu Android dotyczący sposobu kontrolowania interfejsu użytkownika systemu (takich jak pasek akcji, pasek nawigacji itp.). Niestety informacji jest zbyt wiele, aby publikować bezpośrednio, ale po przeczytaniu tego zrozumiesz dokładnie, jak wyświetlać i ukrywać funkcje bez względu na wersję, którą tworzysz, jest to takie proste!

Uwzględniaj, że link się zmienia, można go znaleźć w oficjalnej dokumentacji Androida podczas szkolenia -> pierwsze kroki -> Najlepsze praktyki dotyczące interfejsu użytkownika -> zarządzanie interfejsem systemu

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

wprowadź opis zdjęcia tutaj

Chris
źródło
-4

możesz użyć tego:

getSupportActionBar().hide(); jeśli to nie działa, spróbuj tego:

getActionBar().hide();

jeśli powyższe nie działa, spróbuj tego:

w twoim katalogu = res / wartości / style.xml, otwórz style.xml -> następuje parentzmiana atrybutu naparent="Theme.AppCompat.Light.DarkActionBar"

jeśli to wszystko też nie działa. już nie wiem. ale dla mnie to działa.

Sen
źródło
getSupportActionBar (). hide (); został wspomniany w najlepiej głosowanej odpowiedzi getActionBar (). hide (); wspomniano w pytaniu, a DarkActionBar wspomniano w odpowiedzi Son Nguyen Thanh. Dodatkowo to pytanie ma 4 lata i ma już kilka wysoko głosowanych odpowiedzi.
sierpień