web-dev-qa-db-ja.com

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

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

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

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

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

しかし、onCreateが呼び出されてスプラッシュが表示される前に、アクションバーが表示されるまでに少し時間がかかります。

アクションバーを非表示にする方法

アクションバーを使わずにテーマをアクティビティに適用しようとしました。

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

しかしその場合、getActionBar()は常にnullを返し、再度表示する方法が見つかりませんでした。

235
Ilya Izhovkin

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

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

これによりウィンドウタイトルの高さがゼロになり、実質的に見えなくなります。

あなたのケースでは、スプラッシュスクリーンを表示し終えた後、あなたは単に呼ぶことができます

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

そして、あなたは終わりました。アクティビティは、ActionBarのちらつきやウィンドウタイトルの表示なしで開始されます。

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

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対応のアクションバーユーザーのための追加、コードは次のようになります。

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

アクションバーを隠すためにあなたの.classファイルでこの単純なコードを使う

getSupportActionBar().hide();
47
gaurav

ActionBarSherlockを使用している場合は、Activityで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>
37
kaubatak

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を設定します。

このリンクをチェックしてください Android:ビューロード中にアクションバーを非表示にします

19
Laranjeiro

こんにちは私は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);

      ...........
      ...........
}
17
Abdullah

私はまた、Android 2.2上でAction Barを隠そうとしていましたが、これらの解決策はどれもうまくいきませんでした。すべてがクラッシュで終わります。 DDMS LOGをチェックしました、それは 'Theme.AppCompat'を使用するように私に言っていました。最後に私はAndroid:theme="@Android:style/Theme.Holo.Light.NoActionBar"Lineを変更することによって問題を解決しました

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>

そしていつものように私の悪い英語ですみません。

15
S.Ahsan

私にとって最良の結果は、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();
}

}

11
javak

スプラッシュスクリーンを含む1つのActivityを使用する場合、SherlockActionBarを使用すればこれを実行できます

getSupportActionBar().hide();

スプラッシュスクリーンの後、あなたは再びそれを見せることができます...

getSupportActionBar().show();

AndroidのネイティブActionBarと同じであるべきです。

9
Luser_k

ベストでシンプル

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

6
arslan haktic

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

@クレリックスソリューションは機能します。しかし、これはgooglesネイティブアプリのいくつかでも問題になっているようです:googles、Playストア、talk。スカイプのような他の大きなアプリも。

EDIT:api <4.0でアクションバーロックの問題が解決されない。

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

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
Warpzit

Splashscreenでは、manifestでこの行を使用し、getActionBar()は使用しないでください。

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

そして、スプラッシュActivityがメインのActivityの使用で終了したとき、または以下が1回もありません。

<item name="Android:windowActionBar">true</item>
4
ingsaurabh

これを試して、それは私のために働く:

下は活動のタイトルバーを取り除きます

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

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

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

乾杯

3
ralphgabb

すべての利用可能なオプションを読んだ後に私が見つける最良の方法は、ActionBarなしでメインテーマを設定してから、すべてのActivityの親にコードでMyThemeを設定することです。

マニフェスト:

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

基本アクティビティ:

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

これにより、アプリケーション起動時にActionBarを回避することができます。

2
DmRomantsov

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

1
Naskov

すでに掲載されている解決策には副作用があり、最初の.show()呼び出しではアクションバーがアニメートされませんでした。私はもう一つのいい解決策を得ました、それはそれを修正しました:

透明なドロアブルを作成します - そのようなもの:

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

重要:onCreateですぐにアクションバーを非表示にしないでください。ただし、後で少し遅れてください。レイアウトの作成が完了したら

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

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

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

スプラッシュスクリーンを別のアクティビティに配置して、メインアクティビティのstartActivityForResultメソッドから onCreate を使用して表示します。 docsによると、これはうまくいく。

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

onCreateへの引数がnull(設定変更による再起動ではなく、アクティビティの新たな起動を示す)の場合のみ、おそらくこれを行うべきです。

0
Ted Hopp

これをstyles.xmlに追加するだけです。

<item name="Android:windowNoTitle">true</item>
0
Jakub Trzcinka

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

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

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

val actionBar = supportActionBar?.apply { hide() }
0
MöritzRo

これを行うための最善の方法は、最初のアクティビティを空白のアクティビティとして作成し、コンテンツを追加してしばらくしてから別のアクティビティを起動することです。このようにすれば、アクションバーなどを使わずに最初のアクティビティをスプラッシュスクリーンとして実行できます。私の最初の活動

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
ashad

Androidスタジオはフルスクリーン用のビルドテンプレートを提供します。Androidスタジオを使用する場合は、以下の手順に従ってフルスクリーンアクティビティを実装できます。

First Step to Create new Activity

Select select Full screen Activity

完了しました。 Androidスタジオがあなたの仕事をしました、今、あなたはフルスクリーンのためにコードをチェックすることができます。

0

実際には、スプラッシュActivityNoActionBarで設定し、メインのactivityをアクションバーで簡単に設定できます。

0
Chauyan