Android PopupMenu触发时退出全屏问题求助
这个坑我之前踩过!PopupMenu默认会唤起系统的导航栏和ActionBar,导致你的全屏状态“失效”,其实是因为PopupMenu创建的新Window没有继承Activity的全屏Flag,咱们可以用下面两种方法解决:
方法一:修改PopupMenu的Window参数(最快)
直接在你的触发代码里加一段监听,在PopupMenu显示时给它的Window添加上全屏相关的Flag,阻止系统UI弹出:
public void showPopup(View v) { PopupMenu popup = new PopupMenu(this, v); popup.inflate(R.menu.menu_main); // 监听PopupMenu显示事件,修改Window属性 popup.setOnShowListener(menu -> { Window window = menu.getMenu().getPopup().getWindow(); if (window != null) { // 保持全屏的核心Flag,根据你的全屏模式调整 window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); // 移除可能强制显示系统UI的Flag window.clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); // 如果是沉浸式全屏,再加这两个Flag window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); window.getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN ); } }); popup.show(); }
方法二:改用PopupWindow(更灵活)
如果方法一没效果,说明系统对PopupMenu的Window限制比较严,那咱们直接用PopupWindow自定义菜单,完全掌控窗口属性:
第一步:创建自定义菜单布局(menu_popup.xml)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:background="@android:color/white" android:elevation="4dp"> <TextView android:id="@+id/data" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="16dp" android:text="Data" android:textSize="16sp"/> <TextView android:id="@+id/calibrate" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="16dp" android:text="Calibrate" android:textSize="16sp"/> <TextView android:id="@+id/help" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="16dp" android:text="Help" android:textSize="16sp"/> </LinearLayout>
第二步:修改触发代码
public void showPopup(View v) { // 加载自定义菜单布局 View popupView = getLayoutInflater().inflate(R.layout.menu_popup, null); // 创建PopupWindow,设置宽高和可交互性 PopupWindow popupWindow = new PopupWindow(popupView, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT); popupWindow.setOutsideTouchable(true); popupWindow.setFocusable(true); // 设置全屏Flag,确保不触发系统UI WindowManager.LayoutParams params = popupWindow.getAttributes(); params.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN; params.flags |= WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; popupWindow.setAttributes(params); // 给菜单项加点击事件 popupView.findViewById(R.id.data).setOnClickListener(view -> { // 处理Data菜单的逻辑 popupWindow.dismiss(); }); popupView.findViewById(R.id.calibrate).setOnClickListener(view -> { // 处理Calibrate菜单的逻辑 popupWindow.dismiss(); }); popupView.findViewById(R.id.help).setOnClickListener(view -> { // 处理Help菜单的逻辑 popupWindow.dismiss(); }); // 锚定到触发View显示 popupWindow.showAsDropDown(v); }
额外检查:确保Activity的全屏设置正确
别忘了你的Activity本身要设置好全屏,比如在onCreate里:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 隐藏ActionBar if (getSupportActionBar() != null) { getSupportActionBar().hide(); } // 设置全屏Flag getWindow().setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN ); // 沉浸式全屏(可选,根据需求) getWindow().getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN ); setContentView(R.layout.activity_main); }
内容的提问来源于stack exchange,提问作者Phillip Løjmand
相关产品推荐
相关产品推荐

