无法添加窗口 – 标记null无效; 你的活动正在运行?

我想显示一个自定义的popup菜单,当用户点击一个浮动图标

浮动图标创build一个服务,我没有任何活动

这是我的浮动图标代码

public class copy_actions_service extends Service { ImageView copy_ImageView; WindowManager windowManager; WindowManager.LayoutParams layoutParams; @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { windowManager=(WindowManager)getSystemService(WINDOW_SERVICE); copy_ImageView=new ImageView(this); copy_ImageView.setImageResource(R.drawable.ic_launcher); copy_ImageView.setAlpha(245); copy_ImageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { showCustomPopupMenu(); } }); layoutParams=new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); layoutParams.gravity=Gravity.TOP|Gravity.CENTER; layoutParams.x=0; layoutParams.y=100; windowManager.addView(copy_ImageView, layoutParams); } private void showCustomPopupMenu() { LayoutInflater layoutInflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view=layoutInflater.inflate(R.layout.xxact_copy_popupmenu, null); PopupWindow popupWindow=new PopupWindow(); popupWindow.setContentView(view); popupWindow.setWidth(LinearLayout.LayoutParams.WRAP_CONTENT); popupWindow.setHeight(LinearLayout.LayoutParams.WRAP_CONTENT); popupWindow.setFocusable(true); popupWindow.showAtLocation(view, Gravity.NO_GRAVITY, 0, 0); } } 

每件事情都很好,但是当我点击浮动button应用程序停止,这个错误显示在logcat 🙁

 11-23 02:18:58.217: E/AndroidRuntime(3231): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running? 

但我没有活动?

我想在用户点击浮动图标后popup菜单显示; 但是popup菜单只能显示文字;

如何使用图标显示popup式菜单?

Solutions Collecting From Web of "无法添加窗口 – 标记null无效; 你的活动正在运行?"

我和你有同样的问题,看起来像你使用http://www.piwai.info/chatheads-basics的教程一样。 问题是你不能可靠地将当前活动传递给popup窗口,因为你无法控制当前活动。 看起来有可能是一种不可靠的方式来获得当前的活动,但我不build议这样做。

我为我的应用程序修复它的方式是不使用popup窗口,而是通过窗口pipe理器创build自己的窗口。

 private void showCustomPopupMenu() { windowManager2 = (WindowManager)getSystemService(WINDOW_SERVICE); LayoutInflater layoutInflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view=layoutInflater.inflate(R.layout.xxact_copy_popupmenu, null); 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; params.x=0; params.y=0; windowManager2.addView(view, params); } 

如果你想让它看起来像一个popup窗口,只需添加一个透明的灰色视图作为背景,并添加一个onClickListener来从windowManager对象中删除视图。

我知道这不是一个popup式的方便,但从我的经验来看,这是最可靠的方法。

并不记得在清单文件中添加权限

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

您需要在构造函数中传递您的活动

  PopupWindow popupWindow = new PopupWindow(YourActivity.this) 

PopupWindow只能附加到一个Activity 。 在你的情况下,你正试图添加PopupWindow service ,这是不正确的。

要解决这个问题,你可以使用一个空白的透明Activity 。 点击浮动图标,启动Activity并在Activity onCreate上显示PopupWindow

closuresPopupWindow ,你可以finish透明的Activity 。 希望这可以帮助你。