Страница 1 из 1
Как сделать радиодиалог, если количество кнопок неизвестно?
Добавлено: 13 янв 2012, 10:53
Oleg_SS
Есть вот такой пример:
Код: Выделить всё
protected Dialog onCreateDialog(int id){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder = new AlertDialog.Builder(this);
builder.setTitle("Выберите любимое имя кота")
.setCancelable(false)
// добавляем одну кнопку для закрытия диалога
.setNeutralButton("Назад", new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int id)
{
dialog.cancel();
}
})
// добавляем переключатели
.setSingleChoiceItems(mCatsName, -1, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
Toast.makeText(getApplicationContext(), "Любимое имя кота: " + mCatsName[item], Toast.LENGTH_SHORT).show();
}
});
return builder.create();
}
В этом примере количество и название кнопок определяется массивом mCatsName. А если заранее неизвестно, сколько кнопок будет? Как это сделать?
Re: Как сделать радиодиалог, если количество кнопок неизвест
Добавлено: 13 янв 2012, 11:30
RagnarR
Тогда придется напрямую создавать новое View при помощи Inflator'а и запихивать туда необходимое количество радиобатонов.
Re: Как сделать радиодиалог, если количество кнопок неизвест
Добавлено: 13 янв 2012, 12:13
damager82
А я чет не понял вопрос.
Зачем вам знать сколько будет кнопок? Сколько в массиве записей, столько в диалоге и будет кнопок. Он это точно заранее не знает.
Или речь идет о том, что диалог формируется при первом вызове и следующие разы показывает одно и тоже, а хотелось бы менять содержимое?
Тогда можно его удалять по закрытию командой Activity.removeDialog (
http://developer.android.com/reference/ ... ialog(int)). И он каждый раз при показе будет заново создаваться и перечитывать массив.
Может кто-нить знает другой способ? У меня только так получилось в свое время.
P.S. Либо можно использовать Spinner.
Re: Как сделать радиодиалог, если количество кнопок неизвест
Добавлено: 13 янв 2012, 12:33
Oleg_SS
На просторах интернета нагуглил:
Код: Выделить всё
protected void onPrepareDialog(int id, Dialog dialog) {
if (id == YOUR_DIALOG_ID) {
// Create new adapter
ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>();
adapter.add("new items ...");
...
// Use the new adapter
AlertDialog alert = (AlertDialog) dialog;
alert.getListView().setAdapter(adapter);
}
}
Вот только не понимаю, как это использовать?
Re: Как сделать радиодиалог, если количество кнопок неизвест
Добавлено: 13 янв 2012, 12:45
damager82
Интересный способ! Не знал, что так можно.
Как-то так:
Код: Выделить всё
protected void onPrepareDialog(int id, Dialog dialog) {
if (id == YOUR_DIALOG_ID) {
// Create new adapter
ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(getBaseContext(), android.R.layout.select_dialog_singlechoice, android.R.id.text1, mCatsName);
// Use the new adapter
AlertDialog alert = (AlertDialog) dialog;
alert.getListView().setAdapter(adapter);
}
}
Но не знаю, что лучше - это или removeDialog. И то и другое массив перечитывает. Но это красивее - факт! ))
Re: Как сделать радиодиалог, если количество кнопок неизвест
Добавлено: 13 янв 2012, 13:17
Oleg_SS
Ээээ, извините, но понятнее не стало.
Можно конкретно, что с этим делать? Куда вставить?
Вот пример кода.
Код: Выделить всё
public class AlertCheckActivity extends Activity
{
// идентификатор диалогового окна с переключателями
private final static int IDD_RADIO = 2;
// массив строк из кошачьих имен
final CharSequence[] mCatsName = {"Васька", "Рыжик", "Мурзик", "qqq"};
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// кнопки для вызова диалоговых окон
final Button alertRadio = (Button)findViewById(R.id.buttonAlertRadio);
// обработчик для кнопки вызова диалога с переключателями
alertRadio.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
showDialog(IDD_RADIO);
}
});
} // onCreate
protected Dialog onCreateDialog(int id){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Выберите любимое имя кота")
.setCancelable(false)
// добавляем одну кнопку для закрытия диалога
.setNeutralButton("Назад", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
})
// добавляем переключатели
.setSingleChoiceItems(mCatsName, -1, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
//Toast.makeText(getApplicationContext(), "Любимое имя кота: " + mCatsName[item], Toast.LENGTH_SHORT).show();
}
});
return builder.create();
}
}
Re: Как сделать радиодиалог, если количество кнопок неизвест
Добавлено: 13 янв 2012, 13:29
damager82
Это надо вставить как метод Activity:
Код: Выделить всё
public class AlertCheckActivity extends Activity
{
...
public void onCreate(Bundle savedInstanceState) {
...
}
protected Dialog onCreateDialog(int id){
...
}
protected void onPrepareDialog(int id, Dialog dialog) {
if (id == IDD_RADIO) {
// Create new adapter
ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(getBaseContext(), android.R.layout.select_dialog_singlechoice, android.R.id.text1, mCatsName);
// Use the new adapter
AlertDialog alert = (AlertDialog) dialog;
alert.getListView().setAdapter(adapter);
}
}
}
Re: Как сделать радиодиалог, если количество кнопок неизвест
Добавлено: 13 янв 2012, 14:00
Oleg_SS
Похоже мы немного не поняли друг друга
в моем примере mCatsName надо заменить на динамический массив, который бы обновлялся в onPrepareDialog
вот так:
adapter.add("new items ...");
а вот конкретно как?
Re: Как сделать радиодиалог, если количество кнопок неизвест
Добавлено: 13 янв 2012, 14:17
Oleg_SS
голову сломал, либо ошибки синтаксические, либо вылетает на этапе выполнения
как это делается?
если не трудно, можете привести рабочий пример?
Re: Как сделать радиодиалог, если количество кнопок неизвест
Добавлено: 13 янв 2012, 15:20
damager82
Да, пожалуй, теперь я окончательно запутался и не понимаю, чего нужно

