Bagaimana cara menyembunyikan bilah tindakan sebelum aktivitas dibuat, dan kemudian tunjukkan lagi?


243

Saya perlu menerapkan splash screen di aplikasi honeycomb saya. Saya menggunakan kode ini di onCreate aktivitas untuk menampilkan splash:

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

dan kode ini untuk menampilkan UI utama setelah beberapa saat:

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

Tetapi sebelum onCreate dipanggil dan splash muncul, ada sedikit waktu ketika bilah tindakan ditampilkan.

Bagaimana saya bisa membuat bilah tindakan tidak terlihat?

Saya mencoba menerapkan tema ke aktivitas tanpa bilah tindakan:

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

tetapi dalam hal ini getActionBar () selalu mengembalikan nol dan saya tidak menemukan cara untuk menunjukkannya lagi.


Untuk Theme.AppCompat.Light... gunakan ini Cara Menjawab [1] [1]: stackoverflow.com/a/25365193/1364896
Sami Eltamawy

Jawaban:


335

Pengaturan android:windowActionBar="false"benar-benar menonaktifkan ActionBar tetapi kemudian, seperti yang Anda katakan, getActionBar();mengembalikan nol. Ini diselesaikan dengan:

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

Ini menciptakan ActionBar dan segera menyembunyikannya sebelum sempat ditampilkan.

Tapi sekarang ada masalah lain. Setelah memasukkan windowActionBar="false"tema, Kegiatan menggambar Judul Jendela yang normal alih-alih ActionBar.
Jika kami mencoba menghindari ini dengan menggunakan beberapa *.NoTitleBartema saham atau kami mencoba untuk memasukkan <item name="android:windowNoTitle">true</item>tema kami sendiri, itu tidak akan berhasil.
Alasannya adalah bahwa ActionBar tergantung pada Judul Jendela untuk menampilkan dirinya - yaitu ActionBar adalah Judul Jendela yang diubah.
Jadi trik yang dapat membantu kami adalah menambahkan satu hal lagi ke tema Aktivitas kami xml:

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

Ini akan membuat Judul Jendela dengan tinggi nol, sehingga praktis tidak terlihat.

Dalam kasus Anda, setelah Anda selesai menampilkan layar splash, Anda cukup menelepon

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

dan kamu selesai. Aktivitas akan dimulai tanpa ActionBar yang berkedip, atau Judul Jendela yang ditampilkan.

ADDON: Jika Anda menampilkan dan menyembunyikan ActionBar beberapa kali mungkin Anda telah memperhatikan bahwa pertama menunjukkan ini tidak animasi. Sejak saat itu menunjukkan dan menyembunyikan dianimasikan. Jika Anda juga ingin membuat animasi pada pertunjukan pertama, Anda dapat menggunakan ini:

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

Hal yang sama dapat dicapai dengan:

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

tetapi mungkin perlu beberapa logika tambahan untuk memeriksa apakah ini adalah tampilan pertama dari Kegiatan.

Idenya adalah untuk menunda sedikit persembunyian ActionBar. Di satu sisi kita membiarkan ActionBar ditampilkan, tetapi kemudian sembunyikan segera. Jadi kita melampaui pertunjukkan non-animasi pertama dan pertunjukkan berikutnya akan dianggap kedua, jadi itu akan dianimasikan.

Seperti yang mungkin sudah Anda duga, ada kemungkinan ActionBar bisa dilihat sebelum disembunyikan oleh operasi yang tertunda. Ini sebenarnya masalahnya. Sebagian besar waktu tidak ada yang terlihat tetapi, sesekali, Anda dapat melihat flicker ActionBar untuk sepersekian detik.

Bagaimanapun ini bukan solusi yang bagus, jadi saya menyambut setiap saran.

Selain untuk pengguna tindakan dukungan v7, kodenya adalah:

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

2
@newton_guima ya, itu berhasil. Ingatlah untuk menggunakan supportRequestWindowFeature (Window.FEATURE_ACTION_BAR)
scana

@Cleric - Bagaimana Anda membuat semua ini bekerja setTheme? Karena jawaban Anda bekerja dengan baik jika saya mengatur tema dari Manifest, tetapi jika saya melakukannya di onCreate(dalam kasus saya tema tergantung pada preferensi untuk tema gelap) bar tindakan holo default berkedip sebelum yang saya atur di tema saya bagaimanapun. Tapi mungkin ini layak pertanyaan SO lengkap lainnya.
dentex

