由于业务需要,现在需要用一个自定义的View来弹出覆盖住状态栏,并且设置一定时间后可以自动消失,同时在这个View中,也可以使用按钮来关闭View,使它消失。
现在从WindowManager开始入手,先是得到WindowManager实例,然后在设置LayoutParams的属性,这个LayoutParams比较坑爹,属性非常多,一开始就是因为属性设置错误无法实现覆盖状态栏效果。最后面把LayoutParams的属性都列出来了。一开始,设定TYPE为TYPE_SYSTEM_OVERLAY,这个是系统的顶级窗口,理所当然能够覆盖状态栏,但是运行之后发现自定义的View无法得到焦点,也就无法相应事件,查官方API得知,
Window type: system overlay windows, which need to be displayed on top of everything else. These windows must not take input focus, or they will interfere with the keyguard. In multiuser systems shows only on the owning user's window.
也就是说这个是系统最顶层的窗口,需要被显示在一切的上面,它无法获得输入焦点。所以是无法得到焦点的。一开始脑子没转过来弯,我用了另一种方法实现了需求。
我让TYPE为TYPE_SYSTEM_ALERT,这个是系统提示窗,但是是无法覆盖住状态栏的,我用在windowmanager.add();方法之前把系统状态栏隐藏了,然后这个自定义的View就“实现”了覆盖状态栏,View消失的时候在让这个状态栏显示回来。
后来我知道了TYPE_SYTEM_ERROR,这个属性是可以获得焦点,并且相应事件的。下面把代码贴一下。
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.Button;
public class MainActivity extends Activity {
private WindowManager windowManager;
private Button btn;
private Button cancelBtn;
private View pushView;
private MyHandler handler;
private Timer timer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
pushView = LayoutInflater.from(getApplicationContext()).inflate(
R.layout.push, null);
btn = (Button) findViewById(R.id.btn);
cancelBtn = (Button) pushView.findViewById(R.id.cancelBtn);
windowManager = getWindowManager();
handler = new MyHandler();
cancelBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
windowManager.removeView(pushView);
timer.cancel();
}
});
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
| WindowManager.LayoutParams.FLAG_FULLSCREEN,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.LEFT;
params.y = 0;
params.x = 0;
windowManager.addView(pushView, params);
t