В моем приложении для Android я сделал настраиваемый диалог оповещений. Он открывается при нажатии кнопки. В этом диалоговом окне есть 4 переключателя, которые должны реагировать как радиолюбители. Я не хочу использовать радиобуты по соображениям дизайна.Howto: реализовать OnClickListener для ToggleButtons в AlertDialog?
Я не могу сделать это, чтобы реализовать прослушиватель onClick для этих кнопок toggle. Я получаю их в некотором смысле, что только одна кнопка может быть «Вкл.», А остальная часть должна быть выключена. (Как группа RadioButton)
Я не могу в данный момент загрузить изображение с моей репутацией, так вот XML вместо:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/Dlg_DrvPut"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical|center_horizontal"
android:text="@string/DrvPutDlgTitle"
android:textAppearance="?android:attr/textAppearanceLarge" />
<TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_x="1dp"
android:layout_y="3dp"
android:gravity="center_vertical|center_horizontal"
android:text="@string/DrvPutDlgDrvCap" />
<TableLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:shrinkColumns="*"
android:stretchColumns="*" >
<TableRow
android:id="@+id/tableRow1"
android:layout_width="fill_parent"
android:layout_height="wrap_content">"
<ToggleButton
android:id="@+id/rb_hit"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textOn="Hit"
android:textOff="Hit"
android:layout_column="0" >
</ToggleButton>
<ToggleButton
android:id="@+id/rb_left"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textOn="Left"
android:textOff="Left"
android:layout_column="1" />
<ToggleButton
android:id="@+id/rb_right"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textOn="Right"
android:textOff="Right"
android:layout_column="2" />
<ToggleButton
android:id="@+id/rb_miss"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textOn="Miss"
android:textOff="Miss"
android:layout_column="3" />
</TableRow>
</TableLayout>
<EditText
android:id="@+id/drvDst"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="number" >
</EditText>
<TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_x="1dp"
android:layout_y="3dp"
android:gravity="center_vertical|center_horizontal"
android:text="@string/DrvPutDlgPutCap" />
<EditText
android:id="@+id/putDst"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="numberDecimal" />
</LinearLayout>
Как это можно сделать?
Я попробовал упомянутый onCheckedChangeListener, но это, похоже, недоступно в AlertDialogBuilder. Вот код, который будет запущен после нажатия кнопки, чтобы отобразить alertdialog. Это действующий код с onCheckedChangeListener для каждой кнопки переключения. Проверенное состояние установлено на false для всех остальных кнопок переключения, если одна из кнопок проверена пользователем.
public void pDrvPutClick(View v) {
final Button b = (Button) v;
LayoutInflater inflater = getLayoutInflater();
View dstView = inflater.inflate(R.layout.dlg_drvput, null);
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setView(dstView);
final EditText edit_ddst = (EditText) dstView.findViewById(R.id.drvDst);
final EditText edit_pdst = (EditText) dstView.findViewById(R.id.putDst);
final ToggleButton rb1 = (ToggleButton) dstView.findViewById(R.id.rb_hit);
final ToggleButton rb2 = (ToggleButton) dstView.findViewById(R.id.rb_left);
final ToggleButton rb3 = (ToggleButton) dstView.findViewById(R.id.rb_right);
final ToggleButton rb4 = (ToggleButton) dstView.findViewById(R.id.rb_miss);
rb1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if (isChecked)
{
rb2.setChecked(false);
rb3.setChecked(false);
rb4.setChecked(false);
}
}
});
rb2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if (isChecked)
{
rb1.setChecked(false);
rb3.setChecked(false);
rb4.setChecked(false);
}
}
});
rb3.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if (isChecked)
{
rb1.setChecked(false);
rb2.setChecked(false);
rb4.setChecked(false);
}
}
});
rb4.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if (isChecked)
{
rb1.setChecked(false);
rb3.setChecked(false);
rb2.setChecked(false);
}
}
});
builder.setPositiveButton("OK", new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int whichButton){
String ddst;
ddst = edit_ddst.getText().toString();
if (ddst=="") {
ddst="Drive";
}else {
if (rb1.isChecked()){
ddst="H"+ddst;
}
if (rb2.isChecked()){
ddst="L"+ddst;
}
if (rb3.isChecked()){
ddst="R"+ddst;
}
if (rb4.isChecked()){
ddst="M"+ddst;
}
}
String pdst;
pdst = edit_pdst.getText().toString();
if (pdst=="") {
pdst="PutDst";
}
b.setText(ddst+"\n"+pdst);
}
});
Почему бы не использовать радиокнопки? Где ваш код onClickListener? – verybadalloc
Я не хочу, чтобы радиобуты по соображениям дизайна ... код сейчас выше ... – Marco