0

簡単なはい/いいえの質問を表示する DialogFragment があります。ユーザーが「はい」を押すと、データベース要求を実行します (基本的にはエントリを削除します)。次に、メッセージをトーストして、成功または失敗をユーザーに報告します。

UI スレッドからデータベースを呼び出さないようにするため、エントリを削除するスレッドを作成し、そのスレッドから DialogFragment のハンドラーを呼び出してトースト メッセージを表示します。

私の問題は、ユーザーがボタンを押すと、スレッドが開始され、ダイアログが閉じられることです。スレッドが開始されると、データはデータベースから削除されます。しかし、ハンドラーからメッセージをトーストすると、DialogFragment は既に親アクティビティから切り離されているため、Toast.makeText() を呼び出すコンテキストがもうありません。

私の質問は、メッセージを乾杯するにはどうすればよいですか?

データベース操作を処理する Service を作成できることはわかっていますが、面倒ではありませんか? もっと簡単な方法はありますか?

ありがとう !

編集:これが私のコードです。私の問題を理解するのに役立ちます:

public class EraseHistoryDialogFragment extends DialogFragment {
    private HistoryDatabaseHandler mHistoryDbHandler;

    private final static int MSG_NOTIFY_EMPTYDB = 1;
    private final static int MSG_NOTIFY_DELENTRY = 2;
    private final static int MSG_NOTIFY_NODELETION = 3;
    private Context mContext;


    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case MSG_NOTIFY_DELENTRY:
                Toast.makeText(mContext,
                        getS    tring(R.string.historytab_erased_entry),
                        Toast.LENGTH_SHORT).show();
                break;
            case MSG_NOTIFY_EMPTYDB:
                Toast.makeText(mContext,
                        getS    tring(R.string.historytab_history_cleared),
                        Toast.LENGTH_SHORT).show();
                break;
            case MSG_NOTIFY_NODELETION:
                Toast.makeText(mContext,
                        getS    tring(R.string.historytab_erase_failed),
                        Toast.LENGTH_SHORT).show();
                break;
            }
        };
    };
    private Runnable mEraseHistoryRunnable = new Runnable() {

        @Override
        public void run() {
            if (mHistoryDbHandler.clearAllTables()) {
                mHandler.sendEmptyMessage(MSG_NOTIFY_EMPTYDB);
            } else {
                mHandler.sendEmptyMessage(MSG_NOTIFY_NODELETION);
            }
        }
    };

    private class EraseEntryRunnable implements Runnable {
        private String mEntryId;

        public EraseEntryRunnable(String entryID) {
            mEntryId = entryID;
        }

        @Override
        public void run() {
            if (mHistoryDbHandler.deleteEntry(mEntryId)) {
                mHandler.sendEmptyMessage(MSG_NOTIFY_DELENTRY);
            } else {
                mHandler.sendEmptyMessage(MSG_NOTIFY_NODELETION);
            }
        }
    };

    public static EraseHistoryDialogFragment newInstance(String message,
            String entryID, boolean eraseAll) {
        EraseHistoryDialogFragment frag = new EraseHistoryDialogFragment();
        Bundle args = new Bundle();
        args.putString("message", message);
        args.putString("entryid", entryID);
        args.putBoolean("eraseall", eraseAll);
        frag.setArguments(args);
        return frag;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        mHistoryDbHandler = HistoryDatabaseHandler.getInstance(getActivity());
        mContext = getActivity().getApplicationContext();
        String message = getArguments().getString("message");
        final String entryID = getArguments().getString("entryid");
        final boolean eraseAll = getArguments().getBoolean("eraseall");
        return new AlertDialog.Builder(getActivity())
                .setMessage(message)
                .setPositiveButton(R.string.groupstab_yes,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int whichButton) {
                                if (eraseAll) {    
                                    Thread emptyDbT = new Thread(
                                            mEraseHistoryRunnable);
                                    emptyDbT.start();
                                } else {
                                    Thread deleteEntryT = new Thread(
                                            new EraseEntryRunnable(entryID));
                                    deleteEntryT.start();
                                }
                            }
                        })
                .setNegativeButton(R.string.groupstab_no,
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int whichButton) {
                                getDialog().dismiss();
                            }
                        }).create();
    }

}

4

2 に答える 2

2

getActivity();の代わりに試してみてくださいgetApplicationContext();

このような

Toast.makeText(getActivity(), "Your Message", Toast.LENGTH_SHORT).show();
于 2013-10-02T09:55:29.950 に答える
1

getActivity().getApplicationContext()ApplicationContext を取得してみてください

于 2013-10-02T09:57:15.380 に答える