准备自定义无线电组types的布局

我正试图在下面的图像中准备自定义的radiogroup像布局。 我有近8-10行做到这一点。 所以,我准备了一个水平方向的linear layout ,并以编程方式添加了imageviewtextviewradiobutton

在这里输入图像说明

所以如果我检查一个radio button ,其他单选button应该自动取消选中。 在进行这个任务之前,我又遇到了另外一个问题,如果我的单选button被选中一次,那么单选button不是无法检查的,只是点击它们。 以下是我的代码。

 public class MainActivity extends Activity{ RadioButton[] radioBtns = new RadioButton[10]; String texts[] = {"text1", "text2", .... "text10"}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); entireLayout = (LinearLayout)findViewById(R.id.main_layout); for(int i =0; i<10; i++) { LinearLayout rowLayout=new LinearLayout(this); radioBtns[i] = new RadioButton(this); radioBtns[i].setId(i); radioBtns[i].setOnCheckedChangeListener(cblistener); ImageView imageView = new ImageView(this); TextView tv = new TextView(this); tv.setText(texts[i]); rowLayout.addView(imageView); rowLayout.addView(tv); rowLayout.addView(radioBtns[i]); entireLayout.addView(rowLayout); View line = new View(this); line.setBackgroundColor(getResources().getColor(R.color.horizontallinecolor)); entireLayout.addView(line, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, 1)); } } CompoundButton.OnCheckedChangeListener cblistener = new CompoundButton.OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton checkedbutton, boolean paramAnonymousBoolean) { switch (checkedbutton.getId()) { case 0: Log.d("tag", "checked 0th position"); break; .......................... .......................... } } }; } 

我通过保持日志观察。 控件首次进入onCheckedChanged()时被检查,但没有被选中。 我想知道这些是不可检测的。

根据我的要求,我有一个更多的想法来准备这个布局,就像我准备一个更多的布局在xml中 。 然后将视图充气10次。 但是,那么,我怎样才能检查只有一个单选button,以便其他选定的一个被取消选中。 有人可以build议我如何通过最好的方式来实现这种types的radiogroup

注意:我已经保存了我的上面的代码,因为显示我已经尝试过。 如果这是完全错误的方式,请容易,请build议我如何做到这一点。

Solutions Collecting From Web of "准备自定义无线电组types的布局"

根据我的经验,使用这种定制的RadioGroups是一个麻烦的制造者。 我准备了一些代码,这将是我的方法来解决你想要完成的。 希望对你有帮助!

首先,你必须在你的onCreate()(或者你在创build视图的地方)调用这个函数,

  private void addRadioButtons() { LinearLayout llGroup = (LinearLayout) findViewById(R.id.linearLayoutGroup); for(int i=0; i<10; i++){ MyRadioButton mrb = new MyRadioButton(this); mrb.setText(String.valueOf(i)); llGroup.addView(mrb.getView()); } } 

