Активность мастера полноэкранного действия. Как отключить отображение панели действий при взаимодействии с устройством?

Когда я создаю действие с помощью мастера полноэкранного просмотра, он создает полноэкранную активность, но всякий раз, когда я нажимаю в любом месте экрана, панель действий показывает несколько секунд. Как я могу остановить это от этого?

Полный код FullScreenActivity.java

/**
 * An example full-screen activity that shows and hides the system UI (i.e.
 * status bar and navigation/system bar) with user interaction.
 * 
 * @see SystemUiHider
 */
public class FullscreenActivity extends Activity {
    /**
     * Whether or not the system UI should be auto-hidden after
     * {@link #AUTO_HIDE_DELAY_MILLIS} milliseconds.
     */
    private static final boolean AUTO_HIDE = true;

    /**
     * If {@link #AUTO_HIDE} is set, the number of milliseconds to wait after
     * user interaction before hiding the system UI.
     */
    private static final int AUTO_HIDE_DELAY_MILLIS = 3000;

    /**
     * If set, will toggle the system UI visibility upon interaction. Otherwise,
     * will show the system UI visibility upon interaction.
     */
    private static final boolean TOGGLE_ON_CLICK = true;

    /**
     * The flags to pass to {@link SystemUiHider#getInstance}.
     */
    private static final int HIDER_FLAGS = SystemUiHider.FLAG_HIDE_NAVIGATION;

    /**
     * The instance of the {@link SystemUiHider} for this activity.
     */
    private SystemUiHider mSystemUiHider;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_fullscreen);

        final View controlsView = findViewById(R.id.fullscreen_content_controls);
        final View contentView = findViewById(R.id.fullscreen_content);

        // Set up an instance of SystemUiHider to control the system UI for
        // this activity.
        mSystemUiHider = SystemUiHider.getInstance(this, contentView,
                HIDER_FLAGS);
        mSystemUiHider.setup();
        mSystemUiHider
                .setOnVisibilityChangeListener(new SystemUiHider.OnVisibilityChangeListener() {
                    // Cached values.
                    int mControlsHeight;
                    int mShortAnimTime;

                    @Override
                    @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
                    public void onVisibilityChange(boolean visible) {
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
                            // If the ViewPropertyAnimator API is available
                            // (Honeycomb MR2 and later), use it to animate the
                            // in-layout UI controls at the bottom of the
                            // screen.
                            if (mControlsHeight == 0) {
                                mControlsHeight = controlsView.getHeight();
                            }
                            if (mShortAnimTime == 0) {
                                mShortAnimTime = getResources().getInteger(
                                        android.R.integer.config_shortAnimTime);
                            }
                            controlsView
                                    .animate()
                                    .translationY(visible ? 0 : mControlsHeight)
                                    .setDuration(mShortAnimTime);
                        } else {
                            // If the ViewPropertyAnimator APIs aren't
                            // available, simply show or hide the in-layout UI
                            // controls.
                            controlsView.setVisibility(visible ? View.VISIBLE
                                    : View.GONE);
                        }

                        if (visible && AUTO_HIDE) {
                            // Schedule a hide().
                            delayedHide(AUTO_HIDE_DELAY_MILLIS);
                        }
                    }
                });

        // Set up the user interaction to manually show or hide the system UI.
        contentView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (TOGGLE_ON_CLICK) {
                    mSystemUiHider.toggle();
                } else {
                    mSystemUiHider.show();
                }
            }
        });

        // Upon interacting with UI controls, delay any scheduled hide()
        // operations to prevent the jarring behavior of controls going away
        // while interacting with the UI.
        findViewById(R.id.dummy_button).setOnTouchListener(
                mDelayHideTouchListener);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);

        // Trigger the initial hide() shortly after the activity has been
        // created, to briefly hint to the user that UI controls
        // are available.
        delayedHide(100);
    }

    /**
     * Touch listener to use for in-layout UI controls to delay hiding the
     * system UI. This is to prevent the jarring behavior of controls going away
     * while interacting with activity UI.
     */
    View.OnTouchListener mDelayHideTouchListener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            if (AUTO_HIDE) {
                delayedHide(AUTO_HIDE_DELAY_MILLIS);
            }
            return false;
        }
    };

    Handler mHideHandler = new Handler();
    Runnable mHideRunnable = new Runnable() {
        @Override
        public void run() {
            mSystemUiHider.hide();
        }
    };

    /**
     * Schedules a call to hide() in [delay] milliseconds, canceling any
     * previously scheduled calls.
     */
    private void delayedHide(int delayMillis) {
        mHideHandler.removeCallbacks(mHideRunnable);
        mHideHandler.postDelayed(mHideRunnable, delayMillis);
    }
}

Ответ 1

Если я правильно понимаю, вы просто хотите скрыть панель действий?

если да, измените эту строку (изменив flag_hide_navigation на 0).

private static final int HIDER_FLAGS = 0;// SystemUiHider.FLAG_HIDE_NAVIGATION;

