it-swarm.com.ru

Как скрыть панель действий перед созданием активности, а затем показать ее снова?

Мне нужно реализовать заставку в моем сотовом приложении .. Я использую этот код в onCreate действия, чтобы показать заставку:

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

и этот код, чтобы показать основной интерфейс через некоторое время:

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

Но перед onCreate вызывается и появляется всплеск, есть небольшая часть времени, когда отображается панель действий.

Как сделать панель действий невидимой?

Я пытался применить тему к активности без панели действий:

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

но в этом случае getActionBar () всегда возвращает ноль, и я не нашел способа показать это снова.

232
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.
Если мы попытаемся избежать этого, используя некоторые из стандартных тем *.NoTitleBar, или попытаемся добавить <item name="Android:windowNoTitle">true</item> в нашу собственную тему, это не сработает.
Причина в том, что ActionBar зависит от заголовка окна для отображения самого себя - то есть ActionBar является преобразованным заголовком окна.
Таким образом, хитрость, которая может помочь нам, состоит в том, чтобы добавить еще одну вещь в нашу тему Activity xml:

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

Это сделает заголовок окна с нулевой высотой, таким образом, практически невидимым.

В вашем случае, после того, как вы закончили с отображением заставки, вы можете просто позвонить 

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

и вы сделали. Действие начнется без мерцания ActionBar и отображения заголовка окна.

ADDON: Если вы показываете и скрываете панель действий несколько раз, возможно, вы заметили, что показ first анимирован not. С тех пор показ и сокрытие анимированы. Если вы хотите использовать анимацию при первом показе, вы можете использовать это:

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();
330
Cleric

Используя этот простой код в вашем файле .class, чтобы скрыть панель действий

getSupportActionBar().hide();
45
gaurav

Если вы используете ActionBarSherlock, то используйте Theme.Sherlock.NoActionBar Theme в своей деятельности. 

<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

Создайте два стиля:

<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, но ни одно из этих решений не помогло. Все заканчивается крахом. Я проверил журнал DDMS, он говорил мне использовать «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>

И извините за мой плохой английский, как всегда.

14
S.Ahsan

Лучшим результатом для меня было создание деятельности с ThemeNoTitleBar и без содержимого в качестве средства запуска. Тогда эту деятельность призовите непосредственно к другому. 

Конечно, если вы хотите, вы можете добавить контент в Splash Activity, но в моем случае я просто хотел показать приложение напрямую.

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>

Деятельность:

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

Если вы используете одну Activity включающую заставку, то вы можете сделать это, если вы используете SherlockActionBar

getSupportActionBar().hide();

После заставки вы можете показать его снова с ...

getSupportActionBar().show();

Это должно быть то же самое с родной ActionBar Android.

9
Luser_k

лучший и простой

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

6
arslan haktic

2015, используя библиотеку поддержки v7 с темой AppCompat, установите эту тему для своей деятельности.

<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
Son Nguyen Thanh

Решение @Clerics работает. Но, похоже, это также проблема с некоторыми нативными приложениями googles: googles, Play Store, talk. Также другие большие приложения, такие как Skype.

EDIT: Сильфонное решение дало мне проблему для actionbarsherlock на api <4.0, причина была установленаTheme не работает до бутерброда с мороженым

Добавьте в свой манифест следующее в тегах приложения или активности:

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>

и один раз, когда Splash Activity закончится в основном Activity используйте ниже или ничего

<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, а затем настроить MyTheme в коде в родительском элементе всех действий.

Manifest:

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

BaseActivity:

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

Этот способ помогает мне избежать ActionBar при запуске приложения!

2
DmRomantsov

В случае, если у вас есть null, потому что вы используете библиотеку support вместо getActionBar(), вам нужно вызвать getSupportActionBar().

1
Naskov

Уже опубликованные решения имели побочный эффект: первый вызов .show () не оживил ActionBar для меня .... Я получил еще одно решение Nice, которое исправило это:

Создайте прозрачный чертеж - что-то вроде этого:

<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 вашего основного действия, чтобы отобразить его. Это работает, потому что, согласно документам:

В особом случае, если вы вызываете startActivityForResult () с requestCode> = 0 во время начального onCreate (Bundle saveInstanceState)/onResume () вашей активности, то ваше окно не будет отображаться до тех пор, пока результат не будет возвращен из запущенной операции , Это необходимо для предотвращения видимого мерцания при перенаправлении на другое действие.

Вероятно, вам следует делать это только в том случае, если аргумент onCreate равен null (что указывает на новый запуск вашей активности, а не на перезапуск из-за изменения конфигурации).

0
Ted Hopp

Просто добавьте это в вашем styles.xml

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

У меня все еще была ошибка с нулевым указателем, и, наконец, это помогло, когда я вызвал сначала getWindow (). RequestFeature (), а затем super.onCreate () 

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

Просто добавьте это к вашей MainActivity в функции onCreate.

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

На самом деле, вы можете просто установить заставку Activity с помощью NoActionBar И установить свой основной activity с помощью панели действий. 

0
Chauyan