41

実行時間の長い操作で、ポップアップ ダイアログを表示しています (ProgressDialog他の操作が行われないようにするために作成されました)。

でキャンセルsetCancelable(false)不可にしているので戻るボタンで閉じられないのですが、なんとハードウェアの検索ボタンでダイアログが消えてしまうんです!

より正確には、グローバル検索アプリケーションが表示され、アプリに戻るとダイアログが閉じられています。

ダイアログが閉じられないようにする方法はありますか?

4

4 に答える 4

45

これは機能します(ダイアログビルダーに配置したことに注意してください):

.setOnKeyListener(new DialogInterface.OnKeyListener() {

    @Override
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_SEARCH && event.getRepeatCount() == 0) {
            return true; // Pretend we processed it
        }
        return false; // Any other keys are still processed as normal
    }
})

おそらく、正と負のボタンの押下を取得して、これらのみを処理し、他のキーに対して true を返すことさえ可能です。あなたがそれを理解できるなら、興味があります...

PS: ダイアログにはもっと「穴」があるとどこかで読みました。つまり、ボタンを押さずに取り除くことができます。これは明らかに1つでした。誰か他の人を知っていますか?

于 2010-09-19T14:30:01.377 に答える
1

アクティビティのonCreateDialogイベントを介してダイアログを作成する必要があります。これは、ダイアログがアクティビティによって管理され、アクティビティが再開されたときに復元されるポイントであるためです。

アクティビティによって管理 (保存および復元) されるダイアログを作成するためのコールバック。を使用するshowDialog(int)と、アクティビティは最初にこのメソッドを呼び出し、その後はハングアップします。このメソッドで作成されたダイアログは、表示されているかどうかを含め、自動的に保存および復元されます。アクティビティでダイアログの保存と復元を管理したい場合は、このメソッドをオーバーライドして、showDialog(int) に渡される ID を処理する必要があります。ダイアログが表示される前にダイアログを準備する機会が必要な場合は、オーバーライドしますonPrepareDialog(int, Dialog)

使用例:

public class MyClass extends Activity {
// ........ //
static final int DATE_DIALOG_ID = 1;
@Override
 protected Dialog onCreateDialog(int id) {
  switch (id) {

  case DATE_DIALOG_ID:
   return new DatePickerDialog(this, mDateSetListener, mYear, mMonth,
     mDay);
  }
  return null;
 }

    public void launchSetDate() {
  showDialog(DATE_DIALOG_ID);
 }
}
于 2010-03-23T18:22:52.223 に答える