【问题标题】:PopupWindow + full screen => show notification-bar?PopupWindow + 全屏 => 显示通知栏?
【发布时间】:2014-08-10 15:12:42
【问题描述】:

背景

我正在制作一个包含 2 个片段的活动。

第二个片段显示了一个全屏图像,它还使用以下方法隐藏了状态栏(AKA 通知栏):

    final View decorView = getActivity().getWindow().getDecorView();
    int uiOptions = View.SYSTEM_UI_FLAG_LOW_PROFILE;
    if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN)
        uiOptions |= View.SYSTEM_UI_FLAG_FULLSCREEN;
    decorView.setSystemUiVisibility(uiOptions);

问题

我正在尝试添加当前显示图像的共享对话框,但无论我尝试使用哪种方法,它总是显示状态栏,让事情变得“跳跃”。

我尝试过的

打开共享对话框的正常方式不起作用(我的意思是,它起作用了,但它显示了状态栏):

startActivity(Intent.createChooser(shareIntent,"some text");

所以我必须创建自己的弹出窗口。

首先我想显示某种progressDialog,但它也导致状态栏显示,所以我删除了它。

然后我想显示项目列表,所以我使用了 ListPopupWindow(锚定到用户单击的视图),但它也显示了状态栏。我尝试的另一件事是使用普通的 PopupWindow 并在其中设置一个 listView,但它也没有帮助。

我尝试的另一件事是将 popupWindow 的窗口更改为与片段的活动具有相同的设置,但它也没有帮助。

我什至尝试为弹出窗口设置较小的高度,但没有帮助。

问题

如何使用 PopupWindow(或正常的共享对话框)使状态栏保持与显示之前相同的状态?

【问题讨论】:

    标签: android android-fragments android-notification-bar android-popupwindow


    【解决方案1】:

    好的,我想我找到了完美的组合。我使用正常的共享意图,并根据需要设置窗口的标志。

    用于正确隐藏/显示状态栏:

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    private void setStatuBarVisibility(final boolean visible) {
        if (visible) {
            // if (Build.VERSION.SDK_INT < VERSION_CODES.JELLY_BEAN)
            getActivity().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
            final View decorView = getActivity().getWindow().getDecorView();
            decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
            // a no animation version of: getActivity().getActionBar().show();
            ViewUtil.getActionBarView(getActivity()).setVisibility(View.VISIBLE);
        } else {
            // hide status bar (if possible) and the action bar, and dim navigation buttons:
            final View decorView = getActivity().getWindow().getDecorView();
            int uiOptions = View.SYSTEM_UI_FLAG_LOW_PROFILE;
            if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN)
                uiOptions |= View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
            decorView.setSystemUiVisibility(uiOptions);
            // if (Build.VERSION.SDK_INT < VERSION_CODES.JELLY_BEAN)
            getActivity().getWindow().addFlags(
                    WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
            // a no animation version of: getActivity().getActionBar().hide();
            ViewUtil.getActionBarView(getActivity()).setVisibility(View.GONE);
            ViewUtil.hideSoftKeyboardFromFocusedView(getActivity());
        }
    }
    
    public static View getActionBarView(final FragmentActivity activity) {
        final Window window = activity.getWindow();
        final View v = window.getDecorView();
        final int resId = activity.getResources().getIdentifier("action_bar_container", "id", "android");
        return v.findViewById(resId);
    }
    
    public static void hideSoftKeyboardFromFocusedView(final Context context, final View view) {
        final InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }
    

    它还避免了往返片段以及显示共享对话框时的跳跃行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多