2012年03月27日

チェックボックスダイアログを作成する


アラートダイアログをチェックボックスにカスタムしてみたいと思います
アラートダイアログの作成は以下を参照してください
アラートダイアログを表示させる
今回はアラートダイアログに3つの項目のチェックボックスを表示させ
自分で選択したものをTextViewに反映するものを使用したいと思います

まずはmain.xmlにボタンとテキストビューを1つずつ配置します
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	android:orientation="vertical" >


    <Button
    	android:id="@+id/button1"
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	android:text="ダイアログ表示" />

    <TextView
    	android:id="@+id/textView1"
    	android:layout_width="wrap_content"
    	android:layout_height="wrap_content"
    	android:text="TextView" />

</LinearLayout>
次にMainActivity.javaを修正します
動作の目的としては
(1)ボタンを押すとアラートダイアログが表示
(2)チェックボックスの項目を選択する
(3)OKボタンでテキストビューに選択したものが反映される
とします

(1)ボタンを押すとアラートダイアログが表示
button bにid button1を設定します
そのあとsetOnClickListenerでボタンが押された時の動作を定義します
ボタンがクリックされるイベントを取得
ボタンを押すとアラートダイアログ dlgが作成されるようにします

(2)チェックボックスの項目を選択する
アラートダイアログにチェックボックスを表示させるには
setMultiChoiceItemsを使用します
また、表示するリストと初期の選択の有無はあらかじめ設定しておきます

3)OKボタンでテキストビューに選択したものが反映される
最後にOKボタンの設定をして押されるとテキストビューに反映されるようにします

以下にMainActivity.javaを記載します
package blog.test;
 
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
 
public class MainActivity extends Activity {


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    	        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        setTitle("MainActivity");
        
        //表示するリストを作成
        final CharSequence[] list = new CharSequence[3];
        list[0] = "りんご";list[1] = "みかん";list[2] = "いちご";
     	
		/**item初期値設定**/
		final boolean[] checkedItems = new boolean[3];
		checkedItems[0]=true;checkedItems[1]=true;checkedItems[2]=true;
        
        //id button1をbに当てはめている
        Button b = (Button)findViewById(R.id.button1);
        //bが押された時の動作
        b.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
	        	final StringBuffer select= new StringBuffer();
				/**アラートダイアログ設定**/
				AlertDialog.Builder dlg=
				        new AlertDialog.Builder(MainActivity.this);
				dlg.setTitle("くだもの一覧");
				dlg.setMultiChoiceItems(list, checkedItems, 
						new DialogInterface.OnMultiChoiceClickListener() {
					public void onClick(DialogInterface dialog, int which,
					boolean isChecked) {
						//デフォルトで項目が選択されているかどうかを示す論理値を、配列で指定
						checkedItems[which]=isChecked;
						}
					});
				/**OKボタンが押された時の設定**/
				dlg.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int id) {	
						for(int i=0;i

今回のリストは“りんご”“みかん”“いちご”としました
checkedItemsにより初期値はすべて選択されている状態です
ture→falseにすると選択してない状態でダイアログが表示されます
ダイアログ内ではcheckedItems[which]によって値を参照しています

プログラムを実行すると・・・
device65.png
初期画面です
TextViewは初期値そのままです

ボタンを押すと・・・
device66.png
アラートダイアログが表示されます

りんご・みかんを選択した状態でOKを押すと・・・
device67.png

device68.png
テキストビューに選択したものが反映されます

スポンサードリンク

遷移先のアクティビティからデータを返す


前回はMainActivityからSubActivityにデータを渡しました
遷移先画面にデータを渡す
今度は逆に遷移画面先からデータを戻すことをしてみたいと思います
まずはMainActivityを以下のように修正します
変更点としては
1.IntentにrequestCodeを追加する
2.SubActivityから戻ってきたときのonActivityResultを追加する

です
(1)のrequestCodeはMainActivityからどのActivityに遷移したかを設定する値です
今回はSubActivityに移動は“1”としていますが
例えばSubActivity2には“2”のように複数の設定が可能です
次に(2)でonActivityResultを追加します
これは遷移した先から戻ってきたときに実行されるものです
はじめにrequestCodeが1かどうか確認し、結果がOKかどうか確認しています
またmainのレイアウトにもtextViewを追加しましたのでそちらも載せておきます
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:layout_width="fill_parent"
	android:layout_height="fill_parent"
	android:orientation="vertical" >


    <Button
    	android:id="@+id/button1"
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	android:text="subに移動" />

    <TextView
    	android:id="@+id/textView1"
    	android:layout_width="wrap_content"
    	android:layout_height="wrap_content"
    	android:text="TextView" />

</LinearLayout>

MainActivity.java
package blog.test;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
 
public class MainActivity extends Activity {
     int requestCode=1;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    	        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        setTitle("MainActivity");
        //id button1をbに当てはめている
        Button b = (Button)findViewById(R.id.button1);
        //bが押された時の動作
        b.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				//intentの作成
				Intent intent = new Intent(MainActivity.this,SubActivity.class);
				//putExtraで渡す値を設定
				intent.putExtra("int Value", 100);
				intent.putExtra("String Value", "test");
				
				//intentをスタート
				startActivityForResult(intent, requestCode);
			}
		});
        
    }
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (requestCode == 1) {
	        if (resultCode == RESULT_OK) {
	            CharSequence return_string = 
	            		data.getCharSequenceExtra("return String");
	            //id textView1をt1に当てはめている
	            TextView t1 = (TextView)findViewById(R.id.textView1);
	            //受け取った値を表示
	            t1.setText("受け取った文字は"+return_string);
	        }
	    }
	}


}


次にSubActivityを修正します
こちらはfinish()でActivityを終了する直前にMainActivityに
値を渡しています
今回はtest2というStringを戻します
その後setResultでRESULT_OKと設定したintentを送信し
finishで終了させます
以下SubActivity.java
package blog.test;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
 
public class SubActivity extends Activity {
     
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sub);
        setTitle("SubActivity");
        
		Intent intent = getIntent();
		//MainActivityから値を受け取る
		int getint = intent.getIntExtra("int Value",0);
		CharSequence getstring = intent.getCharSequenceExtra("String Value");
        
        
        //id textView1をt1に当てはめている
        TextView t1 = (TextView)findViewById(R.id.textView1);
        //id textView1をt2に当てはめている
        TextView t2 = (TextView)findViewById(R.id.textView2);
        
        //受け取った値を表示
        t1.setText("受け取った数値は"+String.valueOf(getint));
        t2.setText("受け取った文字は"+getstring);
        
        
        //id button1をbに当てはめている
        Button b = (Button)findViewById(R.id.button1);
        //bが押された時の動作
        b.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
				//intentの作成
				Intent intent = new Intent(SubActivity.this,MainActivity.class);
				//putExtraで渡す値を設定
				intent.putExtra("return String", "test2");
				setResult(RESULT_OK, intent);
				finish();
            }
            });
        }
     

}
まず実行するとMainActivityが表示されます
device62.png
textView1の初期値はなにも設定していないのでTextViewと表示されます
一度SubActivityに移動し・・・
device63.png

戻ってくると・・・
device64.png
TextView1が変化しているのがわかります
スポンサードリンク

posted by kenken at 15:31 | Comment(0) | TrackBack(0) | インテント 画面遷移 | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。