尽管出现了窗口弹出窗口,叠加层或对话框,如何隐藏导航栏?

时间:2016-06-21 18:02:58

标签: android dialog popup fullscreen navbar

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

您可以在此处查看错误:http://tinypic.com/player.php?v=2qkplwp%3E&s=9#.V3fZ8KLA3Fk

我用旗帜尝试了所有东西,但似乎无法完成。我浏览了Playstore,看起来很多锁屏应用程序尤其可以轻松隐藏导航栏,尽管存在任何弹出窗口\其他对话框(SlideLock,Echo Lock Screen)。

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

在清单中:<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

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>

MainActivity.java

public class MainActivity extends AppCompatActivity {

    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.content_main);

        final View decorView = getWindow().getDecorView();
        decorView.setSystemUiVisibility(flags);

        final ViewGroup viewGroup = (ViewGroup) getLayoutInflater().inflate(R.layout.windowlayout, null);
        final WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        windowManager.addView(viewGroup, params);

        viewGroup.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                windowManager.removeView(viewGroup);
            }
        });

    }

}

3 个答案:

答案 0 :(得分:0)

在您的活动中onCreate method内使用此内容。

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

答案 1 :(得分:0)

可能我获得了与您的目标类似的行为,但是对于疼痛,我的答案需要进行审核。 无论如何,这是我的解决方案。

我添加了两个组件:

  1. 折叠statusBar面板的方法

  2. 在所有活动前面开展全新活动的听众

  3. 第一部分非常简单:您在活动中只使用此方法:

    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();
        }
    
    }
    

    对于第二部分,您向接收者发出编程意图,以便在堆栈顶部启动您的活动

     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);
    

    这是接收者:

    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();
            }
    
        }
    }
    

    我知道这个解决方案非常粗糙,但在我的测试中,它的工作正常。让我知道你在想什么。

    修改

    接收器部分实际上仅用于测试目的。 所以&#34; LockActivity&#34;应该是这样的:

    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();
            }
    
        }
    }
    

答案 2 :(得分:0)

This worked for me:

  mypopupWindow = PopupWindow(
                    view,
                    RelativeLayout.LayoutParams.MATCH_PARENT,
                    RelativeLayout.LayoutParams.MATCH_PARENT,
                    false
            )

mypopupWindow.isFocusable = false