4

ユーザーがstatus- & navigation-barにアクセスできないフルスクリーンアプリケーションを実現しようとしています。

できればそれらを完全に削除したいのですが、私が読んだ限りでは、デバイスをルート化しない限り、これは不可能です

したがって、私の質問は基本的に次のとおりです。ポップアップメニューを表示するときに、ナビゲーションバーのアイコンを非表示にするにはどうすればよいですか?

前

後

これまでのところ、私は試しました:

  • hideNavigation()ポップアップ メニューが表示される前後の呼び出し
  • 呼びかけるhideNavigation()_onCreate(), onResume() & onWindowFocusChanged()
  • 別のビューへのフォーカスのリクエスト
  • ドロップダウンからフォーカスをクリアしようとしています (試行の失敗、これを行う方法が実際には見つかりませんでした)
  • アイコンの色を変更すると、「偽装」して非表示になります (試行に失敗しました。これを行う方法が実際には見つかりませんでした)
  • hideNavigation()と組み合わせて使用​​するHandler(試行に失敗しました。正しく実行しなかった可能性があります)
  • いくつかの COSU/KIOSK モード オプションを設定しようとしています (ナビゲーション バー全体を完全に無効にする方法があるのではないでしょうか?戻るボタンを非表示にする方法はまだ見つかりません) 。

アクティビティ


    class PinCodeActivity, HasTitleBar {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_pin_code)
            initTitleBarWith(this)
            hideNavigation()
        }

        override fun onResume() {
            super.onResume()
            hideNavigation()
        }

        fun hideNavigation() {
            window.decorView.apply {
                systemUiVisibility = FLAGS
            }
        }

        override fun onWindowFocusChanged(hasFocus: Boolean) {
            super.onWindowFocusChanged(hasFocus)
            hideNavigation()
        }
    }

const val FLAGS = (View.SYSTEM_UI_FLAG_LOW_PROFILE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)

タイトルバー


    fun HasTitleBar.initTitleBarWith(activity: Activity, resId: Int = R.id.titleBar) {
        val langButton = activity.findViewById<View>(resId).findViewById<Button>(R.id.tbLanguageChoiceBtn)
        val wrapper = ContextThemeWrapper(activity, R.style.MyPopupMenu)
        val popupMenu = PopUpLanguageMenu(wrapper, langButton)
        langButton.setOnClickListener {
            activity.hideNavigation()
            popupMenu.showMenu()
            activity.hideNavigation()
        }
    }

ポップアップメニュー


    class PopUpLanguageMenu constructor(context: Context, view: View) : PopupMenu(context, view) {

        private var popupHelper: MenuPopupHelper

        init {
            val popUpMenu = PopupMenu(context, view).apply {
                inflate(R.menu.menu_language_dropdown)
            }

            popupHelper = MenuPopupHelper(context, popUpMenu.menu as MenuBuilder, view)
            popupHelper.run {
                gravity = Gravity.END
                setForceShowIcon(true)
            }
        }

        fun showMenu() {
            popupHelper.show()
        }
    }

期待される結果: ナビゲーション バーとそのアイコンが非表示になり、ポップアップ メニューが表示された後もアイコンは非表示のままです

実際の結果:ナビゲーションバーとそのアイコンは非表示になり、ポップアップメニューが表示された後、アイコンが表示されます

4

2 に答える 2

0

PopupMenu は新しい DecorView (PopupDecorView) を使用するため、以下を試してください。

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if(hasFocus)
    {
        fullSceen(getWindow().getDecorView());
    }
    else {
        try {
            Object wmgInstance = Class.forName("android.view.WindowManagerGlobal").getMethod("getInstance").invoke(null);
            Field viewsField = Class.forName("android.view.WindowManagerGlobal").getDeclaredField("mViews");

            viewsField.setAccessible(true);
            ArrayList<View> views = (ArrayList<View>) viewsField.get(wmgInstance);
            for (View view: views) {
                fullSceen(view);

                view.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
                    @Override
                    public void onSystemUiVisibilityChange(int visibility) {
                        fullSceen(view);
                    }
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        AppUtils.console(this,TAG, "hasFocus == false");
    }
}
private void fullSceen(View view){
    view.setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
于 2022-02-09T03:44:26.360 に答える