Есть массив. Диалог, при показе, его читает и показывает список по нему. Он еще должен этот же массив менять?
Распишите подробней алгоритм, чтобы было понятно, какое поведение вы ожидаете от программы.
Re: Как сделать радиодиалог, если количество кнопок неизвест
Добавлено: 13 янв 2012, 15:42
RagnarR
onPrepareDialog обозначает, что перед тем, как диалог будет отображен, он будет обработан и подготовлен (будут добавлены необходимые кнопочки, чекбоксы, списки и остальные рюшечки и бантики). Соответственно если нас интересует динамическое изменение диалога до его показа - то пишем все тут. Еще у меня закрались подозрения, что вас интересует изменение диалогового окна уже после его отображения, это так?
Re: Как сделать радиодиалог, если количество кнопок неизвест
Добавлено: 13 янв 2012, 17:24
Oleg_SS
damager82 писал(а):Да, пожалуй, теперь я окончательно запутался и не понимаю, чего нужно
еще раз постановка задачи:
Начну из далека. Надо отправить СМС, по определенному телефону. Телефон можно выбрать из справочника контактов.
Я выбираю некий контакт из справочника. У этого контакта есть несколько номеров телефонов. Теперь надо предложить пользователю выбрать один из телефонов, по которому надо отправить СМС.
Так вот именно диалог выбора телефона мне и надо реализовать через alert.
Согласен, что телефонные номера можно засунуть в спинер, но на мой взгляд радиобутоны будут выглядеть красивее.
Итак: в содержимое радиобутонов и их количество зависит от выбранного контакта.
Надеюсь сейчас понятно описал.
Выше я приводил пример со статическим массивом кнопок. Теперь как мне изменить этот пример, что бы можно было изменять количество и содержимое радиобутонов.
Re: Как сделать радиодиалог, если количество кнопок неизвест
Добавлено: 13 янв 2012, 18:02
Oleg_SS
RagnarR писал(а):Еще у меня закрались подозрения, что вас интересует изменение диалогового окна уже после его отображения, это так?
нет это не так, надо именно подготовить ДО отображения. Но при каждом новом вызове диалога, количество кнопок разное, и надписи на кнопках другие.
Re: Как сделать радиодиалог, если количество кнопок неизвест
Добавлено: 13 янв 2012, 20:26
damager82
Oleg_SS писал(а):
Выше я приводил пример со статическим массивом кнопок. Теперь как мне изменить этот пример, что бы можно было изменять количество и содержимое радиобутонов.
Каждый раз диалог будет перечитывать массив и по нему создавать список. Вы меняете содержимое массива - диалог получается другой.
Т.е. ваш вопрос - "как поменять содержимое массива"?
Re: Как сделать радиодиалог, если количество кнопок неизвест
Добавлено: 14 янв 2012, 05:32
Oleg_SS
damager82 писал(а):Т.е. ваш вопрос - "как поменять содержимое массива"?
да, у меня не получается.
во-первых он не очищается
во-вторых данные не добавляются
Re: Как сделать радиодиалог, если количество кнопок неизвест
Добавлено: 14 янв 2012, 18:36
damager82
Oleg_SS писал(а):damager82 писал(а):Т.е. ваш вопрос - "как поменять содержимое массива"?
да, у меня не получается.
во-первых он не очищается
во-вторых данные не добавляются
Используйте ArrayList. Он как раз является оболочкой, позволяющей удобно работать с массивом. И ArrayAdapter умеет с ним работать.
Re: Как сделать радиодиалог, если количество кнопок неизвест
Добавлено: 26 янв 2012, 11:32
gtkgroup
Вот пример из книги Голощапова
Код: Выделить всё
package com.samples.alertdialogradiobuttons;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class AlertDialogRadioButtonsActivity extends Activity {
private final static int IDD_COLOR = 0;
// Комментарий gtkgroup: Этот массив определяет количество радиокнопок
private final CharSequence[] mColors = {"Red", "Green", "Blue"};
private int mResult;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final Button callButton = (Button)findViewById(R.id.button);
// добавляем слушатель события для кнопки вызова диалога
callButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
showDialog(IDD_COLOR);
}
});
}
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case IDD_COLOR:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Pick a color");
// Комментарий gtkgroup: Здесь формируем радиокнопки из массива mColors
builder.setSingleChoiceItems(mColors, 0, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
//Toast.makeText(getApplicationContext(), "Color: " + mColors[item], Toast.LENGTH_SHORT).show();
mResult = item;
}
});
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Toast.makeText(getApplicationContext(), "Color: " + mColors[mResult], Toast.LENGTH_SHORT).show();
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
Toast.makeText(getApplicationContext(), "Dialog cancel", Toast.LENGTH_SHORT).show();
}
});
builder.setCancelable(false);
return builder.create();
default:
return null;
}
}
}
Буду рад, если пример оказался полезным.
P.S. просто в качестве предложения: может вместо радиокнопок использовать просто список? пользователь нажимает нужную строку (выбрал номер телефона), а твой обработчик отправляет СМС на соответствующий (выбранный) номеру?
Re: Как сделать радиодиалог, если количество кнопок неизвест
Добавлено: 26 янв 2012, 14:40
damager82
gtkgroup писал(а):Вот пример из книги Голощапова
Русская книга по Android? Напишите про нее здесь, плз!
viewtopic.php?f=17&t=155
Мы собираем ссылки на различные материалы.