首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何隐藏导航栏,尽管窗口弹出窗口,覆盖或对话框出现?

如何隐藏导航栏,尽管窗口弹出窗口,覆盖或对话框出现?
EN

Stack Overflow用户
提问于 2016-06-21 18:02:58
回答 3查看 2.6K关注 0票数 1

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

您可以在这里查看bug:http://tinypic.com/player.php?v=2qkplwp%3E&s=9#.V3fZ8KLA3Fk

我用旗子试过所有的东西,但似乎做不到。我环顾了一下Playstore,似乎很多锁屏应用程序都可以轻松地隐藏导航栏,尽管存在任何弹出\其他对话框(SlideLock,Echo Lock屏幕)。

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

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

windowlayout.xml

代码语言:javascript
运行
复制
<?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

代码语言:javascript
运行
复制
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);
            }
        });

    }

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-07 15:00:44

也许我得到了一个类似于你的目标的行为,但是对于我的回答,我的回答需要被审查。不管怎样,这是我的解决办法。

我添加了两个组件:

  1. 一种折叠statusBar面板的方法
  2. 在所有活动面前激发一种全新活动的听众

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

代码语言:javascript
运行
复制
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();
    }

}

对于第二部分,您可以向接收器发射程序意图,以便在堆栈顶部启动您的活动。

代码语言:javascript
运行
复制
 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);

这是接受者:

代码语言:javascript
运行
复制
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);
    }
}

因此,例如,您的主要活动可能如下:

代码语言:javascript
运行
复制
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();
        }

    }
}

我知道这个解决方案很粗糙,但是,在我的测试中,它是有效的。告诉我你在想什么。

编辑

接收器部分实际上只是为了测试目的。所以"LockActivity“应该是这样的:

代码语言:javascript
运行
复制
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();
        }

    }
}
票数 1
EN

Stack Overflow用户

发布于 2021-05-10 16:54:17

代码语言:javascript
运行
复制
This worked for me:

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

代码语言:javascript
运行
复制
mypopupWindow.isFocusable = false
票数 1
EN

Stack Overflow用户

发布于 2016-07-05 19:31:49

在您的活动中使用这个在onCreate method中。

代码语言:javascript
运行
复制
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37951491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档