アクティビティが作成される前にアクションバーを非表示にしてから、再度表示する方法は?


243

ハニカムアプリにスプラッシュスクリーンを実装する必要があります。このコードをアクティビティのonCreateで使用してスプラッシュを表示します。

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

そして、しばらくするとメインUIを表示するこのコード:

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();nullを返します。これは以下によって解決されます:

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"テーマに、活動は通常のウィンドウタイトルの代わりに、アクションバーを描画します。
いくつかの*.NoTitleBarストックテーマを使用してこれを回避しようとしたり<item name="android:windowNoTitle">true</item>、独自のテーマを入れようとしたりすると、うまくいきません。
その理由は、ActionBar ウィンドウタイトルに依存してそれ自体を表示するためです。つまり、ActionBar 変換されたウィンドウタイトルです。
したがって、私たちを助けることができるトリックは、Activityテーマxmlにもう1つ追加することです。

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

これにより、ウィンドウタイトルが高さゼロになり、実質的に非表示になります。

あなたの場合、スプラッシュ画面の表示が終わったら、単に呼び出すことができます

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

これで完了です。アクティビティは、ActionBarのちらつきやウィンドウタイトルの表示なしで始まります。

ADDONは: あなたが表示され、アクションバーを複数回非表示にした場合多分あなたは気づいている最初の上映がされていないアニメーション。それ以降、表示と非表示はアニメーション化されます。最初のショーでもアニメーションを使用したい場合は、これを使用できます。

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を表示させ、すぐに非表示にします。したがって、最初の非アニメーションショーを超えて、次のショーは2番目と見なされ、アニメーション化されます。

ご想像のとおり、遅延操作によって非表示になる前にActionBar が表示される可能性があります。これは実際にそうです。ほとんどの場合、何も表示されませんが、時々、ActionBarが一瞬ちらつくのが見られます。

いずれにせよ、これはかなりの解決策ではないので、私はどんな提案も歓迎します。

v7サポートactionbarユーザーの追加、コードは次のようになります:

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

2
@newton_guimaはい、動作します。ただ、supportRequestWindowFeature(Window.FEATURE_ACTION_BAR)を使用することを忘れない
SCANA

@クレリック-これをどうやって使うのsetThemeですか?私がマニフェストからテーマを設定した場合、あなたの答えはうまくいきますが、私が設定したonCreate場合(私の場合、テーマは暗いテーマのライトの設定に依存します)、デフォルトのホロアクションバーが、テーマで設定したアクションバーの前に点滅します。とにかく。しかし、これは別の完全なSO質問の価値があるかもしれません。
dentex 2014年

2
@クレリックありがとう。私は問題の設定android:theme="@android:style/Theme.NoTitleBar"をマニフェストに解決してからsetTheme(R.style.MyTheme)、メインアクティビティで解決しましたonCreate。これにより、(Android 4以降で)ActionBarテーマで定義したホロの前のデフォルトのホロのフラッシュを回避できます(これを回避する方法を探してここに到着しました。実際にはスプラッシュスクリーンは必要ありません)。
dentex 2014年

2
私はgetSupportActionBar().hide();後で電話しgetWindow().requestFeature(Window.FEATURE_ACTION_BAR);、すべてがNPEで爆破します。何か案は?に問題がありTheme.AppCompatますか?
loeschg 14

1
@loeschg:同じ問題があり、この解決策を見つけました:stackoverflow.com/a/20315456/3514976
nonzaprej

50

.classファイルでこの単純なコードを使用してアクションバーを非表示にする

getSupportActionBar().hide();

37

ActionBarSherlockを使用している場合は、アクティビティでTheme.Sherlock.NoActionBarテーマを使用します

<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(Sherlockなし)にも当てはまります<activity android:theme="@android:style/Theme.NoActionBar">
Alex Semeniuk 2013年

完璧なソリューション:)ありがとう。
alicanbatur 2013年

7
これがイリヤの質問に対する答えであるかどうかはわかりません。テーマを設定するTheme.Sherlock.NoActionBarと、呼び出すgetActionBar()か、またはgetSupportActionBar()(その後アクションバーを表示するために)nullが返されます...
Adil Hussain

私はマニフェストでそのラインを使用する場合@AlexSemeniuk、私はこのエラーを取得する:error: Error: No resource found that matches the given name (at 'theme' with value '@android:style/ Theme.NoActionBar').
SI8

1
@ SiKni8アプリケーションでAPI13 +ライブラリを使用しているか?
Alex Semeniuk 2013

19

2つのスタイルを作成します。

<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を表示するアクティビティに設定します。2つのスタイルを使用すると、ビューの読み込み中にアクションバーが表示されません。

このリンクをチェックAndroid:ビューの読み込み中にアクションバーを非表示にする


最後に!私のために働いた。ありがとう。:)
Dhofca 2014年

これは、AppCompatを搭載したAndroid 2.3.3では機能しません。ActionBarが表示されます。ただし、これはie 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 LOgを確認したところ、「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を使用してアクティビティを作成することでした。次に、このアクティビティは他のアクティビティを直接呼び出します。

もちろん、スプラッシュアクティビティにコンテンツを追加することもできますが、私の場合は、アプリケーションを直接表示したかっただけです。

マニフェスト:

<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ソリューションが機能します。ただし、これはGoogleのネイティブアプリの一部にも問題があるようです:Google、プレイストア、トーク。また、スカイプのような他の大きなアプリ。

編集:ベローソリューションはapi <4.0のactionbarsherlockの問題を私に与えました、理由は設定されている理由

アプリケーションまたはアクティビティタグ内のマニフェストに以下を追加します。

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、AppCompatテーマでサポートv7ライブラリを使用して、アクティビティにこのテーマを設定します。

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

一度スプラッシュActivityが主なActivity使用で終了したとき

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

これは、スプラッシュページとアプリケーションのメインページで異なるテーマを使用する場合に実際に機能します。メインアクティビティ(スプラッシュスクリーン)と、スプラッシュスクリーンがテーマを入れ替えていないアプリケーションの最初のアクティビティの両方にandroid:theme = "@ style / mytheme"を使用するだけです。
ThanksMister 2012年

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

これが機能する理由、またはこれが機能するはずである理由を明確にしてください。コードを貼り付けるだけでは完全な答えにはなりません。
クリス2014

@クリス、ああ、私はあなたが何を意味するのかわかりました、ありがとう!
user3862873 2014

3

これは
あなたのマニフェストにこれを追加すると便利かもしれません

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

乾杯


このような古い質問のトップアンサーほど良くないものを投稿するのはなぜですか?
gsamaras 2014年

「トップアンサー」は役に立たなかったので、この答えを見つけてここに投稿しました。
ラルフガブ2014年

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

Imortant:onCreateでアクションバーをすぐに非表示にしないでください。ただし、レイアウトが作成で終了したときなど、少し遅れて表示されます。

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

最初の.show()呼び出しの前に、カスタムビューを表示するように設定します。

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

1

サポートライブラリを使用しているためにnullがある場合は、getActionBar()呼び出す必要はありませんgetSupportActionBar()


1

これをonCreate関数のMainActivityに追加するだけです。

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

androidxでの作業です。この行をsetContentView()の後に追加するだけsupportActionBar?.apply { hide() }
Black_Zerg

0

スプラッシュスクリーンを別のアクティビティに置き、startActivityForResultメインアクティビティのonCreateメソッドから使​​用してそれを表示します。ドキュメントによると、これは機能します:

特殊なケースとして、アクティビティの最初のonCreate(Bundle savedInstanceState)/ onResume()の間にrequestCode> = 0でstartActivityForResult()を呼び出すと、開始されたアクティビティから結果が返されるまでウィンドウは表示されません。 。これは、別のアクティビティにリダイレクトするときに目に見えるちらつきを避けるためです。

への引数onCreatenull(構成の変更による再起動ではなく、アクティビティの新規起動を示す)場合にのみ、これを行う必要があります。


これは動作しません。onCreate()が開始すると、アクションバーはすでに表示されています。これはデバッグではっきりと見られます。
Ilya Izhovkin

0

私はまだnullポインターでエラーがあり、最後に最初にgetWindow()。requestFeature()を呼び出してからsuper.onCreate()を呼び出したときにそれが助けになりました

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


0

実際には、単にスプラッシュActivityNoActionBar 設定し、メイン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 Studioは、フルスクリーン用のビルドテンプレートを提供します。AndroidStudioを使用している場合は、以下の手順に従ってフルスクリーンアクティビティを実装できます。

新しいアクティビティを作成するための最初のステップ

フルスクリーンアクティビティを選択します

できました。Androidスタジオがあなたの仕事をしました。これで、フルスクリーンのコードを確認できます。


-1

これは、後にGo to java fileを使用する最良の方法です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から次のドキュメントを読むことを強くお勧めします。これは、システムUI(アクションバー、ナビゲーションバーなど)を制御する方法に関する公式のAndroidドキュメントです。残念ながら、この情報は直接投稿するには多すぎますが、これを読んだ後は、開発しているバージョンに関係なく、機能を表示または非表示にする方法を簡単に理解できます。

リンクは、これまでに変更包み、下の公式アンドロイドのドキュメントで見つけることができるトレーニング > - 入門 - > ユーザインターフェイスのためのベストプラクティス - > システムUIを管理します

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()。hide(); 最高投票の回答であるgetActionBar()。hide();で言及されました。質問で言及され、DarkActionBarがSon Nguyen Thanhの回答で言及されました。さらに、この質問は4年前のものであり、すでにいくつかの高票の回答があります。
Augray '10 / 10/04
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.