1

フラグメントは私の質問に不可欠ではありませんが(笑を残さないでください)、なぜこれを行おうとしているのかを説明するために言及します。

私はフラグメントを使用しているので、レイアウトに応じて異なるアクティビティがコンテナになります。そのため、このルーチンを複数のアクティビティで使用できるようにする必要があります。使用するアクティビティに関係なく実行する必要のある共通のルーチンがあるため、コードが重複しないように、アプリケーションオブジェクトから実行するようにルーチンを設定しました。

このコードは、アクティビティに含まれている場合は機能しますが、アプリケーションオブジェクトに配置された場合(および必要に応じて変更された場合)は失敗します。ダイアログを.show()しようとすると、「ウィンドウを追加できません。トークンnullはアプリケーション用ではありません」というエラーが表示されます。

これは、失敗したルーチンを呼び出す必要があるアクティビティの1つからの呼び出しルーチンです。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
     switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpTo(this, new Intent(this, ChecklistListActivity.class));
            return true;
        case R.id.mnuDelete:
            ((KnowUrStuffApp)getApplication()).deleteChecklist(this);//<--This is the call!!!
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }

}

これは私のアプリケーションサブクラスに含まれているルーチンです:

public void deleteChecklist(final FragmentActivity sender){
    Checklist cl = getDbHelper().getCurrentChecklist();
    if (cl == null)
        Toast.makeText(this, getString(R.string.strSelectAChecklistToDelete), Toast.LENGTH_SHORT).show();
    else {
        try {
            new AlertDialog.Builder(this)
               .setMessage(cl.getChecklistTitle() + " " + getString(R.string.strConfirmDelete))
               .setCancelable(true)
               .setPositiveButton(android.R.string.ok,
                  new DialogInterface.OnClickListener() {
                      public void onClick(DialogInterface dialog, int whichButton){
                          performDeleteChecklist();
                          if (sender instanceof ChecklistDetailActivity)
                              NavUtils.navigateUpTo(sender, new Intent(sender, ChecklistListActivity.class));
                      }
                  })
               .setNegativeButton(android.R.string.cancel, null)
               .show();//<--This causes exception!

        } catch (Exception e) {
            Log.e(TAG,e.getLocalizedMessage());
            Toast.makeText(this, e.getLocalizedMessage(), Toast.LENGTH_LONG * 4).show();
        }
    }
}

これを機能させるにはどうすればよいですか、またはこれがこのルーチンを複数のアクティビティで利用できるようにするためのまったく間違った方法である場合、どうすれば利用できるようにできますか?

各アクティビティでコードを複製して機能させることもできますが、変更を加えるたびに両方を更新することを忘れないでください。さらに、同じことを行うために必要なルーチンがさらにいくつか必要になるため、ルーチンを複数のアクティビティで使用できるようにする方法を実際に理解する必要があります。

どうもありがとうございました!:-D

4

1 に答える 1

4

これを試して。この行を変更します。

new AlertDialog.Builder(this)

に:

new AlertDialog.Builder(sender)
于 2012-07-27T13:47:41.437 に答える