Android:能够自动隐藏标题/状态栏吗?

发布于 2024-10-15 23:52:54 字数 298 浏览 2 评论 0原文

我有一个全屏绘图应用程序,它使用 Android Theme.NoTitleBar.Fullscreen 主题禁用标题和状态栏。我收到的请求之一是能够将这些 UI 元素设置为自动隐藏,这样当用户触摸它们所在的位置时,它们就会显示出来。我可以想象使用模拟标题栏的自定义活动来实现此目的的方法,但替换通知栏是不可行的。

所以,只是想知道是否有任何方法可以自动隐藏操作系统标准标题和状态栏。我认为这是“否”,因为这些元素看起来与 onCreate 中的 Activity 相关(或从 onCreate 中的 XML 中扩充),因此一旦处于活动状态,就不可能更改它们的行为。

I have a fullscreen drawing app that disables the title and status bars using the Android Theme.NoTitleBar.Fullscreen theme. One of the requests I am getting would be the ability to have these UI elements set to auto-hide, such that is the user touches near where they would be, they are shown. I can imagine ways to accomplish this using a custom Activity that emulates the title bar, but replacing the notification bar just isn't feasible.

So, just wondering if there is any way to auto-hide the OS standard title and status bars. I would imagine this is NO, as these elements look to be tied to the Activity in onCreate (or inflated from XML in onCreate), so once active, it wouldn't be possible to change their behavior.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

韬韬不绝 2024-10-22 23:52:54

使用 android 3.1,可以通过

View.setSystemUiVisibility(View.STATUS_BAR_HIDDEN);

触摸状态栏所在的位置来设置 UI 状态栏的可见性,状态栏就会出现。

您可以通过该方法监听此内容

View.setOnSystemUiVisibilityChangeListener 

,然后在一段时间后再次隐藏该栏

Using android 3.1, one can set the visibility of the UI Status bar using

View.setSystemUiVisibility(View.STATUS_BAR_HIDDEN);

on touching where the status bar would be, the bar appears.

You can listen for this via the

View.setOnSystemUiVisibilityChangeListener 

method and then hide the bar again after some time

Oo萌小芽oO 2024-10-22 23:52:54

所以,只是想知道是否有任何方法可以自动隐藏操作系统标准标题和状态栏。

我没有见过。

此外,您的用户请求的内容不能一般地完成 - 如果“靠近他们所在的位置”有一个按钮怎么办?

So, just wondering if there is any way to auto-hide the OS standard title and status bars.

None that I have seen.

Moreover, what your user is requesting can't be done generically -- what if there is a Button up "near where they would be"?

給妳壹絲溫柔 2024-10-22 23:52:54

我认为您的问题的解决方案就在 Android Studio 的虚拟全屏项目中。一探究竟:

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

I think the solution to your problem is right in the dummy Fullscreen project Android Studio has. Check it out:

    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);
        }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文