2011-12-05 14 views
2

私はそうのようにこのカスタムAlertDialogを実装:アンドロイドダイアログモーダルを作る方法は?

AlertDialog dialog = new AlertDialog.Builder(this) 
    .setView(dialogView) 
    .setTitle(getResources().getString(R.string.addedit_asklater_price)) 
    .setCancelable(false) 
    .create(); 

    dialog.setMessage(text); 
    dialog.setOwnerActivity(this); 
    dialog.setButton(...) 
    dialog.setButton(...) 
    dialog.show(); 

    doProcessUserInput(); 

はしかし、私はdialog.show()制御はすぐに、ダイアログのボタンのいずれかを使用してダイアログを閉じ、ユーザーを待たずにdoProcessUserInput()に流れた後ということに気づきます。

この動作は奇妙に思えますが、私はダイアログがモーダルであることを期待していました。モーダルダイアログが常にわかっています。

がダイアログボタンonClickListenerから呼び出されるようにコードを再構成できます。私は、ダイアログが終了するまで、プログラムの実行を一時停止する方法があるかどうか疑問に思っていました。dialog.show()

PS:

  1. 私は、ダイアログを拡張するカスタムダイアログを使用して試してみたが、それは 同じ問題を抱えています。ダイアログのボタンを onClickListenerに作成しています。
  2. 私はを実装し、dialog.show()の代わりにshowDialog(id)を使用しましたが、同じ問題があります。

答えて

4

確かに、あなたのダイアログにonPositiveButtonクリックリスナーを設定し、そのリスナーからアクションを実行できます。

ある時点であなたの活動を一時停止したいのであれば、古いjava wait/notifyメカニズムやエグゼキュータなどのより便利な新しいメカニズムを使用できます。

なぜあなたはそれをしたいと思いますか? Androidのダイアログは、モーダルでないように特別に設計されているため、アプリケーションをブロックすることはできません(アプリケーションにネイティブの電話アクティビティなどの他のアクティビティが含まれる可能性があり、ブロックされると悪くなります)。

+0

ええと...今は意味があります。この角度については考えていませんでした。デスクトッププログラミングの生涯のクモの巣から来ます。 –

2

さらに、ダイアログボックスでアプリケーションフローをブロックしないでください。

Androidデベロッパーガイドとコミュニティのベストプラクティスでは、何かモーダルが必要な場合は、にはがあります。これはonClickListenerで行います。

4

これは私の仕事です:あなたのダイアログとしてアクティビティを作成してください。その後、

  1. は、活動のためのあなたのマニフェストにこれを追加します。

    アンドロイド:テーマ= "@アンドロイド:スタイル/テーマを。ダイアログ」

  2. はsetFinishOnTouchOutside(偽)

    あなたの活動ののonCreateにこれを追加します。あなたの活動にonBackPressed

  3. 上書き:onBackPressed

    が@Override ます。public void() { //「戻る」がこの活動を離れるのを防ぐ }

最初にアクティビティにダイアログを表示します。後者の2つはモーダルダイアログのように動作します。

+0

私はこの1つの単純な線のためにどこでも見ましたsetFinishOnTouchOutside(false); ありがとうございました!また、onBackPressed()をオーバーライドすることも完璧でした! – LargeGlasses

1

ダイアログshow()メソッドを呼び出す前に、.setCancelable(false)を呼び出してみてください。それは私のために完璧に働いた。