class级应该是

 private static class MyRadioButton implements View.OnClickListener{ private ImageView iv; private TextView tv; private RadioButton rb; private View view; public MyRadioButton(Context context) { view = View.inflate(context, R.layout.my_radio_button, null); rb = (RadioButton) view.findViewById(R.id.radioButton1); tv = (TextView) view.findViewById(R.id.textView1); iv = (ImageView) view.findViewById(R.id.imageView1); view.setOnClickListener(this); rb.setOnCheckedChangeListener(null); } public View getView() { return view; } @Override public void onClick(View v) { boolean nextState = !rb.isChecked(); LinearLayout lGroup = (LinearLayout)view.getParent(); if(lGroup != null){ int child = lGroup.getChildCount(); for(int i=0; i<child; i++){ //uncheck all ((RadioButton)lGroup.getChildAt(i).findViewById(R.id.radioButton1)).setChecked(false); } } rb.setChecked(nextState); } public void setImage(Bitmap b){ iv.setImageBitmap(b); } public void setText(String text){ tv.setText(text); } public void setChecked(boolean isChecked){ rb.setChecked(isChecked); } } 

和XML膨胀,如下所示:

 <?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="wrap_content" android:gravity="center_vertical" android:orientation="horizontal" > <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:text="Medium Text" android:textAppearance="?android:attr/textAppearanceMedium" /> <RadioButton android:id="@+id/radioButton1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> 

有点迟了,但我遇到了同样的问题,出于挫折,我写了一个名为RadioGroupPlus的新课程来解决这个问题,我想分享。

回购可以在这里find: https : //github.com/worker8/RadioGroupPlus/

如何安装

在顶级build.gradle添加库:

 allprojects { repositories { maven { url "https://jitpack.io" } } } 

在你的app/build.gradle ,添加这个作为依赖:

 compile 'com.github.worker8:RadioGroupPlus:v1.0.1' 

如何使用

在你的xml中,用<worker8.com.github.radiogroupplus.RadioGroupPlus包装你的自定义布局,比如:

 <worker8.com.github.radiogroupplus.RadioGroupPlus android:id="@+id/radio_group_plus" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout...> <ImageView...> <TextView...> <RadioButton...> </LinearLayout> <LinearLayout...> <ImageView...> <TextView...> <RadioButton...> </LinearLayout> <LinearLayout...> <ImageView...> <TextView...> <RadioButton...> </LinearLayout> </worker8.com.github.radiogroupplus.RadioGroupPlus> 

我故意忽略细节,以便阅读。 我在README页面中写了更多关于如何使用RadioGroupPlus信息。 另外我还写了一个简单的例子来说明如何使用它。 所以,如果您需要了解更多信息,您可以在RadioGroupPlus回购协议中了解更多信息。

希望能帮助到你!

棘手的部分是你想要button在右侧
要做到这一点,在每个button,我删除了原来的button,设置右边的可绘制的button
没有什么可说的左边的drawable。

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffff" android:padding="8dp" > <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:padding="4dp" > <RadioGroup android:layout_gravity="center_horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/rgOne" > <RadioButton android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/rdo1" android:text="RadioButton 1" android:button="@null" android:drawableRight="@android:drawable/btn_radio" android:drawableLeft="@drawable/ic_launcher" android:checked="true" android:onClick="onRadioButtonClicked" /> <RadioButton android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/rdo2" android:text="RadioButton 2" android:button="@null" android:drawableRight="@android:drawable/btn_radio" android:drawableLeft="@drawable/ic_launcher" android:onClick="onRadioButtonClicked" /> <RadioButton android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/rdo3" android:text="RadioButton 3" android:button="@null" android:drawableRight="@android:drawable/btn_radio" android:drawableLeft="@drawable/ic_launcher" android:onClick="onRadioButtonClicked" /> </RadioGroup> </RelativeLayout> </RelativeLayout> 

这是代码:

 package com.example.aaa; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // If you need to fire RadioButtonClick event: onRadioButtonClicked(findViewById(R.id.rdo1)); // Otherwise, remove previous line } public final void onRadioButtonClicked(final View v) { String str = "1"; switch(v.getId()) { case R.id.rdo1: { // do something str = "1"; break; } case R.id.rdo2: { // do something str = "2"; break; } case R.id.rdo3: { // do something str = "3"; break; } default: { // do something str = "that doesn' exist"; break; } } Toast.makeText ( getApplicationContext(), "RadioButton " + str, Toast.LENGTH_LONG ).show(); } } 

编辑布局删除第二部分,这是没有用处的你的目的。
如果你看一下布局,你会看到把button放在右边的技巧是什么。
如果你不想使用布局,这也可以在代码中完成(为什么?)
使用我的布局(不需要一个cusom类),你会得到的结果是…

在这里输入图像说明在这里输入图像说明在这里输入图像说明

非常类似于你的目标,不是吗?

您想要在代码中复制的复杂线条(再次,为什么?)是:

 android:button="@null" android:drawableRight="@android:drawable/btn_radio" // or your selector, with custom on/off pngs android:drawableLeft="@drawable/ic_launcher" // or whatever 

实现您的自定义RadioGroup类以满足您的要求并不困难。 你也可以实现一个自定义的RadioButton 。 定义定制组件可以更容易地扩展和绕过默认组件的限制。

我已经介绍了在本教程中创build自定义RadioGroup和自定义RadioButton的过程。 此外,我已经上传我的代码到Github 。

回答@Junior Buckeridge为我工作。 我只是想增加我的2美分。 如果在线性布局中有任何可点击的视图,请确保将android:descendantFocusability =“blocksDescendants”添加到您的视图的线性布局和android: focusable =“false” (可以是button,单选button等)