🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

Q&A

解決済

2回答

568閲覧

Android開発)dialog(edittext)データを再度開いた時なくしたい

navesanta

総合スコア198

Java

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

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

0グッド

0クリップ

投稿2017/10/13 02:32

ボタンを押したときにedittextを設置したdialogが開いてデータを入力するアプリを作っています。

エミュレータと実機テストをするとdialogを開いて一度データを入力したあとsaveボタンを押すのではなくcancelボタンを押すと
dialogは閉じるのですが、さらにもう一度dialogを開くと前にsaveしていないデータがそのまま入力されて残った形になっています。
cancelボタンを押した時に入力した途中のデータを無くす方法を教えて下さい。

環境 os mac
開発環境 Android studio 2.2.3

入力してcancelボタンを押して閉じてからまたdialogを開くとデータが入った状態になってしまう。
イメージ説明

MainActivity.java内

int maxTextLength = 10; int maxNumLength = 1; InputFilter.LengthFilter lengthFilter = new InputFilter.LengthFilter(maxTextLength); InputFilter.LengthFilter lengthNumFilter = new InputFilter.LengthFilter(maxNumLength); final EditText editText = new EditText(MainActivity.this); editText.setFilters(new InputFilter[]{lengthFilter}); editText.setInputType(InputType.TYPE_CLASS_TEXT); final Editable lotText = editText.getText(); final EditText editNum = new EditText(MainActivity.this); editNum.setFilters(new InputFilter[]{lengthNumFilter}); editNum.setInputType(InputType.TYPE_CLASS_NUMBER); final Editable lotNum = editNum.getText(); addButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(MainActivity.this); if (alertDialog == null){ LinearLayout layout = new LinearLayout(MainActivity.this); layout.setOrientation(LinearLayout.VERTICAL); TextView conponentText = new TextView(MainActivity.this); conponentText.setText(R.string.add_data); layout.addView(conponentText); layout.addView(editText); TextView numText = new TextView(MainActivity.this); numText.setText(R.string.add_num); layout.addView(numText); layout.addView(editNum); alertDialogBuilder .setTitle(R.string.add_result) .setView(layout) .setPositiveButton(R.string.save_button, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { if (editText.length()==0||editNum.length()==0||lotNum.toString().equals("0")){ Toast.makeText(getApplicationContext(),R.string.setting_noting,Toast.LENGTH_SHORT).show(); }else { switch (tabNumber){ case 0: lot1Array.add(new DataType(lotText.toString(),lotNum.toString())); PrefManager.saveDataList(getApplicationContext(),"lot1Array",lot1Array); IndicateArray(lot1Array, tabNumber); break; case 1: lot2Array.add(new DataType(lotText.toString(),lotNum.toString())); PrefManager.saveDataList(getApplicationContext(),"lot2Array",lot2Array); IndicateArray(lot2Array,tabNumber); break; case 2: lot3Array.add(new DataType(lotText.toString(),lotNum.toString())); PrefManager.saveDataList(getApplicationContext(),"lot3Array",lot3Array); IndicateArray(lot3Array,tabNumber); break; } } } }) .setNegativeButton(R.string.cancel_button, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Log.d("UAA:cancel", ""); } }); alertDialog = alertDialogBuilder.create(); alertDialog.show(); } alertDialog.show(); } });

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

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

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

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

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

guest

回答2

0

まず、一回alertDialogが表示された後の処理なので、alertDialog == nullの部分には処理が入りません。つまり、1回目に作成したalertDialogと同じものが再度表示されるということです。

java

1 if (alertDialog == null){ 2 // 以下省略

ここのnull checkをやめてその都度alertDialogを生成すれば期待したような挙動になります。

投稿2017/10/13 03:50

hiramekun

総合スコア428

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

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

navesanta

2017/10/13 04:03

null checkをなくす(if文をなくして直にする)と下記のエラーが発生してしまいます。そのためにnull checkをしています。このエラーが出なくする方法はnull check以外にありますか? java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
keicha_hrs

2017/10/13 04:52 編集

勘違いがあったのと考察がまとまっていないのでコメントを取り消します
hiramekun

2017/10/13 09:42

おそらくメンバ変数としてalertDialogが宣言されていますよね?全体を見ていないのでまだなんとも言えないのですが、それをメンバ変数ではなくてonClick()の中で宣言する+nullcheckをやめるというのが方法だと思います
navesanta

2017/10/13 23:44

メンバ変数からonClick()の中に変数を変更してnullcheckをやめましたがエラーは変わりません。調べてみて分かったのですがこのエラーは「一度dialogを作成したので再度作ろうとすると既に親はいるから駄目だよ」と言っており、エラーメッセージの言うとおり一度親を呼び出してremoveviewで削除するか、yonaさんが言うような方法が良い様な気がします。もう少し探って方法を具現化します。
guest

0

ベストアンサー

処理が下記のように分岐しています。
1-alertDialogがnullならダイアログを作成する。
2-alertDialogがnullじゃないなら、そのまま表示する。

2の時はEditTextに適切な文字列を設定する必要がありますね。

投稿2017/10/13 02:55

yona

総合スコア18155

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

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

navesanta

2017/10/13 08:36

>EditTextに適切な文字列を設定する必要がありますね。 alertDialog.show();の前に設定するのだと思うのですが既に出来上がっているdialogのlayout.addviewの中身をクリアにする方法が思いつきません。ヒントをください。
yona

2017/10/13 09:23

各Viewをフィールド変数にしておけばいいですよ。 ただ、毎回AlertDialogを作った方が早いです。また、Viewはレイアウトファイルから生成した方がコード量が減りますよ。
navesanta

2017/10/14 02:52

すみません初歩的な質問ですが >各Viewをフィールド変数にしておけばいいですよ。 この場合の各viewはどれになるのでしょうか? >毎回AlertDialogを作った方が早いです 毎回AlertDialogを作ると言うのは作ってから破棄するということでしょうか? その場合、どういったメソッドを使って破棄すればいいのでしょうか?
yona

2017/10/14 04:30

各Viewは初期化が必要なViewです。 また、ダイアログは破棄する必要は特に ありません。
navesanta

2017/10/14 23:57

>2の時はEditTextに適切な文字列を設定する必要がありますね。 勘違いかもしれませんがalertdialogの場合、EditTextのデータを一度addviewしてしまうと変更しようとすると子ビューには親が既にいるので変更できない(IllegalStateException)という問題があり設定できない路地に入りこんでしまいます。一度親ビューを削除しないとできないのではないでしょうか?
yona

2017/10/15 02:46

おそらく勘違いです。 「エラーが発生する」だけではわからないので、エラーメッセージを質問に追記してください。
navesanta

2017/10/15 04:11

エラーは下記です。 java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
yona

2017/10/15 05:08

そこだけでは意味がありません。 エラーメッセージは全行を見て意味があります。
navesanta

2017/10/15 07:30

>Viewはレイアウトファイルから生成した方がコード量が減りますよ。 こちらのヒントを元にdialogをやめてActivityにて処理を変更したところ問題が全て解決しました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問