質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ダイアログ

ユーザーにウィンドウやボックス等の形で個別で表示されるフォームであり、ユーザーに判断を促す目的で表示される。ユーザーが見逃す事のないよう、操作中のフォーム上にポップアップして表示される。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

7990閲覧

ダイアログメッセージの二重表示について

tok

総合スコア24

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ダイアログ

ユーザーにウィンドウやボックス等の形で個別で表示されるフォームであり、ユーザーに判断を促す目的で表示される。ユーザーが見逃す事のないよう、操作中のフォーム上にポップアップして表示される。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2015/09/14 04:16

お世話になっております

検索時に文字が入力されてない場合にダイアログメッセージで通知したいのですが、
どうゆうわけか同じメッセージが二回表示されてしまいます。

http://stackoverflow.com/questions/5660276/how-to-check-is-a-dialog-opened-or-not
http://gupuru.hatenablog.jp/entry/2014/04/21/194350
のサイトを参考にさせていただいたのですが、まだ二重に表示されたままで困っています。

ご教授よろしくお願いいたします。

public class MainActivity extends AppCompatActivity { private RequestQueue queue; String word; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final EditText editText = (EditText) findViewById(R.id.edit); editText.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View view, int i, KeyEvent keyEvent) { if (editText.getText().toString().equals("")) { TestDialogFragment dialogFragment = new TestDialogFragment(); dialogFragment.showDialog(MainActivity.this); } else if (keyEvent.getAction() == KeyEvent.ACTION_DOWN && i == KeyEvent.KEYCODE_ENTER) { word = editText.getText().toString(); queue = Volley.newRequestQueue(getApplicationContext()); requestVolley(); return true; } return false; } }); }
public class TestDialogFragment extends DialogFragment { public AlertDialog myAlertDialog; public void showDialog(Context context) { if (myAlertDialog != null && myAlertDialog.isShowing()) return; AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("Title"); builder.setMessage("Message"); builder.setPositiveButton("ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); myAlertDialog = builder.create(); myAlertDialog.show(); } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

dialogFragment.showDialog(MainActivity.this);がKeyEvent.ACTION_DOWNとKeyEvent.ACTION_UPの両方で処理されています。
先にKeyEvent.ACTION_UPかどうかを判定し、文字の内容を判定するように修正するべきだと思います。

投稿2015/09/14 05:05

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tok

2015/09/14 06:47

コメントありがとうございます。 http://qiita.com/yyaammaa/items/e5d39d423dd9fe660979 を参考に以下の様に変えてみましたが二重表示されたままでした。 public boolean onKey(View view, int i, KeyEvent keyEvent) { if (keyEvent != null && keyEvent.getKeyCode() == KeyEvent.KEYCODE_ENTER) { if (editText.getText().toString().equals("")){ TestDialogFragment testDialogFragment = new TestDialogFragment(); testDialogFragment.showDialog(MainActivity.this); }else if (keyEvent.getAction() == KeyEvent.ACTION_UP){ word = editText.getText().toString(); queue = Volley.newRequestQueue(getApplicationContext()); requestVolley(); return true; } }return false; }
yona

2015/09/14 07:29

今回の質問で2重にダイアログが表示されるのは下記の箇所が二回動いているからです。 TestDialogFragment testDialogFragment = new TestDialogFragment(); testDialogFragment.showDialog(MainActivity.this); なぜ2回呼ばれるのかは解答したとおり、「KeyEvent.ACTION_UPとKeyEvent.ACTION_DOWN」のそれぞれが呼ばれるからです。 ここまでが今回の質問の原因です。 原因への対応は「キーのイベントをKeyEvent.ACTION_UPかKeyEvent.ACTION_DOWNのどちらか一方でしか処理しないようにする」です。 しかし、質問者が参考にしているページのテーマは「エンター時になにかの処理をしたい」です。対処が少しだけずれていることがわかると思います。 ここで、自身のコードと参考のコードをよく見比べてください。 自身のコードでは下記のようになっています。 if(エンターが「押された」または「離れた」かどうか){ if(入力欄が""かどうかを判定){ ダイアログ表示部 } }else if(指が離されたかどうか){ } つまり空の状態でエンターを押すと「押された」と「離された」の両方でダイアログ表示部に到達しているため、質問の内容の現象が出ます。
tok

2015/09/14 09:39

詳しく説明していただいてありがとうございます。 ようやく理解することが出来ました。 最初のif文でエンターが押された状態に限定することで二重表示を防げました。 丁寧に教えていただきありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問