How to hide action bar before activity is created,

2019-01-01 12:14发布

问题:

I need to implement splash screen in my honeycomb app. I use this code in activity\'s onCreate to show splash:

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

and this code to show main UI after sometime:

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

But before onCreate is called and splash appears, there is small amount of time when action bar shown.

How can I make action bar invisible?

I tried to apply theme to activity without action bar:

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

but in that case getActionBar() always returns null and I found no way to show it again.

回答1:

Setting android:windowActionBar=\"false\" truly disables the ActionBar but then, as you say, getActionBar(); returns null. This is solved by:

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

This creates the ActionBar and immediately hides it before it had the chance to be displayed.

But now there is another problem. After putting windowActionBar=\"false\" in the theme, the Activity draws its normal Window Title instead of an ActionBar.
If we try to avoid this by using some of the *.NoTitleBar stock themes or we try to put <item name=\"android:windowNoTitle\">true</item> in our own theme, it won\'t work.
The reason is that the ActionBar depends on the Window Title to display itself - that is the ActionBar is a transformed Window Title.
So the trick which can help us out is to add one more thing to our Activity theme xml:

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

This will make the Window Title with zero height, thus practically invisible .

In your case, after you are done with displaying the splash screen you can simply call

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

and you are done. The Activity will start with no ActionBar flickering, nor Window Title showing.

ADDON: If you show and hide the ActionBar multiple times maybe you have noticed that the first showing is not animated. From then on showing and hiding are animated. If you want to have animation on the first showing too you can use this:

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

The same thing can be achieved with:

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

but it may need some extra logic to check if this is the first showing of the Activity.

The idea is to delay a little the hiding of the ActionBar. In a way we let the ActionBar be shown, but then hide it immediately. Thus we go beyond the first non-animated showing and next showing will be considered second, thus it will be animated.

As you may have guessed there is a chance that the ActionBar could be seen before it has been hidden by the delayed operation. This is actually the case. Most of the time nothing is seen but yet, once in a while, you can see the ActionBar flicker for a split second.

In any case this is not a pretty solution, so I welcome any suggestions.

Addition for v7 support actionbar user, the code will be:

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


回答2:

Using this simple code in your .class file to hide action bar

getSupportActionBar().hide();


回答3:

If you are using ActionBarSherlock, then use Theme.Sherlock.NoActionBar Theme in your Activity

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


回答4:

Create two styles:

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

Set AppThemeNoBar as application theme and AppThemeBar to the activity where you want to show the ActionBar. Using two styles you wont see the Action bar while views are loading.

Check this link Android: hide action bar while view load



回答5:

Hi I have a simple solution by using 2 themes

  1. Splash screen theme (add it to the manifest):

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

  2. normal theme (add it in your activity by setTheme(R.style.Theme)):

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

To support SDK 10:

@Override    
public void onCreate(Bundle savedInstanceState) {

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

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


回答6:

I was also trying to hide Action Bar on Android 2.2, but none of these solution worked. Everything ends with a crash. I checked the DDMS LOg, It was telling me to use \'Theme.AppCompat\'.At last I Solved the problem by changing the android:theme=\"@android:style/Theme.Holo.Light.NoActionBar\"Line

into android:theme=\"@style/Theme.AppCompat.NoActionBar\"and it worked, but the the Interface was dark.

then i tried android:theme=\"@style/Theme.AppCompat.Light.NoActionBar\" and finally got what i wanted.

After that when I Searched about \'AppCompat\' on Developer Site I got This.

So I think the Solution for Android 2.2 is

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

And Sorry for my bad English Like Always.



回答7:

Best result to me was to create an activity with ThemeNoTitleBar and without content as launcher. Then this activity call directly to the other.

Of course if you want you can add content to the Splash Activity but in my case I just wanted to show application directly.

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>

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

}



回答8:

If you use one Activity included a splash screen, then you can do this if you use SherlockActionBar

getSupportActionBar().hide();

After the splash screen you can show it again with ...

