Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 尽管出现了窗口弹出窗口、覆盖图或对话框,但如何隐藏导航栏?_Android_Dialog_Popup_Fullscreen_Navbar - Fatal编程技术网

Android 尽管出现了窗口弹出窗口、覆盖图或对话框,但如何隐藏导航栏?

Android 尽管出现了窗口弹出窗口、覆盖图或对话框,但如何隐藏导航栏?,android,dialog,popup,fullscreen,navbar,Android,Dialog,Popup,Fullscreen,Navbar,我正在尝试创建一个在特定时间启动的全屏应用程序,当它启动时,它应该自动变成全屏。我可以全屏启动它。但是,如果存在弹出窗口或窗口,然后启动“我的活动”,则导航栏永远不会隐藏(换句话说,不会达到全屏状态)。我制作了一个5秒的视频来演示这个问题 您可以在此处查看错误: 我试过用旗子做任何事情,但似乎都做不到。我环顾了Playstore,似乎许多锁屏应用程序特别容易隐藏导航栏,尽管存在任何弹出窗口\其他对话框(SlideLock、Echo锁屏) 下面是我的简单活动代码: 在清单中: windowlayo

我正在尝试创建一个在特定时间启动的全屏应用程序,当它启动时,它应该自动变成全屏。我可以全屏启动它。但是,如果存在弹出窗口或窗口,然后启动“我的活动”,则导航栏永远不会隐藏(换句话说,不会达到全屏状态)。我制作了一个5秒的视频来演示这个问题

您可以在此处查看错误:

我试过用旗子做任何事情,但似乎都做不到。我环顾了Playstore,似乎许多锁屏应用程序特别容易隐藏导航栏,尽管存在任何弹出窗口\其他对话框(SlideLock、Echo锁屏)

下面是我的简单活动代码:

在清单中:

windowlayout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#a9e487">

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Exit"
    android:id="@+id/button"
    android:layout_gravity="center"
    android:layout_marginTop="100dp" />
</LinearLayout>

在活动中使用此内部
onCreate方法

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

在活动中使用此内部
onCreate方法

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

也许我的行为与你的目标相似,但我的答案需要重新考虑。 不管怎样,这是我的解决方案

