WindowManager 中的全屏

Posted

技术标签:

【中文标题】WindowManager 中的全屏【英文标题】:Fullscreen in WindowManager 【发布时间】:2013-01-02 02:34:10 【问题描述】:

这是我的代码:

params = new WindowManager.LayoutParams(
    WindowManager.LayoutParams.FLAG_FULLSCREEN,
    WindowManager.LayoutParams.FLAG_FULLSCREEN,
    WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
    WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
    PixelFormat.TRANSLUCENT);

wm = (WindowManager) getApplicationContext()
    .getSystemService(Context.WINDOW_SERVICE);

inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mTopView = (ViewGroup) inflater.inflate(R.layout.activity_invisible, null);

params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
    | WindowManager.LayoutParams.FLAG_DIM_BEHIND
    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
    | WindowManager.LayoutParams.FLAG_FULLSCREEN;

if (keep==true) 
    int value = brightnessIntent.getExtras().getInt("value");
    float v=value/255.0f;
    params.dimAmount=0;
    params.alpha=v;
    rl = (RelativeLayout) mTopView.findViewById(R.id.window);

    getWindow().setAttributes(params);
    getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

    WindowManager.LayoutParams.FLAG_FULLSCREEN);
    wm.addView(mTopView, params);

视图仍然显示状态栏,mTopView 是一个覆盖窗口。如何让覆盖窗口覆盖整个屏幕?我不想“隐藏”状态栏,我希望我的活动覆盖在它上面。

[编辑] 强调文字 我的 onCreate() 方法中已经有了这个:

requestWindowFeature(Window.FEATURE_NO_TITLE); 
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

我的清单定义了一种全屏风格。

屏幕截图

目前是这样的,我希望覆盖也扩展到状态栏。

【问题讨论】:

【参考方案1】:

我只需要这样做

params.flags=WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN| and the rest

这会在状态栏上扩展覆盖视图。

【讨论】:

你能解释一下究竟是哪段代码解决了这个问题吗?上面的“以及其他”部分有点混乱。 @500865 - and the rest 代表我在问题代码中“或”的其余标志。 似乎不适用于 Pixel 2 上的 Oreo。不过,我可以可靠地让它在其他手机上运行。 需要将LayoutParams的前两个参数改为WindowManager.LayoutParams.MATCH_PARENT。您使用标志作为宽度和高度的参数,这不应该起作用。 这在我的情况下不起作用。 @Bahi Hussein 解决方案正在开发 API 28。【参考方案2】:

此代码来自“android 应用程序 4 开发”。你必须处理不同的安卓版本

 // Hiding the Action Bar for different android versions 
    if (Build.VERSION.SDK_INT < 16) 
        // Hide the Action Bar on Android 4.0 and Lower
         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
     else 
        // Hide the Action Bar on Android 4.1 and Higher
        View decorView = getWindow().getDecorView();
        int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN;
        decorView.setSystemUiVisibility(uiOptions);
        android.app.ActionBar actionBar = getActionBar();
        actionBar.hide();
     

【讨论】:

【参考方案3】:

您可以使用两种方式隐藏状态栏:

1) 在您的活动onCreate() 方法中定义以下行。

  requestWindowFeature(Window.FEATURE_NO_TITLE);

2)在应用程序级别定义主题,在应用程序中不显示状态栏,如下所示:

<application android:label="@string/app_name"
  android:theme="@android:style/Theme.NoTitleBar.Fullscreen">

【讨论】:

【参考方案4】:

试试这个..

   requestWindowFeature(Window.FEATURE_NO_TITLE);

它不会隐藏您的状态栏,您的应用程序将全屏显示,只有状态栏可见

           public class example extends Activity

@Override
protected void onCreate(Bundle savedInstanceState) 
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);


    setContentView(R.layout.example);



并隐藏状态栏

你可以使用

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

试试这个方法

final WindowManager.LayoutParams params = new WindowManager.LayoutParams( 
WindowManager.LayoutParams.FLAG_FULLSCREEN, 
WindowManager.LayoutParams.FLAG_FULLSCREEN,                 
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,               
            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
            PixelFormat.TRANSLUCENT);   

    WindowManager wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);    

    ViewGroup mTopView = (ViewGroup) App.inflater.inflate(R.layout.main, null);
    getWindow().setAttributes(params);
    wm.addView(mTopView, params);

【讨论】:

@Torcellite 你不想隐藏状态栏我是对的\ 不,我想隐藏状态栏,通过隐藏我希望覆盖活动也覆盖状态栏。 所以它会像你的活动弹出 不,它本身就是一个单独的活动。 能否请您附上任何类型的屏幕截图..这将有助于理解【参考方案5】:

在 Android 中创建始终处于顶部的全屏覆盖活动:

public void onCreate(Bundle savedInstanceState)        
 super.onCreate(savedInstanceState);        

 requestWindowFeature(Window.FEATURE_NO_TITLE);
 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
 getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);             
 getWindow().setBackgroundDrawableResource(android.R.color.transparent);
 getWindow().setFormat(PixelFormat.TRANSLUCENT);
 setContentView(R.layout.main);
 

半透明设置必须在xml清单中外部启用,否则它也不起作用。

 <item name="android:windowIsTranslucent">true</item>

【讨论】:

【参考方案6】:

您可以使用以下方法隐藏标题栏:

public class MainActivity extends AppCompatActivity   
@Override  
protected void onCreate(Bundle savedInstanceState)   
    super.onCreate(savedInstanceState);  
    requestWindowFeature(Window.FEATURE_NO_TITLE);  
    getSupportActionBar().hide(); 
    setContentView(R.layout.activity_main);  
    
  

并使用以下方法获得全屏:

public class MainActivity extends AppCompatActivity   
@Override  
protected void onCreate(Bundle savedInstanceState)   
    super.onCreate(savedInstanceState);  
     this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    setContentView(R.layout.activity_main);   
     
   

你也可以使用 parent="Theme.AppCompat.NoActionBar" 在styles.xml中

【讨论】:

以上是关于WindowManager 中的全屏的主要内容,如果未能解决你的问题,请参考以下文章

android中的全屏意图到底是啥?

MFC 中的全屏窗口

Android 背景及状态栏设置集合

React Native 中的全屏图像

Python:文本覆盖在所有窗口之上,包括 Linux 中的全屏

UIWebView 中的全屏视频干扰了 UIViewController 的输入附件视图