Etkinlik oluşturulmadan önce eylem çubuğunu gizleme ve sonra tekrar gösterme?


243

Benim petek uygulamamda açılış ekranı uygulamak gerekir. Sıçrama göstermek için etkinlik 'onCreate bu kodu kullanın:

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

ve bir süre sonra ana kullanıcı arayüzünü göstermek için bu kod:

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

Ancak onCreate çağrılmadan ve sıçrama görünmeden önce , eylem çubuğunun gösterilmesi için az bir süre vardır.

Eylem çubuğunu nasıl görünmez yapabilirim?

Eylem çubuğu olmadan aktiviteye tema uygulamayı denedim:

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

ancak bu durumda getActionBar () her zaman null döndürür ve tekrar göstermenin bir yolunu bulamadım.


İçin Theme.AppCompat.Light... Bunu nasıl
cevaplanır

Yanıtlar:


335

Ayarlama android:windowActionBar="false", ActionBar'ı gerçekten devre dışı bırakır, ancak dediğiniz gibi getActionBar();null döndürür. Bu, aşağıdakiler tarafından çözülür:

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

Bu, ActionBar'ı oluşturur ve görüntülenme şansı olmadan hemen gizler.

Ama şimdi başka bir sorun daha var. windowActionBar="false"Tema, temayı ekledikten sonra bir ActionBar yerine normal Pencere Başlığını çizer.
Bazı *.NoTitleBarstok temalarını kullanarak bundan kaçınmaya çalışırsak veya <item name="android:windowNoTitle">true</item>kendi temamızı koymaya çalışırsak , işe yaramaz.
Nedeni İşlem Çubuğu olmasıdır bağlı olduğunu İşlem Çubuğu bir dönüştürülmüş Pencere Başlığı olduğunu - kendisini görüntülemek için Pencere Başlığı üzerinde.
Bize yardımcı olabilecek hileler, Etkinlik teması xml'ye bir şey daha eklemektir:

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

Bu, Pencere Başlığını sıfır yükseklikte, dolayısıyla pratikte görünmez yapar.

Sizin durumunuzda, açılış ekranını görüntülemeyi bitirdikten sonra

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

ve işiniz bitti. Etkinlik hiçbir ActionBar titremesi veya Pencere Başlığı gösterilmeden başlayacaktır.

ADDON: ActionBar'ı birkaç kez gösterir ve gizlerseniz, ilk gösterimin animasyonlu olmadığını fark etmişsinizdir . O andan itibaren gösterme ve gizleme canlandırılır. İlk gösteride de animasyon olmasını istiyorsanız bunu kullanabilirsiniz:

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

Aynı şey şu şekilde elde edilebilir:

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

ancak bunun Faaliyetin ilk gösterimi olup olmadığını kontrol etmek için ekstra bir mantık gerekebilir.

Fikir, ActionBar'ın gizlenmesini biraz geciktirmektir. Bir şekilde ActionBar'ın gösterilmesine izin veriyoruz, ancak hemen gizliyoruz. Böylece ilk canlandırılmamış gösterimin ötesine geçiyoruz ve bir sonraki gösterme ikinci olarak değerlendirilecek, böylece canlandırılacak.

Eğer bir şans var Tahmin ettiğin gibi o İşlem Çubuğu olabilir gibi gecikmeli işlem tarafından gizlenmeden önce görülme . Aslında durum budur. Çoğu zaman hiçbir şey görünmez, ancak arada bir, ActionBar titremesini bir anlığına görebilirsiniz.

Her durumda bu güzel bir çözüm değil, bu yüzden herhangi bir öneriyi kabul ediyorum.

V7 destek eylem çubuğu kullanıcısı için ek , kod şöyle olacaktır:

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

2
@ newton_guima evet, işe yarıyor. SupportRequestWindowFeature (Window.FEATURE_ACTION_BAR) kullanmayı unutmayın
scana

@Cleric - Tüm bunların birlikte çalışmasını nasıl sağlıyorsunuz setTheme? Temayı Manifest'ten ayarlarsam cevabınız harika çalıştığından, ancak bunu yaparsam onCreate(benim durumumda tema, karanlık temanın ışığı tercihine bağlıdır), varsayılan holo eylem çubuğu temamda belirlediğimden önce yanıp söner neyse. Ama belki bu başka bir tam SO sorusuna değer.
Mart'ta dentex