2
@Cleric Terima kasih. Saya menyelesaikan pengaturan masalah saya android:theme="@android:style/Theme.NoTitleBar"ke dalam Manifest dan kemudian setTheme(R.style.MyTheme)di aktivitas utama onCreate; Ini memastikan (di Android 4+) menghindari flash holo default ActionBarsebelum yang saya definisikan dalam tema saya (saya tiba di sini mencari cara untuk mengatasinya; Saya sebenarnya tidak memerlukan splash-screen).
dentex

2
Saya menelepon getSupportActionBar().hide();setelah getWindow().requestFeature(Window.FEATURE_ACTION_BAR);dan semuanya meledak dengan NPE. Ada ide? Masalah dengan Theme.AppCompat?
loeschg

1
@loeschg: Saya memiliki masalah yang sama dan menemukan solusi ini: stackoverflow.com/a/20315456/3514976
nonzaprej

50

Menggunakan kode sederhana ini di file .class Anda untuk menyembunyikan bilah tindakan

getSupportActionBar().hide();

37

Jika Anda menggunakan ActionBarSherlock, gunakan Tema Theme.Sherlock.NoActionBar di Aktivitas Anda

<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
Hal yang sama berlaku untuk standar Android 3+ ActionBar (tidak ada Sherlock): <activity android:theme="@android:style/Theme.NoActionBar">.
Alex Semeniuk

Solusi sempurna :) Terima kasih.
alicanbatur

7
Saya tidak melihat bagaimana ini merupakan jawaban untuk pertanyaan Ilya. Menyetel tema menjadi Theme.Sherlock.NoActionBarberarti menelepon getActionBar()atau getSupportActionBar()(untuk selanjutnya menampilkan bilah tindakan) mengembalikan nol ...
Adil Hussain

@AlexSemeniuk Ketika saya menggunakan baris itu di manifes, saya mendapatkan kesalahan ini:error: Error: No resource found that matches the given name (at 'theme' with value '@android:style/ Theme.NoActionBar').
Si8

1
@ SiKni8 Anda yakin menggunakan perpustakaan API13 + untuk aplikasi Anda?
Alex Semeniuk

19

Buat dua gaya:

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

Tetapkan AppThemeNoBar sebagai tema aplikasi dan AppThemeBar ke aktivitas di mana Anda ingin menampilkan ActionBar. Menggunakan dua gaya Anda tidak akan melihat bilah Tindakan saat pandangan sedang memuat.

Periksa tautan ini Android: sembunyikan bilah tindakan saat melihat memuat


Akhirnya! Bekerja untukku. Terima kasih. :)
Dhofca

Ini tidak berfungsi di Android 2.3.3 dengan AppCompat. ActionBar ditampilkan. Namun, ini berfungsi pada KitKat yaitu.
Yar

17

Hai Saya punya solusi sederhana dengan menggunakan 2 tema

  1. Tema layar splash (tambahkan ke manifes):

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

  2. tema normal (tambahkan dalam aktivitas Anda dengan setTheme (R.style.Theme)):

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

Untuk mendukung SDK 10:

