EditTextが未入力でない場合にProgressDialogを表示させるサンプルアプリです!
※はじめに
この記事はAndroidアプリの開発が、初心者であるという方のための記事です。
そのため、なるべく複雑な説明は避け、コピー&ペイストですぐに動くものをご紹介します。
JavaやAndroidを理解されている方で細かい説明が必要な方は、当ブログ内の連載記事である「Android Tips」をご覧ください。
Androidで「処理待ち」の際に用いる、ProgressDialogに関するアプリをご紹介します。
今回はスレッドという言葉が頻繁に出現しますが、とりあえず気にせずに動かしてみてください。
EditTextが未入力(null)ではない場合に、ProgressDialogを表示させる
このアプリは、入力した値を登録するような動きをする簡易アプリです。
今回はデータベースは使用しません。
したがって、実際には入力内容は登録されません。(データベースを追加したサンプルアプリは、次回ご紹介します。)
アプリのポイント①:ProgressDialog
よくダウンロード等を行っている時に、「ダウンロード中です…」みたいな画面が出ますよね?
あれがProgressDialogです。
円と横棒がありますが、今回は円を用いています。(横棒のサンプルも近々アップします。)
アプリのポイント②:EditTextの入力内容の有無(nullかどうか)を取得
if文の条件式の中に用いるEditTextの入力有無の確認方法は、意外に間違えますので、しっかり確認してくださいね。
条件式の中に次のように入力される方が多いようです。(私も以前やってしまいました。笑)
if(editText == null) if(editText.getText() == null) if(editText.getText().equals(""))
次のように記述するとうまくいきます。
if(editText.getText().toString().equals(""))
アプリ完成図
アプリのイメージ
このアプリの流れです。
図と併せて確認してください。
※図は大まかな説明としていますので、イメージだけ掴んでください。
- 文字を入力(未入力の場合はToastにて文字入力を促す。※図では省略)
- 「登録ボタン」を押下した際に、ProgressDialogを表示させる
- 別スレッドの処理が終了した直後に、ProgressDialogを閉じる
- 最後にToastを表示させる。
MainActivity.java(ソースコード)方法①:匿名クラスを用いる方法
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(ソースコード)方法②:匿名クラスを用いない方法
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(ソースコード)方法②:匿名クラスを用いず、別クラスに処理を記述する方法
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)は下記になります。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" 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です。