Unable to add window -- token null is not valid; is your activity running?

Android

Android Problem Overview


I want to show a custom popup menu when the user clicks on a floating icon

the floating icon create with service and i have no activity

this is my floating icon code

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

everything fine but when i click on the float button app stop and this error is shown on 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?

but I have no activity?

I want to popup menu show after user click on float icon; but popup menu only can show text;

how can I show a popup menu with icons?

Android Solutions


Solution 1 - Android

If you're using getApplicationContext() as Context in Activity for the dialog like this

Dialog dialog = new Dialog(getApplicationContext());

then use YourActivityName.this

Dialog dialog = new Dialog(YourActivityName.this);

Solution 2 - Android

This error happens when you are trying to show pop-up window too early, to fix it, give Id to the main layout as main_layout and use the below code:

Java:

 findViewById(R.id.main_layout).post(new Runnable() {
   public void run() {
       popupWindow.showAtLocation(findViewById(R.id.main_layout), Gravity.CENTER, 0, 0);
   }
});

Kotlin:

 main_layout.post {
      popupWindow?.showAtLocation(main_layout, Gravity.CENTER, 0, 0)
    }

Credit to @kordzik

Solution 3 - Android

I had the same problem as you, it looks like you used the tutorial from http://www.piwai.info/chatheads-basics like I did. The problem is that you cannot reliably pass the current activity to the popup window, because you have no control over the current activity. It looks like there might be a unreliable way to get the current activity, but I don't recommend that.

The way I fixed it for my app was to not use the popup window, but instead make my own through the window manager.

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

If you want this to look like a popup window, just add a transparent gray view as the background and add a onClickListener to it to remove the view from the windowManager object.

I know this isn't as convenient as a popup, but from my experience, it is the most reliable way.

and don't forget to add permission in your manifest file

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

Solution 4 - Android

You need to pass your activity in the constructor

 PopupWindow popupWindow = new PopupWindow(YourActivity.this)

Solution 5 - Android

If you use another view make sure to use view.getContext() instead of this or getApplicationContext()

Solution 6 - Android

I was getting this error while trying to show DatePicker from Fragment.

I changed

val datePickerDialog = DatePickerDialog(activity!!.applicationContext, ...)

to

val datePickerDialog = DatePickerDialog(requireContext(), ...)

and it worked just fine.

Solution 7 - Android

In my case, I was inflating a PopupMenu at the very beginning of the activity i.e on onCreate()... I fixed it by putting it in a Handler

  new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                PopupMenu popuMenu=new PopupMenu(SplashScreen.this,binding.progressBar);
                popuMenu.inflate(R.menu.bottom_nav_menu);
                popuMenu.show();
            }
        },100);

Solution 8 - Android

PopupWindow can only be attached to an Activity. In your case you are trying to add PopupWindow to service which is not right.

To solve this problem you can use a blank and transparent Activity. On click of floating icon, launch the Activity and on onCreate of Activity show the PopupWindow.

On dismiss of PopupWindow, you can finish the transparent Activity. Hope this helps you.

Solution 9 - Android

You should not put the windowManager.addView in onCreate

Try to call the windowManager.addView after onWindowFocusChanged and the status of hasFoucus is true.

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    //code here
    //that you can add a flag that you can call windowManager.addView now.
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionHamidTBView Question on Stackoverflow
Solution 1 - AndroidKishan SolankiView Answer on Stackoverflow
Solution 2 - AndroidManoharView Answer on Stackoverflow
Solution 3 - Androidskit456View Answer on Stackoverflow
Solution 4 - AndroidSacreDeveloperView Answer on Stackoverflow
Solution 5 - AndroidMohamed Ben RomdhaneView Answer on Stackoverflow
Solution 6 - AndroidAnanthView Answer on Stackoverflow
Solution 7 - AndroidAgentPView Answer on Stackoverflow
Solution 8 - AndroidKR_AndroidView Answer on Stackoverflow
Solution 9 - AndroidBruceView Answer on Stackoverflow