ラジオボタンの変更確認を行いたい

805 views
Skip to first unread message

ayu

unread,
Jan 17, 2012, 12:11:04 AM1/17/12
to 日本Androidの会
お世話になっております。

RadioButtonを押した際に、値を変えていいかの確認メッセージを出し、
OKだったらチェックをつける、
キャンセルだったら何もしない、
という操作をしたいのですが、うまくできませんでした。

もしよい方法があれば教えて頂けませんでしょうか。
よろしくお願い致します。


以下、RadioButtonのonClickでダイアログを出して試したもの。
すでにチェック状態が変わってから確認をしている(?)ので
変更前の状態が保持できずにうまく動作しませんでした。
------------------------------------------------------------
public class RadioButtonTestActivity extends Activity {

RadioButton mRadioButton1;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

mRadioButton1 = (RadioButton) findViewById(R.id.radioButton1);

mRadioButton1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

new AlertDialog.Builder(RadioButtonTestActivity.this)
.setMessage("値を変更してもいいですか?")
.setTitle("確認")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {

}
})
.setNegativeButton("キャンセル", new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which) {
mRadioButton1.setChecked(false);
}
})
.show();

}
});
}
}
------------------------------------------------------------

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/
android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<RadioGroup
android:id="@+id/radioGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">

<RadioButton
android:id="@+id/radioButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="RadioButton1" />

<RadioButton
android:id="@+id/radioButton2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="RadioButton2" />

<RadioButton
android:id="@+id/radioButton3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="RadioButton3" />
</RadioGroup>

</LinearLayout>

------------------------------------------------------------

元木

unread,
Jan 17, 2012, 10:59:54 AM1/17/12
to android-g...@googlegroups.com
こんばんは、元木です。

以下で、どうでしょう?
レイアウトに変更はありません。

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;

public class MainActivity extends Activity {
    
    private RadioGroup radioGroup = null;
    
    private boolean isUserAction = true;
    private int checkedRadioButtonId = -1;
    
    private Handler handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            radioGroup.check(checkedRadioButtonId);
            isUserAction = true;
        }
        
    };
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        radioGroup = (RadioGroup) findViewById(R.id.radio_group);
        checkedRadioButtonId = radioGroup.getCheckedRadioButtonId();
        radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                
                final int id = checkedId;
                if (isUserAction) {
                    new AlertDialog.Builder(MainActivity.this)
                    .setMessage("値を変更してもいいですか?")
                    .setTitle("確認")
                    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                checkedRadioButtonId = id;
                            }
                    })
                    .setNegativeButton("キャンセル", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                isUserAction = false;
                                Message.obtain(handler).sendToTarget();
                            }
                    })
                    .show();
                }
            }
            
        });
    }
}

ayu

unread,
Jan 17, 2012, 8:58:16 PM1/17/12
to 日本Androidの会
元木様

早速返信して頂きありがとうございます。

教えて頂いた方法で実行したところ、希望通りの動きになりました!
ありがとうございます。

・現在の値を保存しておく。
・手で変えたのか裏で変えたのかによって、Dialogを表示するか判断する。
・キャンセルだったら保存しておいた値に戻す。
という処理になるのですね


追加で申し訳ないのですが、
1つ質問があるので教えて頂けると幸いです。

コードでHandlerを使用している部分がありますが、
それが必要な理由というのは何でしょうか?
(Handlerはほとんど使用したことがなく、
別スレッドからGUI操作をする際に必要、
というぐらいの認識しかないのですが。。)

試しに
Message.obtain(handler).sendToTarget();
の部分を
radioGroup.check(checkedRadioButtonId);
isUserAction = true;
に変えてみたところ特にエラーは出ず、
動作としては同じ動きをしたのですが、
それはたまたまうまくいったという感じでしょうか?

よろしくお願い致します。

元木

unread,
Jan 17, 2012, 11:53:57 PM1/17/12
to android-g...@googlegroups.com
ayuさん

こんにちは、元木です。

> コードでHandlerを使用している部分がありますが、
> それが必要な理由というのは何でしょうか?

Handlerを使用しない場合だと、
私の環境(APIレベル4でビルド + IS05(v2.3にアップデート)で実行)
ではうまく動かなかったためです。

具体的には、

  radioGroup.check(checkedRadioButtonId);

を呼ぶと、なぜかRadioGroupの

  onCheckedChanged()

メソッドが2~3回呼ばれることがあり、単純なフラグの切り替えだけでは
対処できませんでした。

もし、複数のバージョン・端末をサポートしたいのでしたら、
上述のようなことがありえる、というのも考慮されるといいと思います。

もっとも、これについて

  ・バージョン or 端末のせいなのか
  ・Handlerを使えば絶対大丈夫なのか

などは、まったく精査してないのでわかりませんが(汗


2012年1月18日10:58 ayu <aym.ka...@gmail.com>:
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。


ayu

unread,
Jan 18, 2012, 5:18:54 AM1/18/12
to 日本Androidの会
元木様

お世話になっております。ayuです。

なるほど、環境の違いもありそうですね。
私の方はAPIレベル12でビルド + L-06C(v3.1)でした。

今のところ限定された端末で使用する予定なので大丈夫かとは思いますが、
将来的に違うバージョン、端末で使用されることも考えて
動きを確認していこうと思います。

色々とありがとうございました。
助かりました!


On 1月18日, 午後1:53, 元木 <kiyoshi.mot...@gmail.com> wrote:
> ayuさん
>
> こんにちは、元木です。
>
> > コードでHandlerを使用している部分がありますが、
> > それが必要な理由というのは何でしょうか?
>
> Handlerを使用しない場合だと、
> 私の環境(APIレベル4でビルド + IS05(v2.3にアップデート)で実行)
> ではうまく動かなかったためです。
>
> 具体的には、
>
> radioGroup.check(checkedRadioButtonId);
>
> を呼ぶと、なぜかRadioGroupの
>
> onCheckedChanged()
>
> メソッドが2~3回呼ばれることがあり、単純なフラグの切り替えだけでは
> 対処できませんでした。
>
> もし、複数のバージョン・端末をサポートしたいのでしたら、
> 上述のようなことがありえる、というのも考慮されるといいと思います。
>
> もっとも、これについて
>
> ・バージョン or 端末のせいなのか
> ・Handlerを使えば絶対大丈夫なのか
>
> などは、まったく精査してないのでわかりませんが(汗
>
> 2012年1月18日10:58 ayu <aym.kam.w...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages