활동이 생성되기 전에 작업 표시 줄을 숨기고 다시 표시하는 방법은 무엇입니까?


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"테마를 넣은 후 활동은 ActionBar 대신 일반 창 제목을 그립니다.
일부 *.NoTitleBar주식 테마 를 사용하여이를 피하려고 하거나 <item name="android:windowNoTitle">true</item>자체 테마 를 넣으려고 시도하면 작동하지 않습니다.
그 이유는 ActionBar가 자신을 표시하기 위해 Window Title에 의존하기 때문입니다. 즉 ActionBar는 변형 된 Window Title입니다.
따라서 우리를 도울 수있는 트릭은 Activity 테마 xml에 한 가지 더 추가하는 것입니다.

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

이렇게하면 높이가 0 인 창 제목이 만들어져 사실상 보이지 않게됩니다.

귀하의 경우 스플래시 화면 표시가 끝나면 간단하게 전화를 걸 수 있습니다.

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

그리고 당신은 끝났습니다. 활동은 ActionBar 깜박임이나 창 제목 표시없이 시작됩니다.

추가 : 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가 보이도록하지만 즉시 숨 깁니다. 따라서 우리는 애니메이션이 아닌 첫 번째 쇼를 넘어 다음 쇼가 두 번째로 간주되므로 애니메이션이 적용됩니다.

짐작할 수 있듯이 지연된 작업으로 숨겨지기 전에 ActionBar 가 표시 있습니다. 이것은 사실입니다. 대부분의 경우 아무 것도 보이지 않지만, 가끔씩 ActionBar가 잠시 깜박 거릴 수 있습니다.

어쨌든 이것은 좋은 해결책이 아니므로 제안을 환영합니다.

추가 V7 지원 액션 바의 사용자는 코드는 다음과 같습니다

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

2
@ newton_guima 예, 작동합니다. supportRequestWindowFeature (Window.FEATURE_ACTION_BAR)를 사용하십시오.
scana

@Cleric-이 모든 것을 어떻게 사용할 수 setTheme있습니까? 매니페스트에서 테마를 설정하면 대답이 훌륭하게 작동하지만 테마를 설정하면 (테마 onCreate는 어두운 테마에 대한 선호도에 따라 다름) 기본 홀로 액션 바가 테마에서 설정 한 것보다 먼저 깜박입니다. 어쨌든. 그러나 이것은 또 다른 완전한 SO 질문의 가치가 있습니다.
dentex

2
@Cleric 감사합니다. 문제 설정 android:theme="@android:style/Theme.NoTitleBar"을 매니페스트로 설정 한 다음 setTheme(R.style.MyTheme)주요 활동에서 해결했습니다 onCreate. 이렇게하면 (Android 4 이상) ActionBar테마에서 정의 한 것보다 기본 홀로의 플래시를 피할 수 있습니다 (이 문제 를 해결할 방법을 찾기 위해 여기에 도착했습니다. 실제로 스플래시 화면이 필요하지 않습니다).
dentex

2
나는 전화 getSupportActionBar().hide();getWindow().requestFeature(Window.FEATURE_ACTION_BAR);걸었고 모든 것이 NPE와 함께 터졌습니다. 어떤 아이디어? 문제가 Theme.AppCompat있습니까?
loeschg

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

완벽한 솔루션 :) 감사합니다.
alicanbatur

7
이것이 Ilya의 질문에 어떻게 대답하는지 모르겠습니다. 테마를 설정 할 수 Theme.Sherlock.NoActionBar호출 의미한다 getActionBar()getSupportActionBar()... 반환 널 (작업 표시 줄 표시 이후에)를
아딜 후세인

@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

19

두 가지 스타일을 만듭니다.

<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를 표시하려는 활동으로 설정하십시오. 두 가지 스타일을 사용하면 뷰가로드되는 동안 조치 막대가 표시되지 않습니다.

이 링크 확인 Android :보기로드시 작업 표시 줄 숨기기


드디어! 나를 위해 일했다. 감사. :)
Dhofca 2016 년

AppCompat가 설치된 Android 2.3.3에서는 작동하지 않습니다. ActionBar가 표시됩니다. 그러나 이것은 KitKat에서 작동합니다.
Yar

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'을 검색했을 때 이것을 얻었습니다.

그래서 안드로이드 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

@ 클레릭 스 솔루션이 작동합니다. 그러나 이것은 Google의 고유 앱 인 Google, Play Store, Talk에서도 문제가되는 것으로 보입니다. 스카이프와 같은 다른 큰 앱도 있습니다.

편집 : 벨로우 솔루션으로 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>

스플래시 ActivityActivity아래 의 주요 용도로 완료 되거나 아무것도 없을 때

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

스플래시 페이지에 다른 테마를 사용하고 애플리케이션의 기본 페이지를 사용하는 경우 실제로 작동합니다. 메인 활동 (스플래쉬 화면)과 테마가 스왑 아웃되는 스플래쉬 화면이 아닌 애플리케이션의 첫 번째 활동 모두에 android : theme = "@ style / mytheme"를 사용하십시오.
ThanksMister

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

왜 이것이 효과가 있는지 또는 왜 이것이 효과가 있다고 생각하는지 설명하십시오. 코드를 붙여 넣기 만해도 완전한 답을 얻을 수는 없습니다.
Kris

@ 크리스, 오 무슨 말인지 알 겠어, 고마워!
user3862873

3

이것은
당신의 매니페스트에 이것을 추가하는 것이 편리 할 수 ​​있습니다

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

건배


왜 오래된 질문에 가장 답이 좋지 않은 것을 게시해야합니까?
gsamaras

'최고의 답변'이 도움이되지 않으므로이 답변으로 자신을 발견하고 여기에 게시했습니다.
ralphgabb

2

사용 가능한 모든 옵션을 읽은 후 찾는 가장 좋은 방법은 ActionBar없이 기본 테마를 설정 한 다음 모든 활동의 부모 코드에서 MyTheme을 설정하는 것입니다.

명백한:

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

기본 활동 :

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

불멸의 : 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() }
뒤에이

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는 전체 화면 용 빌드 템플릿을 제공합니다. Android Studio를 사용하는 경우 아래 단계에 따라 전체 화면 활동을 구현할 수 있습니다.

새로운 활동을 만들기위한 첫 단계

전체 화면 활동 선택을 선택하십시오.

끝난. Android Studio에서 작업을 완료했습니다. 이제 전체 화면의 코드를 확인할 수 있습니다.


-1

이것이 내가 자바 파일로 이동하는 가장 좋은 방법입니다 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 (액션 바, 네비게이션 바 등)를 제어하는 ​​방법에 대한 공식 안드로이드 문서입니다. 불행히도 정보는 직접 게시하기에는 너무 많지만이 내용을 읽은 후에는 개발중인 버전에 상관없이 기능을 표시하고 숨기는 방법을 정확하게 이해할 수 있습니다.

링크가 변경되는 경우 교육 -> 시작 -> 사용자 인터페이스 모범 사례 -> 시스템 UI 관리의 공식 안드로이드 설명서에서 찾을 수 있습니다

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

여기에 이미지 설명을 입력하십시오


-4

당신은 이것을 사용할 수 있습니다 :

getSupportActionBar().hide(); 작동하지 않으면 다음을 시도하십시오.

getActionBar().hide();

위의 방법으로 문제가 해결되지 않으면 다음과 같이 시도하십시오.

디렉토리 = res / values ​​/ style.xml에서 style.xml을여십시오-> 속성 parentparent="Theme.AppCompat.Light.DarkActionBar"

모든 것이 작동하지 않으면. 나는 더 이상 모른다. 그러나 나를 위해 작동합니다.


getSupportActionBar (). hide (); 가장 많이 투표 된 답변 getActionBar (). hide (); 이 질문에 언급되었으며 Son Nguyen Thanh의 답변에 DarkActionBar가 언급되었습니다. 또한이 질문은 4 세이며 이미 많은 투표 답변이 있습니다.
augray
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.