2
@Cleric Teşekkürler. Sorun android:theme="@android:style/Theme.NoTitleBar"ayarımı Manifest'e ve daha sonra setTheme(R.style.MyTheme)ana faaliyetlerde çözdüm onCreate; Bu, (Android 4+ sürümünde) temamda ActionBartanımladığımdan önce varsayılan holo flaşından kaçınmayı sağlar ( buraya geçici bir çözüm bulmak için geldim; Aslında herhangi bir açılış ekranına ihtiyacım yok).
Mart'ta dentex

2
Ben buna getSupportActionBar().hide();sonra getWindow().requestFeature(Window.FEATURE_ACTION_BAR);ve her şey bir NPE ile havaya uçuruyor. Herhangi bir fikir? İle sorun Theme.AppCompatmu yaşıyorsunuz ?
loeschg

1
@loeschg: Aynı sorunu yaşadım ve bu çözümü buldum: stackoverflow.com/a/20315456/3514976
nonzaprej

50

Eylem çubuğunu gizlemek için .class dosyanızdaki bu basit kodu kullanma

getSupportActionBar().hide();

37

ActionBarSherlock kullanıyorsanız, Etkinliğinizde Theme.Sherlock.NoActionBar Temasını kullanın

<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
Aynı standart Android 3+ İşlem Çubuğu (hayır Sherlock) için geçerlidir: <activity android:theme="@android:style/Theme.NoActionBar">.
Alex Semeniuk

Mükemmel çözüm :) Teşekkürler.
alicanbatur

7
Bunun Ilya'nın sorusuna nasıl bir cevap olduğunu anlamıyorum. Temayı ayarlamak, Theme.Sherlock.NoActionBararamak getActionBar()veya getSupportActionBar()(daha sonra eylem çubuğunu göstermek için) null döndürür ...
Adil Hussain

@AlexSemeniuk Manifest'te bu satırı kullandığımda, şu hatayı alıyorum:error: Error: No resource found that matches the given name (at 'theme' with value '@android:style/ Theme.NoActionBar').
Si8

1
@ SiKni8 Uygulamanız için API13 + kitaplığını kullandığınızdan emin misiniz?
Alex Semeniuk

19

İki stil oluşturun:

<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 öğesini uygulama teması ve AppThemeBar öğesini ActionBar'ı göstermek istediğiniz etkinliğe ayarlayın.İki stil kullanarak görünümler yüklenirken Eylem çubuğunu görmezsiniz.

Bu bağlantıyı kontrol et Android: görüntüleme yüklerken işlem çubuğunu gizle


En sonunda! Benim için çalıştı. Teşekkürler. :)
Dhofca

Bu, Android 2.3.3'te AppCompat ile çalışmaz. ActionBar gösterilir. Ancak, bu KitKat üzerinde çalışır.
Yar

17