我添加了两个组件:

  • 折叠状态栏面板的方法

  • 听众在所有活动前发起一个全新的活动

  • 第一部分相当简单:您只需在活动中使用此方法:

    private void collapseStatusBar(){
        Object statusBarService = getSystemService("statusbar");
        Class<?> statusBarManager = null;
    
        try {
            statusBarManager = Class.forName("android.app.StatusBarManager");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    
        Method collapseStatusBar = null;
    
        try {
    
            // Prior to API 17, the method to call is 'collapse()'
            // API 17 onwards, the method to call is `collapsePanels()`
    
            if (Build.VERSION.SDK_INT > 16) {
                collapseStatusBar = statusBarManager.getMethod("collapsePanels");
            } else {
                collapseStatusBar = statusBarManager.getMethod("collapse");
            }
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    
        collapseStatusBar.setAccessible(true);
    
        try {
            collapseStatusBar.invoke(statusBarService);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    
    }
    
    这是接收器:

    public class LaunchWakeupReceiver extends BroadcastReceiver {
    
        @Override
        public void onReceive(final Context context, Intent intent) {
    
            intent = new Intent(context,MainActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
        }
    }
    
    例如,您的主要活动可能如下:

    public class MainActivity extends AppCompatActivity {
    
        ViewGroup viewGroup;
        WindowManager windowManager;
    
        final static WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
                        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
                        WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS |
                        WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION |
                        WindowManager.LayoutParams.FLAG_FULLSCREEN |
                        WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS |
                        WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, //Covers status bar
                PixelFormat.TRANSPARENT);
    
        final static int flags = 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;
    
        private static final String LAUNCHED = "launched";
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            addCoverView();
    
        }
    
    
        private void addCoverView(){
    
            final View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(flags);
    
            viewGroup = (ViewGroup) getLayoutInflater().inflate(R.layout.windowlayout, null);
            windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    
            final SharedPreferences shP = PreferenceManager.getDefaultSharedPreferences(this);
            if (shP.contains(LAUNCHED)) {
                collapseStatusBar();
                windowManager.addView(viewGroup, params);
            }
    
            viewGroup.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    windowManager.removeView(viewGroup);
    
                }
            });
    
            Intent startIntent = new Intent(this, LaunchWakeupReceiver.class);
            PendingIntent wakeupIntent = PendingIntent.getBroadcast(this, 0, startIntent,PendingIntent.FLAG_UPDATE_CURRENT );
            AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
            alarm.set(AlarmManager.RTC, (new Date()).getTime()+10000, wakeupIntent);
    
            shP.edit().putBoolean(LAUNCHED,true).apply();
    
    
        }
    
    
        private void collapseStatusBar(){
            Object statusBarService = getSystemService("statusbar");
            Class<?> statusBarManager = null;
    
            try {
                statusBarManager = Class.forName("android.app.StatusBarManager");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
    
            Method collapseStatusBar = null;
    
            try {
    
                // Prior to API 17, the method to call is 'collapse()'
                // API 17 onwards, the method to call is `collapsePanels()`
    
                if (Build.VERSION.SDK_INT > 16) {
                    collapseStatusBar = statusBarManager.getMethod("collapsePanels");
                } else {
                    collapseStatusBar = statusBarManager.getMethod("collapse");
                }
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
    
            collapseStatusBar.setAccessible(true);
    
            try {
                collapseStatusBar.invoke(statusBarService);
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
    
        }
    }
    
    public class LockActivity extends AppCompatActivity {
    
        ViewGroup viewGroup;
        WindowManager windowManager;
    
        final static WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
                        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
                        WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS |
                        WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION |
                        WindowManager.LayoutParams.FLAG_FULLSCREEN |
                        WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS |
                        WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, //Covers status bar
                PixelFormat.TRANSPARENT);
    
        final static int flags = 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;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            addCoverView();
    
        }
    
    
        private void addCoverView(){
    
            final View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(flags);
    
            viewGroup = (ViewGroup) getLayoutInflater().inflate(R.layout.windowlayout, null);
            windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    
            collapseStatusBar();
            windowManager.addView(viewGroup, params);
    
            viewGroup.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    windowManager.removeView(viewGroup);
    
                }
            });
    
    
        }
    
    
        private void collapseStatusBar(){
            Object statusBarService = getSystemService("statusbar");
            Class<?> statusBarManager = null;
    
            try {
                statusBarManager = Class.forName("android.app.StatusBarManager");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
    
            Method collapseStatusBar = null;
    
            try {
    
                // Prior to API 17, the method to call is 'collapse()'
                // API 17 onwards, the method to call is `collapsePanels()`
    
                if (Build.VERSION.SDK_INT > 16) {
                    collapseStatusBar = statusBarManager.getMethod("collapsePanels");
                } else {
                    collapseStatusBar = statusBarManager.getMethod("collapse");
                }
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
    
            collapseStatusBar.setAccessible(true);
    
            try {
                collapseStatusBar.invoke(statusBarService);
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
    
        }
    }
    
    public类MainActivity扩展了AppCompatActivity{
    视图组视图组;
    窗口管理器窗口管理器;
    最终静态WindowManager.LayoutParams参数=新建WindowManager.LayoutParams(
    WindowManager.LayoutParams.TYPE\u系统错误,
    WindowManager.LayoutParams.FLAG\u不可聚焦|
    WindowManager.LayoutParams.FLAG_NOT_TOUCH_model|
    WindowManager.LayoutParams.FLAG_半透明_状态|
    WindowManager.LayoutParams.FLAG_半透明_导航|
    WindowManager.LayoutParams.FLAG_全屏显示|
    WindowManager.LayoutParams.FLAG\u布局\u无限制|
    WindowManager.LayoutParams.FLAG\u布局\u在\u屏幕中,//覆盖状态栏
    像素格式(透明);
    最终静态int标志=View.SYSTEM\u UI\u标志\u布局\u稳定
    |View.SYSTEM\u UI\u FLAG\u布局\u隐藏\u导航
    |View.SYSTEM\u UI\u FLAG\u布局\u全屏显示
    |View.SYSTEM\u UI\u FLAG\u HIDE\u导航
    |View.SYSTEM\u UI\u FLAG\u全屏显示
    |View.SYSTEM\u UI\u FLAG\u沉浸式\u粘性;
    private static final String LAUNCHED=“LAUNCHED”;
    @凌驾
    创建时受保护的void(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    addCoverView();
    }
    私有void addCoverView(){
    最终视图decorView=getWindow().getDecorView();
    decorView.设置系统兼容性(标志);
    viewGroup=(viewGroup)getLayoutInflater().充气(R.layout.windowlayout,null);
    windowManager=(windowManager)getSystemService(窗口服务);
    final SharedReferences shP=PreferenceManager.GetDefaultSharedReferences(此);
    如果(shP.contains(已启动)){
    collapseStatusBar();
    windowManager.addView(视图组,参数);
    }
    viewGroup.findViewById(R.id.button).setOnClickListener(新视图.OnClickListener()){
    @凌驾
    公共void onClick(视图v){
    windowManager.removeView(视图组);
    }
    });
    Intent startinent=newintent(这是LaunchWakeupReceiver.class);
    PendingEvent wakeupIntent=PendingEvent.getBroadcast(this,0,startinent,PendingEvent.FLAG_UPDATE_CURRENT);
    AlarmManager alarm=(AlarmManager)this.getSystemService(Context.alarm\u服务);
    alarm.set(AlarmManager.RTC,(新日期()).getTime()+10000,wakeupIntent);
    shP.edit().putBoolean(启动,true.apply();
    }
    私人空间塌陷状态栏(){
    对象statusBarService=getSystemService(“statusbar”);
    类statusBarManager=null;
    试一试{
    statusBarManager=Class.forName(“android.app.statusBarManager”);
    }catch(classnotfounde异常){
    e、 printStackTrace();
    }
    方法collapseStatusBar=null;
    试一试{
    //在API 17之前,要调用的方法是“collapse()
    //从API 17开始,要调用的方法是`collapsePanels()`
    如果(Build.VERSION.SDK_INT>16){
    collapseStatusBar=statusBarManager.getMethod(“collapsePanels”);
    }否则{
    collapseStatusBar=statusBarManager.getMethod(“折叠”);
    }
    }捕获(无此方法例外){
    e、 printStackTrace();
    }
    collapseStatusBar.setAccessible(true);
    试一试{
    调用(statusBarService);
    }捕获(IllegalArgumentException e){
    e、 printStackTrace();
    }捕获(非法访问例外e){
    e、 printStackTrace();
    }捕获(调用TargetException e){
    e、 printStackTrace();
    }
    }
    }
    
    我知道这个解决方案相当粗糙,但在我的测试中,它是有效的。让我知道你在想什么

    编辑

    接收器部分实际上只是用于测试目的。 所以“锁定活动”应该是这样的:

    public class MainActivity extends AppCompatActivity {
    
        ViewGroup viewGroup;
        WindowManager windowManager;
    
        final static WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
                        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
                        WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS |
                        WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION |
                        WindowManager.LayoutParams.FLAG_FULLSCREEN |
                        WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS |
                        WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, //Covers status bar
                PixelFormat.TRANSPARENT);
    
        final static int flags = 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;
    
        private static final String LAUNCHED = "launched";
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            addCoverView();
    
        }
    
    
        private void addCoverView(){
    
            final View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(flags);
    
            viewGroup = (ViewGroup) getLayoutInflater().inflate(R.layout.windowlayout, null);
            windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    
            final SharedPreferences shP = PreferenceManager.getDefaultSharedPreferences(this);
            if (shP.contains(LAUNCHED)) {
                collapseStatusBar();
                windowManager.addView(viewGroup, params);
            }
    
            viewGroup.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    windowManager.removeView(viewGroup);
    
                }
            });
    
            Intent startIntent = new Intent(this, LaunchWakeupReceiver.class);
            PendingIntent wakeupIntent = PendingIntent.getBroadcast(this, 0, startIntent,PendingIntent.FLAG_UPDATE_CURRENT );
            AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
            alarm.set(AlarmManager.RTC, (new Date()).getTime()+10000, wakeupIntent);
    
            shP.edit().putBoolean(LAUNCHED,true).apply();
    
    
        }
    
    
        private void collapseStatusBar(){
            Object statusBarService = getSystemService("statusbar");
            Class<?> statusBarManager = null;
    
            try {
                statusBarManager = Class.forName("android.app.StatusBarManager");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
    
            Method collapseStatusBar = null;
    
            try {
    
                // Prior to API 17, the method to call is 'collapse()'
                // API 17 onwards, the method to call is `collapsePanels()`
    
                if (Build.VERSION.SDK_INT > 16) {
                    collapseStatusBar = statusBarManager.getMethod("collapsePanels");
                } else {
                    collapseStatusBar = statusBarManager.getMethod("collapse");
                }
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
    
            collapseStatusBar.setAccessible(true);
    
            try {
                collapseStatusBar.invoke(statusBarService);
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
    
        }
    }
    
    public class LockActivity extends AppCompatActivity {
    
        ViewGroup viewGroup;
        WindowManager windowManager;
    
        final static WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
                        WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
                        WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS |
                        WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION |
                        WindowManager.LayoutParams.FLAG_FULLSCREEN |
                        WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS |
                        WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, //Covers status bar
                PixelFormat.TRANSPARENT);
    
        final static int flags = 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;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            addCoverView();
    
        }
    
    
        private void addCoverView(){
    
            final View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(flags);
    
            viewGroup = (ViewGroup) getLayoutInflater().inflate(R.layout.windowlayout, null);
            windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    
            collapseStatusBar();
            windowManager.addView(viewGroup, params);
    
            viewGroup.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    windowManager.removeView(viewGroup);
    
                }
            });
    
    
        }
    
    
        private void collapseStatusBar(){
            Object statusBarService = getSystemService("statusbar");
            Class<?> statusBarManager = null;
    
            try {
                statusBarManager = Class.forName("android.app.StatusBarManager");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
    
            Method collapseStatusBar = null;
    
            try {
    
                // Prior to API 17, the method to call is 'collapse()'
                // API 17 onwards, the method to call is `collapsePanels()`
    
                if (Build.VERSION.SDK_INT > 16) {
                    collapseStatusBar = statusBarManager.getMethod("collapsePanels");
                } else {
                    collapseStatusBar = statusBarManager.getMethod("collapse");
                }
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
    
            collapseStatusBar.setAccessible(true);
    
            try {
                collapseStatusBar.invoke(statusBarService);
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
    
        }
    }
    
    公共类锁定活动扩展了AppCompatActivity{
    视图组视图组;
    窗口管理器窗口管理器;
    最终静态WindowManager.LayoutParams参数=新建WindowManager.LayoutParams(
    WindowManager.LayoutParams.TYPE\u系统错误,
    WindowManager.LayoutParams.FLAG\u不可聚焦|
    WindowManager.LayoutParams.FLAG_NOT_TOUCH_model|
    
    mypopupWindow.isFocusable = false