2010年10月5日火曜日

Android AlertDialogを表示する

基本的な使い方

タイトルとメッセージを表示するだけの基本的なAlertDialogです。
「戻る」ボタンで元の画面に戻ります。

package my.study.android;

import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;

public class MainActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
              
        AlertDialog.Builder alert = new AlertDialog.Builder(this);
        alert.setTitle("Title");
        alert.setMessage("Message");
        alert.show();
    }  
}

OKダイアログ

次にOKボタンを表示し、ダイアログを閉じられるようにします。
OKボタンをクリックしたときに画面を閉じるだけの場合、setPositiveButton()メソッドの第2引数をnullにします。

package my.study.android;

import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;

public class MainActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
              
        AlertDialog.Builder alert = new AlertDialog.Builder(this);
        alert.setTitle("Title");
        alert.setMessage("Message");
        alert.setPositiveButton("OK", null);
        alert.show();
    }  
}


Yes/Noダイアログ

Yesボタンを押したときの処理はsetPositiveButton()メソッドの第2引数にDialogInterface.OnClickListenerを設定して、処理を記述します。
Noボタンを押したときの処理はsetNegativeButton()メソッドの第2引数にDialogInterface.OnClickListenerを設定して、処理を記述します。

package my.study.android;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
              
        AlertDialog.Builder alert = new AlertDialog.Builder(this);
        alert.setTitle("Title");
        alert.setMessage("Message");
        alert.setPositiveButton("Yes", new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int which) {
                //Yesボタンが押された時の処理
                Toast.makeText(MainActivity.this, "Yes Clicked!", Toast.LENGTH_LONG).show();
            }});
        alert.setNegativeButton("No", new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int which) {
                //Noボタンが押された時の処理
                Toast.makeText(MainActivity.this, "No Clicked!", Toast.LENGTH_LONG).show();
            }});
        alert.show();
    }  
}

Yes/No/Cancelダイアログ

先ほどのYes/Noダイアログでは、setNegativeButton()メソッドにNoボタンを設定しましたが、
Yesボタン、Noボタン、Cancelボタンの順にボタンを配置したい場合は、
YesボタンはsetPositiveButton()、NoボタンはsetNeutralButton()、CancelボタンはsetNegativeButton()に処理を記述します。
setPositiveButton()メソッドで設定したボタンは一番左、setNeutralButton()メソッドで設定したボタンは中央、setNegativeButton()メソッドで設定したボタンは一番右に配置されます。

package my.study.android;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
              
        AlertDialog.Builder alert = new AlertDialog.Builder(this);
        alert.setTitle("Title");
        alert.setMessage("Message");
        alert.setPositiveButton("Yes", new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int which) {
                //Yesボタンが押された時の処理
                Toast.makeText(MainActivity.this, "Yes Clicked!", Toast.LENGTH_LONG).show();
            }});
            alert.setNeutralButton("No", new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int which) {
                //Noボタンが押された時の処理
                Toast.makeText(MainActivity.this, "No Clicked!", Toast.LENGTH_LONG).show();
            }});
        alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){
            public void onClick(DialogInterface dialog, int which) {
                //Cancelボタンが押された時の処理
    Toast.makeText(MainActivity.this, "Cancel Clicked!", Toast.LENGTH_LONG).show();
   }});
     alert.show();
    }  
}

ダイアログにリストを表示する

setItems()メソッドを使って、ダイアログにリストを表示させる事ができます。

package my.study.android;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
              
        final String[] items = {"item1","item2","item3"};
        AlertDialog.Builder alert = new AlertDialog.Builder(this);
        alert.setTitle("Title");
        alert.setItems(items, new DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int idx) {
                // リストアイテムを選択したときの処理
                Toast.makeText(MainActivity.this, String.format("%s Selected", items[idx]), Toast.LENGTH_LONG).show();
            }});
        alert.show();
    }  
}

ダイアログにラジオボタン付きのリストを表示する

setSingleChoiceItems()メソッドを使って、ダイアログにラジオボタン付きのリストを表示できます。
setSingleChoiceItems()メソッドの第1引数にはリストに表示する項目の配列、第2引数には選択するラジオボタンの初期値を指定します。初期値に-1を選択すると何も選択されません。

package my.study.android;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity {
    
    private int mCheckedItem = -1;
 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
               
        final String[] items = {"item1","item2","item3"};
        AlertDialog.Builder alert = new AlertDialog.Builder(this);
        alert.setTitle("Title");
        alert.setSingleChoiceItems(items,mCheckedItem,new DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(MainActivity.this, String.format("%s Selected", items[which]), Toast.LENGTH_LONG).show();
                mCheckedItem = which;
            }});
        alert.setPositiveButton("OK", new  DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Toast.makeText(MainActivity.this, String.format("%s Selected", items[mCheckedItem]), Toast.LENGTH_LONG).show();
            }});
        alert.show();
    }  
}

ダイアログにチェックボックス付きのリストを表示する

setMultiChoiceItems()メソッドを使って、複数選択できるチェックボックス付きのリストを表示することができます。
setMultiChoiceItems()メソッドの第1引数にはリストに表示する項目の配列、第2引数には選択するチェックボックスの初期値を論理値配列で指定します。

package my.study.android;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity {
    
    private boolean[] mCheckedItems = {true,false,true};
 
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
               
        final String[] items = {"item1","item2","item3"};
        AlertDialog.Builder alert = new AlertDialog.Builder(this);
        alert.setTitle("Title");
        alert.setMultiChoiceItems(items, mCheckedItems, new DialogInterface.OnMultiChoiceClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int which, boolean isChecked) {
                mCheckedItems[which] = isChecked; 
            }});
        alert.setPositiveButton("OK", new  DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int idx) {
                String str =  null;
                for (int i = 0; i < mCheckedItems.length; i++){
                    if (mCheckedItems[i] == true){
                        str += items[i];
                    }
                }
                if (str == null){
                    str = "No Selected";
                }
                Toast.makeText(MainActivity.this, str, Toast.LENGTH_LONG).show();
            }});
        alert.show();
    }  
}

独自のレイアウトを表示する

AlertDialogに独自のレイアウトを表示することもできます。


まずAlertDialogに表示するレイアウトを作成します。
EditTextを1つ配置したレイアウトを作成しました。
res/layout/alert.xml
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
  
 <EditText android:id="@+id/EditText01" 
 android:layout_height="wrap_content" 
 android:layout_width="fill_parent">
 </EditText>

</LinearLayout>
LayoutInflaterクラスを使用して、レイアウトからViewを作成し、AlertDialog#setView()メソッドでViewを設定します。
MainActivity.java
package my.study.android;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity { 
  
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        AlertDialog.Builder alert = new AlertDialog.Builder(this);
        alert.setTitle("Title");
        //LayoutInflaterクラスを使用して、レイアウトからViewを作成します。
        LayoutInflater inflater = LayoutInflater.from(this);
        final View viw = inflater.inflate(R.layout.alert,null);  
        //AlertDialogにビューを設定します。
        alert.setView(viw);   
        alert.setPositiveButton("OK", new  DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int idx) {
                EditText txt = (EditText)viw.findViewById(R.id.EditText01);
                Toast.makeText(MainActivity.this,txt.getText(),Toast.LENGTH_LONG).show();
            }});
        alert.show();
    }  
}

2 件のコメント:

blog.melancholia さんのコメント...

大変参考になりました。
ありがとうございます!

yan さんのコメント...

誰かのお役に立てて嬉しいです。
ありがとうございます。