@Override    
public void onCreate(Bundle savedInstanceState) {

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

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

15

Saya juga mencoba menyembunyikan Action Bar di Android 2.2, tetapi tidak ada solusi yang berhasil. Semuanya berakhir dengan kecelakaan. Saya memeriksa DDMS LOg, Ia memberi tahu saya untuk menggunakan 'Theme.AppCompat'.T terakhir saya memecahkan masalah dengan mengubahandroid:theme="@android:style/Theme.Holo.Light.NoActionBar" Baris

ke android:theme="@style/Theme.AppCompat.NoActionBar" dan itu berhasil, tetapi Antarmuka gelap.

lalu saya coba android:theme="@style/Theme.AppCompat.Light.NoActionBar" dan akhirnya mendapatkan apa yang saya inginkan.

Setelah itu ketika saya mencari tentang 'AppCompat' di Situs Pengembang saya mendapat ini.

Jadi saya pikir Solusi untuk Android 2.2 adalah

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

Dan maaf untuk bahasa Inggris burukku Seperti Selalu.


12

Hasil terbaik bagi saya adalah membuat aktivitas dengan ThemeNoTitleBar dan tanpa konten sebagai peluncur. Maka kegiatan ini langsung menelepon ke yang lain.

Tentu saja jika mau, Anda dapat menambahkan konten ke Aktivitas Splash tetapi dalam kasus saya, saya hanya ingin menampilkan aplikasi secara langsung.

Nyata:

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

Aktivitas:

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

Jika Anda menggunakan satu Activitytermasuk layar splash, maka Anda dapat melakukan ini jika menggunakanSherlockActionBar

getSupportActionBar().hide();

Setelah layar splash, Anda dapat menampilkannya lagi dengan ...

getSupportActionBar().show();

Seharusnya sama dengan asli ActionBarAndroid.


6

Solusi @Clerics bekerja. Namun ini tampaknya juga menjadi masalah dengan beberapa aplikasi bawaan Google: Google, Play Store, Talk. Juga aplikasi besar lainnya seperti skype.

EDIT : Solusi di bawah ini telah memberi saya masalah untuk actionbarsherlock on api <4.0, alasannya setTheme tidak bekerja sandwich es krim pre

Tambahkan berikut ini dalam manifes Anda di dalam tag aplikasi atau aktivitas Anda:

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

Dan kemudian dalam aktivitas utama Anda:

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

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

6

terbaik dan sederhana

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


6

2015, menggunakan dukungan perpustakaan v7 dengan tema AppCompat, setel tema ini untuk Aktivitas Anda.

<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

Untuk SplashscreenAnda harus menggunakan baris ini manifestdan jangan gunakangetActionBar()

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

dan sekali ketika Splash Activityselesai Activitydigunakan utama di bawah ini atau tidak sama sekali

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

Ini sebenarnya berfungsi jika Anda menggunakan tema yang berbeda untuk halaman pembuka lalu halaman utama aplikasi Anda. Cukup gunakan android: theme = "@ style / mytheme" untuk Aktivitas Utama (layar splash Anda) dan aktivitas pertama aplikasi Anda yang bukan layar splash yang menukar tema.
ThanksMister

1
Ini memberikan kesalahan pada level API saat ini: "Atribut hilang dengan awalan namespace android." <item android:name="android:windowActionBar">true</item>menghilangkan kesalahan ini, tetapi saya tidak tahu apakah masih berfungsi.
LarsH

3

Coba ini, ini berfungsi untuk saya:

Di bawah ini menghilangkan bilah judul aktivitas

 requestWindowFeature(Window.FEATURE_NO_TITLE);

Di bawah ini menghilangkan bilah notifikasi untuk membuat aktivitas menjadi layar penuh

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

(Contoh Lengkap Di Bawah) Perhatikan: Metode-metode ini dipanggil sebelum kita menetapkan tampilan konten aktivitas kita

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

Harap jelaskan mengapa ini berhasil atau mengapa Anda pikir ini harus berhasil. Hanya menempelkan kode tidak membuat jawaban lengkap.
Kris

@ Kris, Oh, aku mengerti maksudmu, terima kasih!
user3862873

3

ini mungkin berguna,
tambahkan ini ke manifes Anda

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

Bersulang


Mengapa memposting sesuatu yang tidak sehebat jawaban teratas dalam pertanyaan lama seperti itu?
gsamaras

'jawaban atas' tidak membantu saya, jadi saya menemukan jawaban ini dan mempostingnya di sini.
ralphgabb

2

Cara terbaik yang saya temukan setelah membaca semua opsi yang tersedia adalah mengatur tema utama tanpa ActionBar dan kemudian mengatur kode MyTheme dalam induk dari semua Kegiatan.

Nyata:

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

BaseActivity:

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

Cara ini membantu saya menghindari ActionBar saat aplikasi dimulai!


1

Solusi yang sudah diposting datang dengan efek samping, bahwa panggilan .show () pertama tidak menghidupkan ActionBar untuk saya. Saya punya solusi bagus lain, yang memperbaiki itu:

Buat yang dapat digambar transparan - sesuatu seperti itu:

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

Tetapkan latar belakang bilah tindakan yang sebenarnya menjadi tampilan khusus yang tidak terlihat yang Anda tetapkan di bilah tindakan:

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

Atur latar belakang transparan untuk actionbar di onCreate:

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

Penting: Jangan sembunyikan bilah tindakan segera di onCreate, tetapi dengan sedikit penundaan nanti - misalnya ketika tata letak selesai dengan pembuatan:

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

Sebelum panggilan .show () pertama Anda, atur tampilan khusus agar terlihat:

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

1

Jika Anda memiliki null karena Anda menggunakan perpustakaan dukungan , getActionBar()Anda tidak perlu menelepon getSupportActionBar().


1

Cukup tambahkan ini ke MainActivity Anda di fungsi onCreate.

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

ini bekerja di Androidx. Cukup tambahkan setelah setContentView () baris inisupportActionBar?.apply { hide() }
Black_Zerg

0

Letakkan splash screen Anda di aktivitas yang terpisah dan gunakan metode startActivityForResultaktivitas utama Anda onCreateuntuk menampilkannya. Ini berfungsi karena, menurut dokumen:

Sebagai kasus khusus, jika Anda memanggil startActivityForResult () dengan requestCode> = 0 selama onCreate awal (Bundle disimpanInstanceState) / onResume () dari aktivitas Anda, maka jendela Anda tidak akan ditampilkan sampai hasilnya dikembalikan kembali dari aktivitas yang dimulai . Ini untuk menghindari kedipan yang terlihat saat mengarahkan ke aktivitas lain.

Anda mungkin harus melakukan ini hanya jika argumennya onCreateadalah null(menunjukkan peluncuran baru aktivitas Anda, sebagai lawan memulai ulang karena perubahan konfigurasi).


Ini tidak bekerja. Saat onCreate () dimulai, bilah tindakan sudah terlihat. Ini terlihat jelas di debug.
Ilya Izhovkin

0

Saya masih memiliki kesalahan dengan null pointer dan akhirnya membantu ketika saya pertama kali memanggil getWindow (). RequestFeature () dan kemudian super.onCreate ()

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

0

Cukup tambahkan ini di styles.xml Anda

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

0

Sebenarnya, Anda bisa mengatur splash Activitywith NoActionBar dan mengatur main Anda activitydengan action bar.


0

Cara terbaik untuk melakukan ini adalah membuat dua aktivitas pertama sebagai aktivitas kosong dan konten yang ingin Anda masukkan dan kemudian setelah beberapa waktu aktifkan aktivitas lain. Dengan mengikuti cara ini, Anda dapat menjadikan aktivitas pertama sebagai layar pembuka tanpa bilah tindakan atau apa pun. Inilah kegiatan pertama saya

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

}
}

