EditTextが未入力でない場合にProgressDialogを表示させるサンプルアプリです!
※はじめに
この記事はAndroidアプリの開発が、初心者であるという方のための記事です。
そのため、なるべく複雑な説明は避け、コピー&ペイストですぐに動くものをご紹介します。
JavaやAndroidを理解されている方で細かい説明が必要な方は、当ブログ内の連載記事である「Android Tips」をご覧ください。
Androidで「処理待ち」の際に用いる、ProgressDialogに関するアプリをご紹介します。
今回はスレッドという言葉が頻繁に出現しますが、とりあえず気にせずに動かしてみてください。
EditTextが未入力(null)ではない場合に、ProgressDialogを表示させる
このアプリは、入力した値を登録するような動きをする簡易アプリです。
今回はデータベースは使用しません。
したがって、実際には入力内容は登録されません。(データベースを追加したサンプルアプリは、次回ご紹介します。)
アプリのポイント①:ProgressDialog
よくダウンロード等を行っている時に、「ダウンロード中です…」みたいな画面が出ますよね?
あれがProgressDialogです。
円と横棒がありますが、今回は円を用いています。(横棒のサンプルも近々アップします。)
アプリのポイント②:EditTextの入力内容の有無(nullかどうか)を取得
if文の条件式の中に用いるEditTextの入力有無の確認方法は、意外に間違えますので、しっかり確認してくださいね。
条件式の中に次のように入力される方が多いようです。(私も以前やってしまいました。笑)
1 2 3 | if (editText == null ) if (editText.getText() == null ) if (editText.getText().equals( "" )) |
次のように記述するとうまくいきます。
1 | if (editText.getText().toString().equals( "" )) |
アプリ完成図
アプリのイメージ
このアプリの流れです。
図と併せて確認してください。
※図は大まかな説明としていますので、イメージだけ掴んでください。
- 文字を入力(未入力の場合はToastにて文字入力を促す。※図では省略)
- 「登録ボタン」を押下した際に、ProgressDialogを表示させる
- 別スレッドの処理が終了した直後に、ProgressDialogを閉じる
- 最後にToastを表示させる。
MainActivity.java(ソースコード)方法①:匿名クラスを用いる方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | package com.example.progressbarsample; import android.app.Activity; import android.app.ProgressDialog; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { private ProgressDialog progressDialog; @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button b1 = (Button) findViewById(R.id.button1); b1.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { EditText editText = (EditText) findViewById(R.id.editText1); if (editText.getText().toString().equals( "" )) { Toast.makeText(MainActivity. this , "値を入力してください。" , Toast.LENGTH_LONG).show(); } else { progressDialog = new ProgressDialog(MainActivity2. this ); //ProgressDialogで円を用いる場合に使用 progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); //ProgressDialogのタイトル progressDialog.setTitle( "登録中" ); //ProgressDialogに表示させるメッセージ progressDialog.setMessage( "少々お待ちください。" ); //ProgressDialogのキャンセルの可否 progressDialog.setCancelable( true ); //ProgressDialogを表示 progressDialog.show(); Thread thread = new Thread( new Runnable() { public void run() { try { //別スレッドでの処理を記述(例:入力されたものをデータベースへ登録といった処理を記述) //ここでは2秒間スリープさせている。 Thread.sleep( 2000 ); } catch (InterruptedException e) { Log.e( "RunnableException" , "InterruptedException" ); } progressDialog.dismiss(); handler.sendEmptyMessage( 0 ); } }); thread.start(); } } }); } private Handler handler = new Handler() { public void handleMessage(Message m) { // 別スレッドでの処理が終わった後(ProgressDialogを閉じた後)の処理を記述 Toast.makeText( MainActivity. this , ((EditText) findViewById(R.id.editText1)).getText() + "を登録しました。" , Toast.LENGTH_SHORT).show(); } }; } |
MainActivity.java(ソースコード)方法②:匿名クラスを用いない方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | package com.example.progressbarsample; import android.app.Activity; import android.app.ProgressDialog; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity implements OnClickListener, Runnable { private ProgressDialog progressDialog; @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button b1 = (Button) findViewById(R.id.button1); b1.setOnClickListener( this ); } @Override public void onClick(View v) { EditText editText = (EditText) findViewById(R.id.editText1); //editTextに値が入っている場合にProgressDialogを表示させる。 if (editText.getText().toString().equals( "" )) { Toast.makeText( this , "値を入力してください。" , Toast.LENGTH_LONG).show(); } else { progressDialog = new ProgressDialog( this ); //ProgressDialogで円を用いる場合に使用 progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); //ProgressDialogのタイトル progressDialog.setTitle( "登録中" ); //ProgressDialogに表示させるメッセージ progressDialog.setMessage( "少々お待ちください。" ); //ProgressDialogのキャンセルの可否 progressDialog.setCancelable( true ); //ProgressDialogを表示 progressDialog.show(); //別スレッドの開始 Thread thread = new Thread(MainActivity. this ); thread.start(); } } @Override public void run() { try { //別スレッドでの処理を記述(例:入力されたものをデータベースへ登録といった処理を記述) //ここでは2秒間スリープさせている。 Thread.sleep( 2000 ); } catch (InterruptedException e) { Log.e( "RunnableException" , "InterruptedException" ); } //ProgressDialogを閉じる progressDialog.dismiss(); handler.sendEmptyMessage( 0 ); } private Handler handler = new Handler() { public void handleMessage(Message m) { // 別スレッドでの処理が終わった後(ProgressDialogを閉じた後)の処理を記述 Toast.makeText( MainActivity. this , ((EditText) findViewById(R.id.editText1)).getText() + "を登録しました。" , Toast.LENGTH_SHORT).show(); } }; } |
MainActivity.java(ソースコード)方法②:匿名クラスを用いず、別クラスに処理を記述する方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | package com.example.progressbarsample; import android.app.Activity; import android.app.ProgressDialog; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { private ProgressDialog progressDialog; @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); Ocl ocl = new Ocl(); Button b1 = (Button) findViewById(R.id.button1); b1.setOnClickListener(ocl); } class Ocl implements OnClickListener { @Override public void onClick(View v) { Rua rua = new Rua(); EditText editText = (EditText) findViewById(R.id.editText1); if (editText.getText().toString().equals( "" )) { Toast.makeText(MainActivity. this , "値を入力してください。" , Toast.LENGTH_LONG).show(); } else { progressDialog = new ProgressDialog(MainActivity3. this ); // ProgressDialogで円を用いる場合に使用 progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); // ProgressDialogのタイトル progressDialog.setTitle( "登録中" ); // ProgressDialogに表示させるメッセージ progressDialog.setMessage( "少々お待ちください。" ); // ProgressDialogのキャンセルの可否 progressDialog.setCancelable( true ); // ProgressDialogを表示 progressDialog.show(); Thread thread = new Thread(rua); thread.start(); } } } class Rua implements Runnable { @Override public void run() { try { // 別スレッドでの処理を記述(例:入力されたものをデータベースへ登録といった処理を記述) // ここでは2秒間スリープさせている。 Thread.sleep( 2000 ); } catch (InterruptedException e) { Log.e( "RunnableException" , "InterruptedException" ); } progressDialog.dismiss(); handler.sendEmptyMessage( 0 ); } } private Handler handler = new Handler() { public void handleMessage(Message m) { // 別スレッドでの処理が終わった後(ProgressDialogを閉じた後)の処理を記述 Toast.makeText( MainActivity. this , ((EditText) findViewById(R.id.editText1)).getText() + "を登録しました。" , Toast.LENGTH_SHORT).show(); } }; } |
activity_main.xml
今回の画面の定義(activity_main.xml)は下記になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | android:layout_width = "fill_parent" android:layout_height = "fill_parent" > < TextView android:id = "@+id/textView1" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_alignParentLeft = "true" android:layout_alignParentTop = "true" android:padding = "@dimen/padding_medium" android:text = "@string/hello_world" tools:context = ".MainActivity" /> < EditText android:id = "@+id/editText1" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_alignParentLeft = "true" android:layout_alignParentRight = "true" android:layout_below = "@+id/textView1" android:ems = "10" android:inputType = "phone" > < requestFocus /> </ EditText > < Button android:id = "@+id/button1" android:layout_width = "fill_parent" android:layout_height = "wrap_content" android:layout_alignParentLeft = "true" android:layout_below = "@+id/editText1" android:text = "入力した内容を登録" /> </ RelativeLayout > |
これでOKです。