1. ホーム
  2. android

[解決済み] ウィンドウを追加できません -- トークンNULLが有効ではありません。

2022-01-30 19:43:44

質問内容

ユーザーがフローティングアイコンをクリックしたときに、カスタムポップアップメニューを表示したい

フローティングアイコンはサービスで作成され、私は何の活動も持っていません。

これは私のフローティングアイコンのコードです

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?

が、アクティビティがない?

フロートアイコンをクリックするとポップアップメニューが表示されるようにしたいのですが、ポップアップメニューはテキストしか表示されません。

アイコンでポップアップメニューを表示するには?

どのように解決するのですか?

私も同じ問題がありました。 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"/>