背景
我正在制作一个包含 2 个 fragment 的 Activity 。
第二个 fragment 显示了一个全屏图像,它还隐藏了状态栏(又名通知栏),使用:
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");
所以我不得不创建自己的弹出窗口。
首先我想显示某种进度对话框,但它也会导致显示状态栏,所以我将其删除。
然后我想显示项目列表,所以我使用了 ListPopupWindow(锚定到用户正在单击的 View ),但它也显示了状态栏。我尝试的另一件事是使用普通的 PopupWindow 并在其中设置一个 listView,但它也没有帮助。
我尝试的另一件事是将 popupWindow 的窗口更改为与 fragment 的 Activity 具有相同的设置,但它也没有帮助。
我什至尝试为弹出窗口设置较小的高度,但没有帮助。
问题
如何使用 PopupWindow(或普通共享对话框)使状态栏保持显示之前的状态?
最佳答案
好的,我想我找到了完美的组合。我使用了普通的共享 Intent ,并根据需要设置了窗口的标志。
正确隐藏/显示状态栏:
@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);
}
它还避免了进出 fragment 以及显示共享对话框时的跳动行为。
关于android - PopupWindow + 全屏 => 显示通知栏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25229951/