2011年3月21日月曜日

Android TableLayout, RelativeLayout で RadioButton を使う

複数の RadioButton をまとめて、そのスコープを設定するための RadioGroup という ViewGroup があります。

この RadioGroup は LinearLayout を継承していて、子要素が RadioButton でなければいけません。
そのため、TableLayout や RelativeLayout のレイアウトでは、RadioButton のスコープを設定することができません。

「ないなら、作ってしまえ」

ということで、作りました。
RadioGroup のソースを見て、ほとんどそのまま LinearLayout を TableLayout, RelativeLayout に置き換えた感じです。


■ TableRadioGroup

 ・ダウンロードはここから TableRadioGroup.java at github

■ RelativeRadioGroup

 ・ダウンロードはここから RelativeRadioGroup.java at github


■ 使い方

 ・TableRadioGroup




<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<yanzm.products.customview.TableRadioGroup
android:id="@+id/table"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<RadioButton
android:id="@+id/radio1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="radio1"
/>
<RadioButton
android:id="@+id/radio2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="radio2"
/>
<RadioButton
android:id="@+id/radio3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="radio3"
/>
</TableRow>
<TableRow
android:id="@+id/group2"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<RadioButton
android:id="@+id/radio4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="radio4"
/>
<RadioButton
android:id="@+id/radio5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="radio5"
/>
<RadioButton
android:id="@+id/radio6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="radio6"
/>
</TableRow>
<TableRow
android:id="@+id/group3"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<RadioButton
android:id="@+id/radio6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="radio7"
/>
<RadioButton
android:id="@+id/radio8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="radio8"
/>
<RadioButton
android:id="@+id/radio9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="radio9"
/>
</TableRow>
</yanzm.products.customview.TableRadioGroup>
<TextView
android:id="@+id/textview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>



public class MainActivity extends Activity {

private TextView mTextView;

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

mTextView = (TextView)findViewById(R.id.textview);

TableRadioGroup group = (TableRadioGroup)findViewById(R.id.table);
group.setOnCheckedChangeListener(new TableRadioGroup.OnCheckedChangeListener() {

public void onCheckedChanged(TableRadioGroup group, int checkedId) {
mTextView.setText("CheckedId : " + checkedId);
}
});
}
}




 ・RelativeRadioGroup




<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<yanzm.products.customview.RelativeRadioGroup
android:id="@+id/relative"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<RadioButton
android:id="@+id/radio1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:text="radio1"
/>
<RadioButton
android:id="@+id/radio2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/radio1"
android:text="radio2"
/>
<RadioButton
android:id="@+id/radio3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/radio1"
android:layout_below="@id/radio2"
android:text="radio3"
/>
<RadioButton
android:id="@+id/radio4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/radio1"
android:layout_below="@id/radio3"
android:text="radio4"
/>
<RadioButton
android:id="@+id/radio5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/radio4"
android:layout_below="@id/radio3"
android:text="radio5"
/>
<RadioButton
android:id="@+id/radio6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/radio4"
android:layout_below="@id/radio5"
android:text="radio6"
/>
<RadioButton
android:id="@+id/radio7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/radio4"
android:layout_below="@id/radio6"
android:text="radio7"
/>
<RadioButton
android:id="@+id/radio8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="radio8"
android:layout_below="@id/radio6"
android:layout_toLeftOf="@id/radio7"
/>
<RadioButton
android:id="@+id/radio9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/radio6"
android:layout_toLeftOf="@id/radio8"
android:text="radio9"
/>
</yanzm.products.customview.RelativeRadioGroup>
<TextView
android:id="@+id/textview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>



public class MainActivity extends Activity {

private TextView mTextView;

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

mTextView = (TextView)findViewById(R.id.textview);

RelativeRadioGroup group = (RelativeRadioGroup)findViewById(R.id.relative);
group.setOnCheckedChangeListener(new RelativeRadioGroup.OnCheckedChangeListener() {

public void onCheckedChanged(RelativeRadioGroup group, int checkedId) {
mTextView.setText("CheckedId : " + checkedId);
}
});
}
}




 

4 件のコメント:

  1. はじめまして藤井と申します。
    いきなりすみませんが

    http://y-anz-m.blogspot.com/2011/03/androidtablelayout-relativelayout.html
    この記事の下記リンクがうまく飛びません
    「yanzm.products.customview.RelativeRadioGroup」
    を使ってみたいのでよろしくお願いします。


    ■ TableRadioGroup

     ・ダウンロードはここから TableRadioGroup.java at github

    ■ RelativeRadioGroup

     ・ダウンロードはここから RelativeRadioGroup.java at github

    返信削除
  2. あらら、すいません。

    https://github.com/yanzm/yanzm-s-Custom-View-Project/tree/master/YanzmCustomView/src/yanzm/products/customview

    からどうぞー。

    返信削除
  3. いつも有益な情報ありがとうございます。
    SDK r21.1で下記のLintエラーがついたのでご報告です。

    YanzmCustomView/res/layout/main.xmlの4行目

    > When using a custom namespace attribute in a library project, use the namespace "http://schemas.android.com/apk/res-auto"

    独自名前空間を使う場合、上記の通りのURLを名前空間として使わなければならないようにいつの間にか変更されたようです。

    返信削除
  4. 随分たっていますが、RelativeLayout の 中にとびとびにRudioButtonを配置した時にどうしたら排他的にできるのかと困り果て、しゃあない、レイアウトをいちからやり直しするしかないかなぁ、面倒だなぁと思っておりましたが、こちらのソースを使ったところ一発でうまくいきました。うーん、さすがです。感動してしまいました。ありがとうございました。

    返信削除