Setelah itu, Anda dapat menempatkan aktivitas apa pun sebagai aktivitas pertama. Jika Anda tidak menginginkan bilah tindakan di layar apa pun, tambahkan saja ini dalam gaya Anda

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

0

Studio Android menyediakan template bangun untuk layar penuh, jika Anda menggunakan studio Android Anda dapat mengikuti langkah di bawah ini untuk mengimplementasikan aktivitas layar penuh.

Langkah Pertama untuk Membuat Aktivitas baru

Pilih pilih Aktivitas layar penuh

Selesai Studio Android melakukan pekerjaan Anda, sekarang Anda dapat memeriksa kode untuk layar penuh.


-1

ini adalah cara terbaik saya menggunakan Go ke file java, setelah 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

Saya menyadari bahwa memposting tautan bukan cara terbaik untuk melakukan sesuatu, tetapi saya sangat menyarankan Anda membaca dokumentasi berikut dari Google sendiri. Ini adalah dokumen resmi android tentang cara mengontrol sistem Anda ui (hal-hal seperti actionbar, nav bar dll). Sayangnya info ini terlalu banyak untuk diposkan secara langsung, tetapi setelah membaca ini Anda akan mengerti persis bagaimana menampilkan dan menyembunyikan fitur apa pun versi yang sedang Anda kembangkan, sangat sederhana!

Jika tautan berubah, dapat ditemukan di bawah dokumentasi android resmi dalam pelatihan -> memulai -> Praktik terbaik untuk antarmuka pengguna -> mengelola sistem ui

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

masukkan deskripsi gambar di sini


-4

Anda bisa menggunakan ini:

getSupportActionBar().hide(); jika tidak berhasil coba yang ini:

getActionBar().hide();

jika di atas tidak berhasil coba seperti ini:

di direktori Anda = res / values ​​/ style.xml, buka style.xml -> ada parentperubahan atributparent="Theme.AppCompat.Light.DarkActionBar"

jika semua itu tidak berhasil juga. saya tidak tahu lagi tetapi bagi saya itu berhasil.


getSupportActionBar (). hide (); disebutkan dalam jawaban pilihan tertinggi, getActionBar (). hide (); disebutkan dalam pertanyaan, dan DarkActionBar disebutkan dalam jawaban Son Nguyen Thanh. Ditambah lagi pertanyaan ini berumur 4 tahun dan sudah memiliki beberapa jawaban pilihan tinggi.
Agustus
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.