2013年4月3日水曜日

ラジオボタン-01(RadioGroup, RadioButton)

ラジオボタンは複数の選択肢から、
ユーザーに1つだけ選んでもらう際に利用されます。
個人的にはラジオボタンは好きではないのですが、
そういう事を言うと
「システムの人って、本当に面倒くさい!!」
とか思われそうなので、心にしまっています。
はい。


ラジオボタン生成の仕方は
RadioButton oRadioBtn = new RadioButton(this);

さらに

//ラジオボタンにIDを設定
oRadioBtn.setId(int);
//ラジオボタンに文字列を設定
oRadioBtn.setText(String);

idを設定することにより、一意に認識することができるようになり、
setTextで表示する文字列を設定できます。

こんな感じでOKです。

ただ、生成時の引数thisをgetApplicationContext()にする
とsetTextの文字が画面に表示されませんでした。。

壊れかけのラジオボタン!!



ラジオボタンの生成はこれで大丈夫なのですが、
複数のラジオボタンを束ねるマネージャー的な
oRadiGropを利用します。

//生成
RadioGroup oRadiGrop = new RadioGroup(getApplicationContext());

//チェック時の処理を通知させる 
oRadiGrop.setOnCheckedChangeListener();

//ラジオグループにラジオボタンを追加
oRadiGrop.addView(RadioButton, LayoutParams);


ラジオグループを作成して、そこに各ラジオボタンを追加するイメージです。
また、生成時に引数をgetApplicationContext()にしてますが、今のところ
問題ありません。笑


■サンプルソース
package com.example.sample;

import android.os.Bundle;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.Toast;
import android.app.Activity;

public class MainActivity extends Activity implements OnCheckedChangeListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //レイアウトの生成
        LinearLayout layout=new LinearLayout(getApplicationContext());
        //上から下にオブジェクトを配置するよう設定
        layout.setOrientation(LinearLayout.VERTICAL);

        //レイアウトパラム定数(縦横の長さの定数)の格納
        int WC = ViewGroup.LayoutParams.WRAP_CONTENT;
        //レイアウトの横幅・縦幅を設定
        LayoutParams oLayPar = new LinearLayout.LayoutParams(WC, WC);

        //画面表示の設定
        setContentView(layout);
        
        //ラジオグループの登録
        RadioGroup oRadiGrop = new RadioGroup(getApplicationContext());
        //チェック時の処理を通知させる 
        oRadiGrop.setOnCheckedChangeListener(this);
  
        //ラジオグループにラジオボタンを追加
        oRadiGrop.addView(Make_RadioButton(0,"ON"), oLayPar);
        oRadiGrop.addView(Make_RadioButton(1,"OFF"), oLayPar);
        
        //ラジオグループをレイアウトに追加
        layout.addView(oRadiGrop, oLayPar);
    }
 
    @Override
    public void onCheckedChanged(RadioGroup oRG, int Id) {
     //無選択状態のidは-1
        if (Id ==-1)return;
        //IDに紐づくテキストを取得
        String sText = String.valueOf(((RadioButton)findViewById(Id)).getText());
        //現在チェックされているラジオボタンのidを取得
        int iActiveID = oRG.getCheckedRadioButtonId();
        //選択されたIDに紐づくテキストを表示
        Toast.makeText(getApplicationContext(), sText ,Toast.LENGTH_SHORT).show();
        //アクティブなIDを表示
        Toast.makeText(getApplicationContext(), String.valueOf(iActiveID),Toast.LENGTH_SHORT).show();
    }
    
    
    private RadioButton Make_RadioButton(int id, String sTitle){
        //ラジオボタンの生成
        RadioButton oRadioBtn = new RadioButton(this);
        //ラジオボタンにIDを設定
        oRadioBtn.setId(id);
        //ラジオボタンに文字列を設定
        oRadioBtn.setText(sTitle);
        //ラジオボタンを返す
        return oRadioBtn;
    }
}
■実行結果

onCheckedChanged関数内の
String sText = String.valueOf(((RadioButton)findViewById(Id)).getText());



こちらの処理はチェックされている文字列を取得しています。

第2関数のIDから、ラジオボタンを探して、そのラジオボタンに設定されているテキスト
を取得して、文字列で返しています。

//現在チェックされているidを取得
int iActiveID = oRG.getCheckedRadioButtonId();

こちらの処理はリスナー内で読んでいますが、リスナー外でも全然呼べます。
なので、現在の状態が知りたいときにサクッと呼んでください。



//チェック時の処理を通知させる 
oRadiGrop.setOnCheckedChangeListener(this);

また、今回はチェックされたときにimplementのメッソッドが呼ばれていますが、
他にも実装方法はたくさんあるので、いろいろ試してみてください。

話は戻りますが、AndroidのViewパーツを生成時にthisを渡すのがいいのでしょうか??



0 件のコメント:

コメントを投稿