getSupportActionBar().show();

It should be the same with native ActionBar of Android.



回答9:

@Clerics solution works. But this appears to also be an issue with some of googles native apps: googles, play store, talk. Also other big apps like skype.

EDIT: Bellow solution have given me problem for actionbarsherlock on api < 4.0, the reason being setTheme doesn\'t work pre ice cream sandwich

Add following in your manifest within you application or activity tags:

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

And then in your main activity:

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

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


回答10:

best and simple

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



回答11:

2015, using support v7 library with AppCompat theme, set this theme for your Activity.

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


回答12:

For Splashscreen you should use this line in manifest and don\'t use getActionBar()

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

and once when Splash Activity is finished in the main Activity use below or nothing

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


回答13:

Try this, it works for me:

Below gets rid of activity\'s title bar

 requestWindowFeature(Window.FEATURE_NO_TITLE);

Below eliminates the notification bar to make the activity go full-screen

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

(Full Example Below) Take note: These methods were called before we set the content view of our activity

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


回答14:

this may be handy
add this to your manifest

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

cheers



回答15:

The best way I find after reading all the available options is set main theme without ActionBar and then set up MyTheme in code in parent of all Activity.

Manifest:

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

BaseActivity:

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

This way helps me to avoid ActionBar when application start!



回答16:

The solutions already posted came with the sideffect, that the first .show() call did not animate the ActionBar for me. I got another nice solution, which fixed that:

Create a transparent drawable - something like that:

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

Set the actual actionbar background to a invisible custom view which you set on the actionbar:

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

Set the transparent background for the actionbar in onCreate:

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

Imortant: Don\'t hide the actionbar immediately in onCreate, but with a little delay later - e.g. when the layout is finished with creation:

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

Before your first .show() call set the custom view visible:

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


回答17:

In case you have null because you are using the support library, instead of getActionBar() you need to call getSupportActionBar().



回答18:

Put your splash screen in a separate activity and use startActivityForResult from your main activity\'s onCreate method to display it. This works because, according to the docs:

As a special case, if you call startActivityForResult() with a requestCode >= 0 during the initial onCreate(Bundle savedInstanceState)/onResume() of your activity, then your window will not be displayed until a result is returned back from the started activity. This is to avoid visible flickering when redirecting to another activity.

You should probably do this only if the argument to onCreate is null (indicating a fresh launch of your activity, as opposed to a restart due to a configuration change).



回答19:

I had still error with null pointer and finally it helped when I called first getWindow().requestFeature() and then super.onCreate()

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


回答20:

Just add this in your styles.xml

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


回答21:

Actually, you could simply set splash Activity with NoActionBar and set your main activity with action bar.



回答22:

The best way to do this is two make the first activity as blank activity and the content you want to put and then after some time fire another activity. By following this way you can make the first activity as your splash screen without action bar or anything. Heres my first activity

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

}
}

After that you can put any of your activity as first activity If you want no action bar in any screen then just add this in your styles

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


回答23:

Android studio provide in build template for full screen, if you use Android studio you can follow below step to implement full screen activity.

\"First

\"Select

Done. Android studio did your job, now you can check code for full screen.



回答24:

I realise that posting links are not the best way to do things, but I highly recommend you read the following documentation from Google themselves. This is the official android doc on how to control your system ui (things like actionbar, nav bar etc). Unfortunately the info is too much to post directly, but after reading this you will understand exactly how to show and hide features no matter what version you are developing for, its so simple!

Incase the link ever changes, it can be found under the official android documentation under training -> getting started -> Best practices for user interface -> managing the system ui

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

\"enter



回答25:

you can use this :

getSupportActionBar().hide(); if it doesn\'t work try this one :

getActionBar().hide();

if above doesn\'t work try like this :

in your directory = res/values/style.xml , open style.xml -> there is attribute parent change to parent=\"Theme.AppCompat.Light.DarkActionBar\"

if all of it doesn\'t work too. i don\'t know anymore. but for me it works.