и добавьте это в вызов onCreate:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getWindow().requestFeature(Window.FEATURE_ACTION_BAR);   //new
    getActionBar().hide();                                   //new
    getWindow().setFlags(
         WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

    setContentView(R.layout.activity_fullscreen);

после этого, если вы хотите отобразить панель действий, просто вызовите из любой точки действия:

getActionBar().show();

Ответ 2

Я пробовал то же самое, поставив 0 вместо 3000

private static final int AUTO_HIDE_DELAY_MILLIS = 3000;

Но его становление слишком отсталым... Итак, трюк u внести изменения в androidmanifest.xml добавить

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

to androidmanifest.xml underApplication

Ответ 3

Это сработало для меня. Хотя навигатор не удаляется полностью, он не позволяет много времени для взаимодействия с пользователем, а также значки кнопок - маленькие точки. Кроме того, это сокращает количество кода, необходимого во всем, чтобы сделать экран в полноэкранном режиме.

SystemUiHider hider = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //go full screen with no title
    this.requestWindowFeature(Window.FEATURE_PROGRESS); //show progress on loadup
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); //hide the title bar
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //go fullscreen

    setContentView(R.layout.activity_main);

    //hide the navigation controls
    final RelativeLayout mainLayout = (RelativeLayout)this.findViewById(R.id.mainLayout);
    hider = SystemUiHider.getInstance(this, mainLayout, SystemUiHider.FLAG_HIDE_NAVIGATION);
    hider.setup();
    hider.setOnVisibilityChangeListener(new SystemUiHider.OnVisibilityChangeListener() {
        @Override
        @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
        public void onVisibilityChange(boolean visible) {
            if (visible) {
                //will make navigator into small dots
                hider.hide(); 

                //must use delayed to force navigator to disappear completely
                final Handler mHideHandler = new Handler();
                final Runnable mHideRunnable = new Runnable() {
                    @Override
                    public void run() {
                        hider.hide();
                    }
                };
                mHideHandler.removeCallbacks(mHideRunnable);
                mHideHandler.postDelayed(mHideRunnable, 1000); //min 1 sec to work
            }
        }
    });
    hider.hide();

    //do the rest of your onCreate stuff here
}

Ответ 4

Я глубоко изучил код и начал работу на устройстве Android 4.2 без кнопок физической навигации. Конфигурация по умолчанию максимально полно. Он скрывает панель состояния, панель действий и панель навигации. Итак, как пользователь должен был выйти из вашей деятельности, если бы не щелкнул нигде на экране? Все остальное будет очень ограниченным и плохим юзабилити. Я думаю, что это причина, по которой это поведение нельзя манипулировать.

Вместо этого вы можете изменить SystemUiHider так, чтобы он скрывал строку состояния и панель действий, но не панель навигации. Вместо этого тускнет навигационную панель до трех бледных точек, см. Снимок экрана ниже.

dimmed navigation bar

Должен быть лучший способ добиться этого, но следующие работы. Прокомментируйте эти строки в конце конструктора SystemUiHiderHoneycomb():

if ((mFlags & FLAG_HIDE_NAVIGATION) != 0) {
    // If the client requested hiding navigation, add relevant flags.
    mShowFlags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
    mHideFlags |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
    mTestFlags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
}

Затем активность остается в полноэкранном режиме при взаимодействии с пользователем, и вы можете toggle() на конкретном событии. Конечно, вам все равно придется внести изменения из моего первоначального ответа, чтобы отключить поведение кликов.


Оригинальный ответ:

Я думаю, вы должны прокомментировать эту часть:

// Set up the user interaction to manually show or hide the system UI.
contentView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (TOGGLE_ON_CLICK) {
            mSystemUiHider.toggle();
        } else {
            mSystemUiHider.show();
        }
    }
});

Ответ 5

В api19 мы можем использовать:

getWindow().getDecorView()
    .setSystemUiVisibility(View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                           | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); 

чтобы скрыть панель навигации вместе со строкой состояния

Ответ 6

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

Ответ 7

Хотя его слишком поздно, чтобы опубликовать ответ, но насколько я могу понять этот вопрос, и поскольку я работаю с использованием шаблона Full Screen Activity, представленного в Android Studio, я думаю, что ответ на этот вопрос заключается в отключении панели действий который становится видимым, когда пользователь взаимодействует с пользовательским интерфейсом, что может быть достигнуто просто отключением OnClickListener on contentView то есть.

contentView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if (TOGGLE_ON_CLICK) {
            mSystemUiHider.toggle();
        } else {
            mSystemUiHider.show();
        }
    }
});

то есть. закомментируйте реализацию метода onClick.

Ответ 8

Просто закомментируйте

if (TOGGLE_ON_CLICK) {
                    mSystemUiHider.toggle();
                } else {
                    mSystemUiHider.show();
                }

По умолчанию состояние выключено. Toggle происходит потому, что добавлен прослушиватель onclick, который переключает экран. Вы просто не можете добавить его и удалить фрагмент кода.

Самый новый код // Настройте взаимодействие пользователя, чтобы вручную отобразить или скрыть системный интерфейс.

mContentView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
           // toggle();
        }

Я просто прокомментировал toggle() и voila