我有一个小部件,通过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从一个小部件调用它。它是一个状态机,一个州添加了这个视图,下面的状态应该删除它。
如何删除它? 也许某些方法允许我搜索所有添加的视图然后删除它们?
任何暗示都会受到赞赏。
答案 0 :(得分: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);
}