0

我有一个通过 Intent 调用此活动的小部件,它的 onCreate 方法具有以下代码:

WindowManager wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mTopView = (ViewGroup) inflater.inflate(R.layout.screen_filter, null);

WindowManager.LayoutParams 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);           

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

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

该代码创建了一个覆盖层,充当屏幕过滤器,停留在每个活动之上。

问题是我不知道以后如何删除它。

调用wm.removeView(mTopView);会出错

java.lang.IllegalArgumentException:视图未附加到窗口管理器

据我了解,我失去了对我添加的视图的引用,因为我使用 Intent 从小部件调用它。它是一个状态机,一个状态添加了这个视图,后面的状态应该删除它。

我怎样才能删除它?也许某种方法允许我搜索所有添加的视图然后删除它们?

任何提示将不胜感激。

4

1 回答 1

3

由于您使用窗口管理器来显示警报视图,因此您需要保留添加的视图实例。

创建服务以将视图添加到窗口。因此,当服务被破坏时,您可以从窗口中删除视图。

这是一个示例代码..

public class FloatingService extends Service {

private WindowManager windowManager;
private View floatingView;

WindowManager.LayoutParams params;
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flag, int startId)
{
    // add window
    showAlert();
    return START_STICKY;
}

private void showAlert() {
    if(windowManager == null || floatingView == null) {
        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        floatingView = View.inflate(getBaseContext(),R.layout.floating_layout,null);
        // do your stuff to update the view in layout
        params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_PHONE,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSLUCENT);
        params.gravity = Gravity.CENTER | Gravity.CENTER;
        windowManager.addView(floatingView, params);
    }
}

@Override
public void onCreate() {
    super.onCreate();
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (floatingView != null) windowManager.removeView(floatingView);
}
于 2014-04-06T02:59:52.043 回答