Intereting Posts
Как создать хранилище ключей? Андроид GCM не работает с Wi-Fi netowrks, когда доступна сеть 3G Android StackOverflowError в ViewGroup.resetResolvedTextDirection при добавлении ListView в LinearLayout Поддержка перехода фрагмента 25.1.0 с Recyclerview Динамическое связывание текста в ListView – Ошибка: не найдено намерений с данными: указанный URL Получить список всех пользователей, подключенных с помощью Wi-Fi-модема в android Не могу использовать dex2jar на моем mac: разрешено отклонение Android pinch и обрезать изображение из изображения с программным Как открыть браузер по умолчанию из плена на Android Определить конец ответа на входящий вызов пользователем в android? (Не отклонено) Android – можно использовать in-app для загрузки контента? «Сервис MeasurementBrokerService используется» отображается в моем приложении Внутренняя тень на Android TextView Импорт android.hardware.camera2 не может быть разрешен Обновить все представления в Android?

Невозможно добавить нулевой токен окна; Работает ли ваша деятельность?

Я хочу показать пользовательское всплывающее меню, когда пользователь нажимает на плавающий значок

Значок float создается с помощью сервиса, и у меня нет активности

Это мой плавающий код значка

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

Все прекрасно, но когда я нажимаю на кнопку приложения float, и эта ошибка отображается на 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? 

Но у меня нет активности?!

Я хочу, чтобы всплывающее меню показывалось после того, как пользователь нажал на значок float; Но всплывающее меню может показывать только текст;

Как я могу показать всплывающее меню с иконками?

У меня была такая же проблема, как у вас, похоже, вы использовали учебник из http://www.piwai.info/chatheads-basics, как я. Проблема в том, что вы не можете надежно передать текущую активность во всплывающее окно, потому что у вас нет контроля над текущей деятельностью. Похоже, что может быть ненадежный способ получить текущую деятельность, но я не рекомендую это делать.

Способ, которым я исправил его для моего приложения, заключался в том, чтобы не использовать всплывающее окно, а вместо этого сделать свой собственный через оконный менеджер.

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

Если вы хотите, чтобы это выглядело как всплывающее окно, просто добавьте прозрачный серый вид в качестве фона и добавьте onClickListener к нему, чтобы удалить представление из объекта windowManager.

Я знаю, что это не так удобно, как всплывающее окно, но из моего опыта это самый надежный способ.

И не забудьте добавить разрешение в файл манифеста

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

Вы должны передать свою деятельность в конструкторе

  PopupWindow popupWindow = new PopupWindow(YourActivity.this) 

PopupWindow может быть привязан только к Activity . В вашем случае вы пытаетесь добавить PopupWindow для service что неправильно.

Чтобы решить эту проблему, вы можете использовать пустое и прозрачное действие. При щелчке значка с плавающей onCreate запустите Activity и on onCreate of Activity покажите PopupWindow .

При PopupWindow вы можете finish прозрачную Activity . Надеюсь, это вам поможет.