0

コードは次のようになります。

1) マニフェスト ファイルで新しいアクティビティを宣言します。(AndroidManifest.xml):

    <activity
        android:name=".ConfirmDialog"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Dialog"
        android:launchMode="singleTask"
        android:screenOrientation="vertical">          
    </activity>

2) 新しいクラス extends アクティビティを作成します。(パブリック クラス ConfirmDialog は Activity を拡張します)

private static final int DIALOG_YES_NO_MESSAGE = 1;

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
    case DIALOG_YES_NO_MESSAGE:
        return new AlertDialog.Builder(ConfirmDialog.this)
            .setIconAttribute(android.R.attr.alertDialogIcon)
            .setTitle(R.string.app_name)
            .setMessage(R.string.ask_confirm)
            .setPositiveButton(R.string.ask_confirm_yes, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    dialog.cancel();
                    finish();
                }
            })
            .setNegativeButton(R.string.ask_confirm_no, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int whichButton) {
                    dialog.cancel();
                    finish();
                }
            })
            .create();
    }
    return null;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    showDialog(DIALOG_YES_NO_MESSAGE);
}

3) phonestatelistener で新しく作成されたアクティビティを使用します。(public class Listener は PhoneStateListener を拡張します)

public void onCallStateChanged(int state, String incomingNumber){

    switch(state){              
        case TelephonyManager.CALL_STATE_OFFHOOK:
            confirmCall();          
        break;
    }

    super.onCallStateChanged(state, incomingNumber);

}   

private void confirmCall(){
    Intent intent = new Intent();
    intent.setComponent(new ComponentName("com.example", "com.example.ConfirmDialog"));
    mContext.startActivity(intent);
}
4

1 に答える 1

0

すべてのContextオブジェクトが同じというわけではありません。それらを再利用すると、表示されているエラーが発生する可能性があるため、危険です。あなたのコメントによると、改訂されたコードはContextfrom SherlockFragmentActivity をConfigクラスに保存し、後でそれActivity(およびそれが使用していたウィンドウ) が存在しなくなったときにそれを使用しています。はContextnull ではなく、おそらく を実行するために使用できますがToast、ウィンドウ操作を行うのは非常に危険です。

1 つの解決策は、ダイアログのみを表示するアプリでダイアログをテーマにしたアクティビティを作成することです。で、confirmCall()でアクティビティを起動し、アクティビティでstartActivity()ダイアログを作成します。ユーザーには、アプリが実行されていなくても画面にダイアログが表示されますが、実際にはアプリ実行されており、ダイアログでのユーザーのはい/いいえの選択に応答できます。必ずご利用ください

new AlertDialog.Builder(this)

ダイアログContextActivity.

于 2012-10-20T17:28:49.853 に答える