web-dev-qa-db-ja.com

入力イベントを終了しようとしましたが、入力イベントレシーバーは既に破棄されています

リストビュー用のカスタムアダプタがあります。アダプタには、テキストビューと画像ボタンが含まれています。画像ボタンをクリックするとポップアップメニューを実装しました。すべてが正常に動作しています。ただし、ポップアップメニューからオプションを選択すると、logcatは「入力イベントを終了しようとしましたが、入力イベントレシーバーは既に破棄されました」という1行のメッセージを表示し、何も起こりません。

public class MyAdapter extends ArrayAdapter<String> {

    public MyAdapter(Context context, int resourceId) {
        super(context, resourceId);
    }

    public MyAdapter(Context context, int resourceId, List<String> string) {
        super(context, resourceId, string);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if(v == null) {
            LayoutInflater inflater = LayoutInflater.from(getContext());
            v = inflater.inflate(R.layout.adapter_layout, null);
        }

        String str = getItem(position);

        if(str != null) {
            TextView textView = (TextView)v.findViewById(R.id.editText1);
            textView.setText(str);
            ImageButton button = (ImageButton)v.findViewById(R.id.imageButton1);
            button.setOnClickListener(new Custom_Adapter_Button_Click_Listener(getItemId(position), getContext()));
        }

        return v;
    }
}

onclicklistenerインターフェイスは

public class Custom_Adapter_Button_Click_Listener implements OnClickListener, OnMenuItemClickListener {

    long position;
    Context context;

    public Custom_Adapter_Button_Click_Listener(long id, Context appcontext) {
        position = id;
        context = appcontext;
    }



    @Override
    public boolean onMenuItemClick(MenuItem item) {
        AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo();
        int index = info.position;
        Log.d("ItemClicked", "selected index : " + index);
        switch(item.getItemId()) {
        case R.id.option :
            Toast.makeText(context, "Selected index : " + index, Toast.LENGTH_SHORT).show();
            return true;

        default :
            Toast.makeText(context, "Default", Toast.LENGTH_SHORT).show();
            return false;
        }
    }

    @Override
    public void onClick(View v) {
        PopupMenu popup = new PopupMenu(context, v);
        MenuInflater popupInflater = popup.getMenuInflater();
        popupInflater.inflate(R.menu.contextmenu, popup.getMenu());
        popup.show();   

    }

}

メッセージから理解したことは、onMenuItemClick()が実行される前に何かがイベントを食べているということです。 nexus 5でアプリを実行していますAndroid 5.0.1.

here から同様の問題の解決策を見つけました。しかし、私はこのアプローチを私の問題にどのように使うかを得ていません。

ポップアップメニューの代わりにコンテキストメニューを使用しようとしましたが、コンテキストメニュー項目をクリックした後、「入力イベントを終了しようとしましたが、入力イベントレシーバーは既に破棄されました」という同じメッセージが表示されました。

私を助けてください...!!

24
Gopi

私はこの問題を別の角度から見ました。メニューからサービスを起動しようとしています。デフォルトでは、デバッグメッセージはあまり関係がありません。私の解決策は、logcatのフィルターを削除することでした。その後、最初にサービスを起動できなかったという別のメッセージが表示されました(マニフェストファイルに入れるのを忘れていました)。

あなたの場合、トースト表示をクラスにラップする必要があるかもしれません:

_public class DisplayToast implements Runnable {
    private final Context mContext;
    private final String mText;

    public DisplayToast(Context mContext, String text) {
        this.mContext = mContext;
        mText = text;
    }

    public void run() {
        Toast.makeText(mContext, mText, Toast.LENGTH_SHORT).show();
    }
}
_

Handlerオブジェクトを介して呼び出します:

_mHandler.post(new DisplayToast(this, "Epic message!"));
_

または、さらに良いことに、Handler.postDelayed()メソッドを使用します。

HTH、

5
Laur Ivan

このエラーを防ぐには、super()でR.layout.idを渡す必要があります。例えば:

public PersonAdapter(Context c, ArrayList<String> list) {
            super(c, R.layout.item_layout, list);
}
0
Deplover