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



  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7.     <yanzm.products.customview.TableRadioGroup  
  8.         android:id="@+id/table"  
  9.         android:layout_width="fill_parent"   
  10.         android:layout_height="wrap_content"   
  11.         >  
  12.         <TableRow  
  13.             android:layout_width="fill_parent"  
  14.             android:layout_height="wrap_content"  
  15.             >  
  16.             <RadioButton  
  17.                 android:id="@+id/radio1"  
  18.                 android:layout_width="wrap_content"  
  19.                 android:layout_height="wrap_content"  
  20.                 android:text="radio1"  
  21.                 />  
  22.             <RadioButton  
  23.                 android:id="@+id/radio2"  
  24.                 android:layout_width="wrap_content"  
  25.                 android:layout_height="wrap_content"  
  26.                 android:text="radio2"  
  27.                 />  
  28.             <RadioButton  
  29.                 android:id="@+id/radio3"  
  30.                 android:layout_width="wrap_content"  
  31.                 android:layout_height="wrap_content"  
  32.                 android:text="radio3"  
  33.                 />  
  34.         </TableRow>  
  35.         <TableRow  
  36.             android:id="@+id/group2"  
  37.             android:orientation="horizontal"  
  38.             android:layout_width="fill_parent"  
  39.             android:layout_height="wrap_content"  
  40.             >  
  41.             <RadioButton  
  42.                 android:id="@+id/radio4"  
  43.                 android:layout_width="wrap_content"  
  44.                 android:layout_height="wrap_content"  
  45.                 android:text="radio4"  
  46.                 />  
  47.             <RadioButton  
  48.                 android:id="@+id/radio5"  
  49.                 android:layout_width="wrap_content"  
  50.                 android:layout_height="wrap_content"  
  51.                 android:text="radio5"  
  52.                 />  
  53.             <RadioButton  
  54.                 android:id="@+id/radio6"  
  55.                 android:layout_width="wrap_content"  
  56.                 android:layout_height="wrap_content"  
  57.                 android:text="radio6"  
  58.                 />  
  59.        </TableRow>  
  60.         <TableRow  
  61.             android:id="@+id/group3"  
  62.             android:layout_width="fill_parent"  
  63.             android:layout_height="wrap_content"  
  64.             >  
  65.             <RadioButton  
  66.                 android:id="@+id/radio6"  
  67.                 android:layout_width="wrap_content"  
  68.                 android:layout_height="wrap_content"  
  69.                 android:text="radio7"  
  70.                 />  
  71.             <RadioButton  
  72.                 android:id="@+id/radio8"  
  73.                 android:layout_width="wrap_content"  
  74.                 android:layout_height="wrap_content"  
  75.                 android:text="radio8"  
  76.                 />  
  77.             <RadioButton  
  78.                 android:id="@+id/radio9"  
  79.                 android:layout_width="wrap_content"  
  80.                 android:layout_height="wrap_content"  
  81.                 android:text="radio9"  
  82.                 />  
  83.         </TableRow>  
  84.     </yanzm.products.customview.TableRadioGroup>  
  85.     <TextView   
  86.         android:id="@+id/textview"  
  87.         android:layout_width="fill_parent"  
  88.         android:layout_height="wrap_content"  
  89.         />  
  90. </LinearLayout>  


  1. public class MainActivity extends Activity {  
  2.   
  3.     private TextView mTextView;  
  4.    
  5.     @Override  
  6.     public void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.main);  
  9.           
  10.         mTextView = (TextView)findViewById(R.id.textview);  
  11.           
  12.         TableRadioGroup group = (TableRadioGroup)findViewById(R.id.table);  
  13.         group.setOnCheckedChangeListener(new TableRadioGroup.OnCheckedChangeListener() {  
  14.            
  15.             public void onCheckedChanged(TableRadioGroup group, int checkedId) {  
  16.                 mTextView.setText("CheckedId : " + checkedId);  
  17.             }  
  18.         });  
  19.     }  
  20. }  




 ・RelativeRadioGroup



  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7.     <yanzm.products.customview.RelativeRadioGroup  
  8.         android:id="@+id/relative"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="wrap_content"   
  11.         >  
  12.         <RadioButton  
  13.             android:id="@+id/radio1"  
  14.             android:layout_width="wrap_content"  
  15.             android:layout_height="wrap_content"  
  16.             android:layout_alignParentTop="true"  
  17.             android:layout_alignParentLeft="true"  
  18.             android:text="radio1"  
  19.             />  
  20.         <RadioButton  
  21.             android:id="@+id/radio2"  
  22.             android:layout_width="wrap_content"  
  23.             android:layout_height="wrap_content"  
  24.             android:layout_toRightOf="@id/radio1"  
  25.             android:text="radio2"  
  26.             />  
  27.         <RadioButton  
  28.             android:id="@+id/radio3"  
  29.             android:layout_width="wrap_content"  
  30.             android:layout_height="wrap_content"  
  31.             android:layout_toRightOf="@id/radio1"  
  32.             android:layout_below="@id/radio2"  
  33.             android:text="radio3"  
  34.             />  
  35.         <RadioButton  
  36.             android:id="@+id/radio4"  
  37.             android:layout_width="wrap_content"  
  38.             android:layout_height="wrap_content"  
  39.             android:layout_toRightOf="@id/radio1"  
  40.             android:layout_below="@id/radio3"  
  41.             android:text="radio4"  
  42.             />  
  43.         <RadioButton  
  44.             android:id="@+id/radio5"  
  45.             android:layout_width="wrap_content"  
  46.             android:layout_height="wrap_content"  
  47.             android:layout_toRightOf="@id/radio4"  
  48.             android:layout_below="@id/radio3"  
  49.             android:text="radio5"  
  50.             />  
  51.         <RadioButton  
  52.             android:id="@+id/radio6"  
  53.             android:layout_width="wrap_content"  
  54.             android:layout_height="wrap_content"  
  55.             android:layout_toRightOf="@id/radio4"  
  56.             android:layout_below="@id/radio5"  
  57.             android:text="radio6"  
  58.             />  
  59.         <RadioButton  
  60.             android:id="@+id/radio7"  
  61.             android:layout_width="wrap_content"  
  62.             android:layout_height="wrap_content"  
  63.             android:layout_toRightOf="@id/radio4"  
  64.             android:layout_below="@id/radio6"  
  65.             android:text="radio7"  
  66.             />  
  67.         <RadioButton  
  68.             android:id="@+id/radio8"  
  69.             android:layout_width="wrap_content"  
  70.             android:layout_height="wrap_content"  
  71.             android:text="radio8"  
  72.             android:layout_below="@id/radio6"  
  73.             android:layout_toLeftOf="@id/radio7"  
  74.             />  
  75.         <RadioButton  
  76.             android:id="@+id/radio9"  
  77.             android:layout_width="wrap_content"  
  78.             android:layout_height="wrap_content"  
  79.             android:layout_below="@id/radio6"  
  80.             android:layout_toLeftOf="@id/radio8"  
  81.             android:text="radio9"  
  82.             />  
  83.     </yanzm.products.customview.RelativeRadioGroup>  
  84.     <TextView   
  85.         android:id="@+id/textview"  
  86.         android:layout_width="fill_parent"  
  87.         android:layout_height="wrap_content"  
  88.         />  
  89. </LinearLayout>  


  1. public class MainActivity extends Activity {  
  2.   
  3.     private TextView mTextView;  
  4.    
  5.     @Override  
  6.     public void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.main);  
  9.           
  10.         mTextView = (TextView)findViewById(R.id.textview);  
  11.           
  12.         RelativeRadioGroup group = (RelativeRadioGroup)findViewById(R.id.relative);  
  13.         group.setOnCheckedChangeListener(new RelativeRadioGroup.OnCheckedChangeListener() {  
  14.      
  15.             public void onCheckedChanged(RelativeRadioGroup group, int checkedId) {  
  16.                 mTextView.setText("CheckedId : " + checkedId);  
  17.             }  
  18.         });  
  19.     }  
  20. }  




 

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を配置した時にどうしたら排他的にできるのかと困り果て、しゃあない、レイアウトをいちからやり直しするしかないかなぁ、面倒だなぁと思っておりましたが、こちらのソースを使ったところ一発でうまくいきました。うーん、さすがです。感動してしまいました。ありがとうございました。

    返信削除