Merhaba 2 tema kullanarak basit bir çözüm var

  1. Açılış ekranı teması (manifest'e ekleyin):

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

  2. normal tema (aktivitenize setTheme (R.style.Theme) ile ekleyin):

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

SDK 10'u desteklemek için:

@Override    
public void onCreate(Bundle savedInstanceState) {

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

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

15

Ayrıca Android 2.2'de Action Bar'ı gizlemeye çalışıyordum, ancak bu çözümlerin hiçbiri işe yaramadı. Her şey bir çarpışma ile bitiyor. DDMS LOG'u kontrol ettim, 'Theme.AppCompat' kullanmamı söylüyordu. Sonunda android:theme="@android:style/Theme.Holo.Light.NoActionBar"Hattı değiştirerek sorunu çözdüm

içine android:theme="@style/Theme.AppCompat.NoActionBar"ve işe yaradı ama Arayüz karanlıktı.

sonra denedim android:theme="@style/Theme.AppCompat.Light.NoActionBar"ve sonunda istediğimi aldım.

Bundan sonra Geliştirici Sitesinde 'AppCompat' aradığımda bunu aldım.

Bence Android 2.2 için Çözüm

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

Ve her zamanki gibi kötü İngilizcem için özür dilerim.


12

Benim için en iyi sonuç, Launcher olarak içerik olmadan ThemeNoTitleBar ile bir etkinlik oluşturmaktı. Sonra bu etkinlik doğrudan diğerini çağırır.

Tabii isterseniz Splash Aktivitesine içerik ekleyebilirsiniz, ancak benim durumumda sadece uygulamayı doğrudan göstermek istedim.

Belirgin:

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

Aktivite:

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

Bir kullanırsanız Activitybir açılış ekranı dahil kullanmak, o zaman bunu yapabilirsinizSherlockActionBar

getSupportActionBar().hide();

Açılış ekranından sonra tekrar gösterebilirsiniz ...

getSupportActionBar().show();

ActionBarAndroid yerli ile aynı olmalıdır .


6

@Clerics çözümü çalışır. Ancak bu, googles yerel uygulamalarından bazılarında da bir sorun gibi görünüyor: googles, play store, talk. Ayrıca skype gibi diğer büyük uygulamalar.

EDIT : Körük çözümü bana api <4.0 üzerinde actionbarsherlock için sorun verdi, set nedeni Sebep dondurma öncesi sandviç çalışmıyor

Uygulama veya etkinlik etiketlerinizdeki bildiriminize aşağıdakileri ekleyin:

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

Ve sonra ana faaliyetinizde:

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

    // Start regular onCreate()
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

6

en iyi ve basit

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


6

2015, AppCompat temalı destek v7 kitaplığını kullanarak bu temayı Etkinliğiniz için ayarlayın.

<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

Çünkü Splashscreenbu satırı kullanmalı manifestve kullanmamalısınızgetActionBar()

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

ve bir kez Splash aşağıdaki Activityana Activitykullanımda bittiğinde veya hiçbir şey

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

Bu aslında, açılış sayfası için farklı bir tema kullanırsanız, uygulamanızın ana sayfası için geçerlidir. Hem Ana Etkinlik (açılış ekranınız) hem de uygulamanızın temaları değiştiren açılış ekranı olmayan ilk etkinliği için android: theme = "@ style / mytheme" kullanın.
ThanksMister

1
Bu, geçerli API düzeylerinde bir hata verir: "Özellikte android ad alanı öneki eksik." <item android:name="android:windowActionBar">true</item>Bu hatadan kurtulur, ancak hala işe yarayıp yaramadığını bilmiyorum.
LarsH

3

Bunu deneyin, benim için çalışıyor:

Aşağıda etkinlik başlık çubuğundan kurtulur

 requestWindowFeature(Window.FEATURE_NO_TITLE);

Aşağıda, etkinliğin tam ekran görünmesini sağlamak için bildirim çubuğunu ortadan kaldırır

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

(Aşağıda Tam Örnek) Not alın: Faaliyetimizin içerik görünümünü ayarlamadan önce bu yöntemler çağrıldı

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

Lütfen bunun neden işe yaradığını veya neden işe yaradığını düşündüğünüzü açıklayın. Sadece kodu yapıştırmak tam bir cevap vermez.
Kris

@Kris, Oh Ne demek istediğini anlıyorum, teşekkürler!
user3862873

3

bu kullanışlı olabilir
bunu manifestinize ekleyin

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

şerefe


Neden böyle eski bir soruda en iyi cevap kadar büyük bir şey yayınlamıyorsunuz?
Kasım'da gsamaras

'en iyi cevap' bana yardımcı olmadı, bu yüzden kendimi bu cevapla buldum ve buraya gönderdim.
ralphgabb

2

Kullanılabilir tüm seçenekleri okuduktan sonra bulduğum en iyi yol, ana temayı ActionBar olmadan ayarlamak ve daha sonra MyTheme'i tüm Etkinliğin üst kodunda ayarlamaktır.

Belirgin:

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

BaseActivity:

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

Bu şekilde uygulama başladığında ActionBar'dan kaçınmamı sağlıyor!


1

Daha önce yayınlanan çözümler, ilk .show () çağrısının benim için ActionBar'ı canlandırmadığı yan etkisi ile geldi. Bunu düzelten başka bir güzel çözüm buldum:

Şeffaf bir çekilebilir oluşturun - böyle bir şey:

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

Gerçek eylem çubuğu arka planını, eylem çubuğunda ayarladığınız görünmez bir özel görünüme ayarlayın:

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'da eylem çubuğunun şeffaf arka planını ayarlayın:

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

Önemli: Eylem çubuğunu onCreate'de hemen gizlemeyin, ancak daha sonra biraz gecikmeyle - örneğin, düzen oluşturma ile bittiğinde:

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

İlk .show () çağrınızdan önce özel görünümü görünür yapın:

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

1

Destek kitaplığını kullandığınız için null değeriniz getActionBar()varsa, çağırmanız gerekir getSupportActionBar().


1

Bunu onCreate işlevindeki MainActivity'ye ekleyin.

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

androidx üzerinde çalışmaktır. Sadece setContentView () bu satırdan sonra ekleyinsupportActionBar?.apply { hide() }
Black_Zerg

0

Açılış ekranınızı ayrı bir etkinliğe koyun ve görüntülemek startActivityForResultiçin ana etkinliğinizin onCreateyöntemini kullanın. Bu işe yarıyor çünkü belgelere göre:

Özel bir durum olarak, etkinliğinizin ilk onCreate (Bundle savedInstanceState) / onResume () işlemi sırasında requestCode> = 0 ile startActivityForResult () öğesini çağırırsanız, sonuç, başlatılan etkinlikten geri dönene kadar pencereniz görüntülenmez . Bu, başka bir etkinliğe yönlendirilirken görünür titremeyi önlemek içindir.

Muhtemelen sadece argüman yapmalısınız onCreateDİR null(nedeniyle bir yapılandırma değişikliği bir yeniden başlatma aksine etkinlik taze başlatılmasını gösteren).


Bu çalışmıyor. OnCreate () başladığında, eylem çubuğu zaten görünür durumdadır. Bu hata ayıklamada açıkça görülür.
Ilya Izhovkin

0

Hala boş gösterici ile hata vardı ve nihayet ilk getWindow (). RequestFeature () ve sonra super.onCreate () çağrıldığında yardımcı oldu

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

0

Bunu styles.xml dosyasına eklemeniz yeterlidir

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

0

Aslında, Activityile sıçrama NoActionBar ayarlayabilir activityve eylem çubuğuyla ana öğenizi ayarlayabilirsiniz .


0

Bunu yapmanın en iyi yolu, ilk etkinliği boş etkinlik ve koymak istediğiniz içerik olarak yapmak ve daha sonra bir süre sonra başka bir etkinlik başlatmaktır. Bu yolu izleyerek ilk eylemi eylem çubuğu veya herhangi bir şey olmadan açılış ekranınız olarak yapabilirsiniz. Heres benim ilk aktivitem

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

}
}

Bundan sonra aktivitelerinizden herhangi birini ilk aktivite olarak koyabilirsiniz Herhangi bir ekranda herhangi bir eylem çubuğu istemiyorsanız bunu stillerinize ekleyin

    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>

0

Android studio, tam ekran için oluşturma şablonu sağlar, Android studio kullanıyorsanız tam ekran etkinliği uygulamak için aşağıdaki adımı izleyebilirsiniz.

Yeni Etkinlik Oluşturmanın İlk Adımı

Seçin Tam ekran Etkinliği

Bitti. Android studio işinizi yaptı, şimdi tam ekran için kodu kontrol edebilirsiniz.


-1

Bu java dosyasına Git kullandım en iyi yolu, sonra 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

Gönderme bağlantılarının bir şey yapmanın en iyi yolu olmadığını anlıyorum, ancak aşağıdaki belgeleri Google'ın kendisinden okumanızı şiddetle tavsiye ederim. Bu sistem ui (actionbar, nav bar vb. Gibi) kontrol etmek nasıl resmi android doc. Ne yazık ki bilgi doğrudan göndermek için çok fazla, ancak bunu okuduktan sonra hangi sürümü için geliştiriyor olursanız olun, özellikleri nasıl göstereceğini ve gizleyeceğini tam olarak anlayacaksınız, çok basit!

Bağlantı hiç değişiklik Örtmek, bu rejimin resmi android belgelerin altında bulunabilir eğitim -> başlarken -> kullanıcı arabirimi için en iyi uygulamalar -> sistem ui yönetme

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

resim açıklamasını buraya girin


-4

bunu kullanabilirsiniz:

getSupportActionBar().hide(); eğer işe yaramazsa şunu deneyin:

getActionBar().hide();

yukarıdaki işe yaramazsa şöyle deneyin:

dizininizde = res / değerler / style.xml, style.xml dosyasını açın -> özellik parentdeğişikliği varparent="Theme.AppCompat.Light.DarkActionBar"

eğer hepsi de işe yaramazsa. Artık bilmiyorum. ama benim için çalışıyor.


getSupportActionBar () gizlemek (.); oylanan en yüksek yanıt olan getActionBar (). hide (); sorusunda ve Son Nguyen Thanh'ın cevabında DarkActionBar'dan bahsedildi. Artı bu soru 4 yaşında ve zaten birkaç yüksek oyu cevabı var.
augray
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.