沉浸式中显示 PopupWindow
文章转自王牌软件
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)
只回答业务咨询
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)
在全屏沉浸模式时(Immersive Full-Screen Mode),如果弹出 Dialog 或 PopupWindow,则会自动退出沉浸模式。
退出沉浸式的原因是因为 Activity 的 Window 焦点被抢走了,Window 中的 DecorView 状态改变导致了退出。
如果要继续保持沉浸模式。对于 Dialog 情况,这里有解决办法 。 Dialog 在初始化时会生成新的 Window,先禁止 Dialog Window 获取焦点,等 Dialog 显示后对 Dialog Window 的 DecorView 设置 setSystemUiVisibility
,接着再获取焦点。 这样表面上看起来就没有退出沉浸模式。
而 PopupWindow 并没有创建新的 Window,只是将 PopupWindow 的 View 添加到当前的 WindowManager。不过可以对 PopupWindow 设置 setFocusable
。
同理,先在失焦的状态,弹出 PopupWindow , 再对 PopupWindow 的 DecorView 设置 setSystemUiVisibility
,最后获取焦点即可。 虽然 PopupWindow 对外没有暴露出 DecorView ,但只要是 PopupWindow 中的可见 View 都行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
public class MainActivity extends AppCompatActivity { private PopupWindow mPopupWindow; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); int windowWidth = 480; int windowHeight = 120; TextView popupView = (TextView) LayoutInflater.from(getApplicationContext()) .inflate(android.R.layout.simple_list_item_1, null); popupView.setText("PopupWindow"); popupView.setGravity(Gravity.CENTER); popupView.setBackgroundColor(Color.BLACK); popupView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "PopupWindow Click", Toast.LENGTH_SHORT) .show(); } }); mPopupWindow = new PopupWindow(popupView, windowWidth, windowHeight); mPopupWindow.setFocusable(false); mPopupWindow.setBackgroundDrawable(new ColorDrawable()); mPopupWindow.setOutsideTouchable(true); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!mPopupWindow.isShowing()) { showPopup(v); } else { mPopupWindow.dismiss(); } } }); } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) { fullScreenImmersive(getWindow()); } } public void showPopup(View anchor) { mPopupWindow.setFocusable(false); mPopupWindow.update(); PopupWindowCompat.showAsDropDown(mPopupWindow, anchor, -mPopupWindow.getWidth() / 2 + anchor.getWidth() / 2, -mPopupWindow.getHeight() - anchor.getHeight(), Gravity.CENTER); fullScreenImmersive(mPopupWindow.getContentView()); mPopupWindow.setFocusable(true); mPopupWindow.update(); } public void fullScreenImmersive(Window window) { if (window != null) { fullScreenImmersive(window.getDecorView()); } } public void fullScreenImmersive(View view) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_FULLSCREEN; view.setSystemUiVisibility(uiOptions); } } } |
学习日记,兼职软件设计,软件修改,毕业设计。
本文出自 学习日记,转载时请注明出处及相应链接。
本文永久链接: https://www.softwareace.cn/?p=1680