我想要一组按钮,用户可以选择其中一个作为选项。它必须是像行为一样的无线电组,但我不希望无线电圈存在。我只希望用户只能切换其中一个按钮。
我想我需要像togglegroup那样。
Android中是否存在类似的内容?
答案 0 :(得分:83)
我只是重新使用 RadioGroup
,所以:(请注意onClick
属性,即按下按钮会触发您的活动onToggle(View)
方法
<RadioGroup android:id="@+id/toggleGroup"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:orientation="horizontal"
>
<ToggleButton android:id="@+id/btn_Letter"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_weight="1"
android:textSize="14sp"
android:textOn="Letter"
android:textOff="Letter"
android:onClick="onToggle"
android:checked="true"
/>
<ToggleButton android:id="@+id/btn_A4"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_weight="1"
android:textSize="14sp"
android:textOn="A4"
android:textOff="A4"
android:onClick="onToggle"
/>
</RadioGroup>
在您的Activity或其他地方,您可以定义一个监听器,例如
static final RadioGroup.OnCheckedChangeListener ToggleListener = new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(final RadioGroup radioGroup, final int i) {
for (int j = 0; j < radioGroup.getChildCount(); j++) {
final ToggleButton view = (ToggleButton) radioGroup.getChildAt(j);
view.setChecked(view.getId() == i);
}
}
};
并注册,例如onCreate()
:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.scan_settings);
((RadioGroup) findViewById(R.id.toggleGroup)).setOnCheckedChangeListener(ToggleListener);
}
最后在onToggle(View)
,你会做任何需要发生的事情,特定于你的应用。并使用切换视图的id调用RadioGroup的检查方法。像这样:
public void onToggle(View view) {
((RadioGroup)view.getParent()).check(view.getId());
// app specific stuff ..
}
答案 1 :(得分:13)
您可以使用常规单选按钮并将图像用于RadioButton背景,而不指定文本字符串:
<RadioButton
android:id="@+id/custom_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:button="@null"
android:background="@drawable/button_custom"
/>
对于背景,使用任何drawable,但很可能你会想要使用一个选择器来为不同的状态提供不同的图像。最简单的版本只使用两个图像:
<item android:state_checked="true" android:state_pressed="true"
android:drawable="@drawable/custom_selected" />
<item android:state_checked="false" android:state_pressed="true"
android:drawable="@drawable/custom_normal" />
<item android:state_checked="true" android:state_focused="true"
android:drawable="@drawable/custom_selected" />
<item android:state_checked="false" android:state_focused="true"
android:drawable="@drawable/custom_normal" />
<item android:state_checked="false" android:drawable="@drawable/custom_normal" />
<item android:state_checked="true" android:drawable="@drawable/custom_selected" />
有了这个,单选按钮看起来像一个常规按钮(或者说,看起来像你提供的任何可绘制的),并且表现得像一个广播组中的单选按钮。
答案 2 :(得分:3)
以下是我设法做到的方法(不涉及RadioGroup
):
private CompoundButton.OnCheckedChangeListener toggleListener = new CompoundButton.OnCheckedChangeListener()
{
boolean avoidRecursions = false;
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if(avoidRecursions) return;
avoidRecursions = true;
// don't allow the un-checking
if(!isChecked)
{
buttonView.setChecked(true);
avoidRecursions = false;
return;
}
// un-check the previous checked button
if(buttonView != toggleButton1 && toggleButton1.isChecked()) toggleButton1.setChecked(false);
else if(buttonView != toggleButton2 && toggleButton2.isChecked()) toggleButton2.setChecked(false);
else if(buttonView != toggleButton3 && toggleButton3.isChecked()) toggleButton3.setChecked(false);
else if(buttonView != toggleButton4 && toggleButton4.isChecked()) toggleButton4.setChecked(false);
avoidRecursions = false;
}
};
// ...
toggleButton1.setOnCheckedChangeListener(toggleListener);
toggleButton2.setOnCheckedChangeListener(toggleListener);
toggleButton3.setOnCheckedChangeListener(toggleListener);
toggleButton4.setOnCheckedChangeListener(toggleListener);
答案 3 :(得分:2)
我尝试了上面列出的所有方法,但没有一个真的有效。
试图破解一个看起来像一个真正的按钮的无线电按钮看起来很糟糕。
最终我只使用了RadioGroup源代码并将其修改为接受ToggleButton而不是RadioButton。工作得很好!
以下是Github上的来源:ToggleGroup
用法:
<com.rapsacnz.ToggleGroup
android:id="@+id/deal_detail_toolbar"
android:layout_width="fill_parent"
android:layout_height="60dip"
android:layout_alignParentBottom="true"
android:background="@drawable/bgnd_toggle_button">
<ToggleButton
android:id="@+id/b1"
android:textOn="@string/tab_1_label"
android:textOff="@string/tab_1_label"
android:textSize="10sp"
android:textColor="@color/tab_button_color"
android:checked="true"
android:layout_width="fill_parent"
android:layout_height="60dp"
android:layout_weight="1"
android:drawableTop="@drawable/toggle_spotlight"
android:drawablePadding="-5dp "
android:gravity="bottom|center"
android:paddingTop="10dp"
android:paddingBottom="5dp"
android:background="@drawable/bgnd_transparent" />
<ToggleButton
android:id="@+id/b2"
android:textOn="@string/tab_2_label"
android:textOff="@string/tab_2_label"
android:textSize="10sp"
android:textColor="@color/tab_button_color"
android:checked="false"
android:layout_width="fill_parent"
android:layout_height="60dp"
android:layout_weight="1"
android:drawableTop="@drawable/toggle_browse"
android:gravity="bottom|center"
android:paddingTop="10dp"
android:paddingBottom="5dp"
android:background="@drawable/bgnd_transparent" />
<ToggleButton
android:id="@+id/b3"
android:textOn="@string/tab_3_label"
android:textOff="@string/tab_3_label"
android:textSize="10sp"
android:textColor="@color/tab_button_color"
android:checked="false"
android:layout_width="fill_parent"
android:layout_height="60dp"
android:layout_weight="1"
android:drawableTop="@drawable/toggle_purchased"
android:gravity="bottom|center"
android:paddingTop="10dp"
android:paddingBottom="5dp"
android:background="@drawable/bgnd_transparent" />
</com.rapsacnz.ToggleGroup>
希望这有帮助
答案 4 :(得分:1)
我的解决方案实现了相同的效果,但没有使用无线电按钮。
对于xml,“@ drawable / myselectorfile”中的第一个un“selector”:
<?xml version="1.0" encoding="UTF-8"?>
<selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_checked="false"
android:drawable="@drawable/icon_off" />
<item android:state_checked="true"
android:drawable="@drawable/icon_on" />
</selector>
取消我的列表视图项目的文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<TextView
android:id="@+id/txtInfo"
android:layout_width="140dp"
android:layout_height="wrap_content"
android:paddingTop="15dip" />
<ToggleButton
android:id="@+id/BtnToggle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginRight="14dp"
android:background="@drawable/toggle_style"
android:padding="10dip"
android:textOff=""
android:textOn=""
android:focusable="false"/>
</LinearLayout>
和我的列表视图:
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/lv_lista"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
在oncreate方法中:
lista.setOnItemClickListener(new OnItemClickListener() {
@SuppressWarnings("deprecation")
@Override
public void onItemClick(AdapterView<?> pariente, View view, int posicion, long id) {
@SuppressWarnings("unused")
ListEntity elegido = (ListEntity) pariente.getItemAtPosition(posicion);
varToggle = (ToggleButton) view.findViewById(R.id.BtnToggle);
varToggle.setChecked(true);
// showDialog(0); // dialog optional
//restart btn's
reStart(posicion);
}
});
在Activity类中:
@Override
protected Dialog onCreateDialog(int id){
Dialog dialogo = crearDialogoConfirmacion();
return dialogo;
}
public void reStart(int posicion){
for(int j=0;j<lista.getCount();j++)
{
View vista = lista.getChildAt(j);
ToggleButton varToggle2 = (ToggleButton) vista.findViewById(R.id.BtnToggle);
if(j != posicion){ varToggle2.setChecked(false); }
}
}
答案 5 :(得分:1)
我用LinearLayout代替RadioGroup,使用ButterKnife:
@BindViews({R.id.one, R.id.two, R.id.three})
List<ToggleButton> toggleGroup;
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
ButterKnife.bind(this, view);
}
@OnClick({R.id.one, R.id.two, R.id.three})
public void toggle(ToggleButton selected) {
if (selected.isChecked()) {
// Deselect other buttons
for (ToggleButton button : toggleGroup) {
if (button.getId() != selected.getId()) {
button.setChecked(false);
}
}
} else {
// Disallow deselecting the current button
selected.toggle();
}
}
答案 6 :(得分:1)
我正在使用Kotlin,我尝试了Wolf Paulus的答案,但对我来说效果不佳。 我试用了它,并能够通过以下方式使其工作: 首先,我从xml中删除了“ onClick”:
<RadioGroup android:id="@+id/toggleGroup"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:orientation="horizontal"
>
<ToggleButton android:id="@+id/btn_Letter"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_weight="1"
android:textSize="14sp"
android:textOn="Letter"
android:textOff="Letter"
android:checked="true"
/>
<ToggleButton android:id="@+id/btn_A4"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_weight="1"
android:textSize="14sp"
android:textOn="A4"
android:textOff="A4"
/>
</RadioGroup>
我没有使用ToggleListener
,而是在onCreate()
里面听了我所遇到的每个ToggleButton
:
btn_Letter.setOnClickListener { it -> onToggle(it) }
btn_A4.setOnClickListener { it -> onToggle(it) }
最重要的部分是onToggle(btn: View)
private fun onToggle(btn: View) {
val radioGroup = (btn.parent as RadioGroup)
for (index in 0 until radioGroup.childCount) {
val child = radioGroup.getChildAt(index) as ToggleButton
child.isChecked = child.id == btn.id
// do what ever else you need to do
}
}
就是这样。我希望这会有所帮助。
答案 7 :(得分:0)
所以你想要一次只能选择一个按钮吗? 如果您没有显示单选按钮,用户如何知道她选择了什么?
您可以使用RadioButton和RadioGroup,但我不知道您是否可以轻松生成自定义单选按钮,其外观更适合您的应用。但是,如果你可以扩展radiobutton本身并覆盖draw方法,或者看看哪些按钮可以集成在radiogroup中,那么它应该是可能的。也许你可以为你的视图实现一个特殊的界面,然后在一个radiogroup中将你的一些自定义按钮连接在一起。
答案 8 :(得分:0)
使用任何容器 ViewGroup 添加 CompoundButtons (CheckBox,RadioButton,Switch,SwitchCompat,ToggleButton),然后在 onCheckedChanged 内调用实用程序用于清除其他按钮的功能。
<LinearLayout
android:id="@+id/toggle_group"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ToggleButton
android:id="@+id/toggle_btn1"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:textOff="Off1"
android:textOn="On1" />
<View
android:layout_width="2dp"
android:layout_height="match_parent"
android:layout_margin ="8dp"
android:background="#ffff" />
<ToggleButton
android:id="@+id/toggle_btn2"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:textOff="Off2"
android:textOn="On2" />
</LinearLayout>
在 onCheckedChanged 中,处理状态更改并调用实用程序方法以清除其他子项。以下内容支持从 ViewGroup 派生的所有视图容器组,并允许您在容器中混合非 CompoundButton 对象。由于您经常有 onCheckedChanged 回调,因此只有新代码才能调用实用程序功能。
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int id = buttonView.getId();
switch (id) {
case R.id.toggle_btn1:
if (isChecked) {
doBtn1Action();
doRadioGroupChange((ViewGroup)buttonView.getParent(), id);
}
break;
case R.id.toggle_btn2:
if (isChecked) {
doBtn2Action();;
doRadioGroupChange((ViewGroup)buttonView.getParent(), id);
}
break;
这是清除孩子的实用功能。
/**
* Emulate radioGroup and clear buttons which don't match checkedId.
* @param viewGroup
* @param checkedId
*/
private static void doRadioGroupChange(final ViewGroup viewGroup, final int checkedId) {
for (int rgIdx = 0; rgIdx < viewGroup.getChildCount(); rgIdx++) {
View child = viewGroup.getChildAt(rgIdx);
if (child instanceof CompoundButton) {
final CompoundButton view = (CompoundButton) viewGroup.getChildAt(rgIdx);
view.setChecked(view.getId() == checkedId);
}
}
}
答案 9 :(得分:0)
var myApp = angular.module('myApp',[]);
myApp.controller('MyCtrl', function ($scope) {
$scope.urls = ['https://test1.com/', 'https://test2.com'];
});
myApp.directive('myAppendScript', function () {
return {
restrit: 'A',
scope: {
urlData: '=urlData'
},
link: function (scope, element, attrs) {
var wrapArray = '';
angular.forEach(scope.urlData, function (item, index) {
if (index !== 0 ) {
wrapArray += ','+"'"+item+"'";
} else {
wrapArray += "'"+item+"'";
}
});
wrapArray = '['+wrapArray+']';
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.innerHTML = `
console.log(`+wrapArray+`);
Raven.config('___PUBLIC_DSN___', {
release: '1.3.0',
whitelistUrls: `+wrapArray+`,
}).install()`;
element.append(script);
}
}
});
答案 10 :(得分:0)
科特林版本:
for(index in 0..(radioGroup.childCount-1))
(radioGroup.getChildAt(index) as ToggleButton).isChecked = false