Как сделать радиодиалог, если количество кнопок неизвестно?

Интерфейс, диалоги, темы, стили, меню
Ответить
Oleg_SS
Сообщения: 34
Зарегистрирован: 11 янв 2012, 10:59

Как сделать радиодиалог, если количество кнопок неизвестно?

Сообщение Oleg_SS » 13 янв 2012, 10:53

Есть вот такой пример:

Код: Выделить всё

        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. А если заранее неизвестно, сколько кнопок будет? Как это сделать?

Аватара пользователя
RagnarR
Сообщения: 29
Зарегистрирован: 11 янв 2012, 11:02
Откуда: Belarus

Re: Как сделать радиодиалог, если количество кнопок неизвест

Сообщение RagnarR » 13 янв 2012, 11:30

Тогда придется напрямую создавать новое View при помощи Inflator'а и запихивать туда необходимое количество радиобатонов.
--[+++++++<---->>-->+>+>+<<<<]
<.>++++[-<++++<++>>>->--<<]>>-.>--..>+.<<<.<<-.>>+>->>.+++[.<]<<++.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Как сделать радиодиалог, если количество кнопок неизвест

Сообщение damager82 » 13 янв 2012, 12:13

А я чет не понял вопрос.
Зачем вам знать сколько будет кнопок? Сколько в массиве записей, столько в диалоге и будет кнопок. Он это точно заранее не знает.

Или речь идет о том, что диалог формируется при первом вызове и следующие разы показывает одно и тоже, а хотелось бы менять содержимое?
Тогда можно его удалять по закрытию командой Activity.removeDialog (http://developer.android.com/reference/ ... ialog(int)). И он каждый раз при показе будет заново создаваться и перечитывать массив.

Может кто-нить знает другой способ? У меня только так получилось в свое время.

P.S. Либо можно использовать Spinner.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Oleg_SS
Сообщения: 34
Зарегистрирован: 11 янв 2012, 10:59

Re: Как сделать радиодиалог, если количество кнопок неизвест

Сообщение Oleg_SS » 13 янв 2012, 12:33

На просторах интернета нагуглил:

Код: Выделить всё

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);
    }
}
Вот только не понимаю, как это использовать?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Как сделать радиодиалог, если количество кнопок неизвест

Сообщение damager82 » 13 янв 2012, 12:45

Интересный способ! Не знал, что так можно.

Как-то так:

Код: Выделить всё

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. И то и другое массив перечитывает. Но это красивее - факт! ))
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Oleg_SS
Сообщения: 34
Зарегистрирован: 11 янв 2012, 10:59

Re: Как сделать радиодиалог, если количество кнопок неизвест

Сообщение Oleg_SS » 13 янв 2012, 13:17

Ээээ, извините, но понятнее не стало.
Можно конкретно, что с этим делать? Куда вставить?
Вот пример кода.

Код: Выделить всё

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();
    }
}

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Как сделать радиодиалог, если количество кнопок неизвест

Сообщение damager82 » 13 янв 2012, 13:29

Это надо вставить как метод 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);
      }
   }

}
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Oleg_SS
Сообщения: 34
Зарегистрирован: 11 янв 2012, 10:59

Re: Как сделать радиодиалог, если количество кнопок неизвест

Сообщение Oleg_SS » 13 янв 2012, 14:00

Похоже мы немного не поняли друг друга
в моем примере mCatsName надо заменить на динамический массив, который бы обновлялся в onPrepareDialog
вот так:
adapter.add("new items ...");
а вот конкретно как?

Oleg_SS
Сообщения: 34
Зарегистрирован: 11 янв 2012, 10:59

Re: Как сделать радиодиалог, если количество кнопок неизвест

Сообщение Oleg_SS » 13 янв 2012, 14:17

голову сломал, либо ошибки синтаксические, либо вылетает на этапе выполнения
как это делается?
если не трудно, можете привести рабочий пример?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Как сделать радиодиалог, если количество кнопок неизвест

Сообщение damager82 » 13 янв 2012, 15:20

Да, пожалуй, теперь я окончательно запутался и не понимаю, чего нужно :)
Есть массив. Диалог, при показе, его читает и показывает список по нему. Он еще должен этот же массив менять?

Распишите подробней алгоритм, чтобы было понятно, какое поведение вы ожидаете от программы.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
RagnarR
Сообщения: 29
Зарегистрирован: 11 янв 2012, 11:02
Откуда: Belarus

Re: Как сделать радиодиалог, если количество кнопок неизвест

Сообщение RagnarR » 13 янв 2012, 15:42

onPrepareDialog обозначает, что перед тем, как диалог будет отображен, он будет обработан и подготовлен (будут добавлены необходимые кнопочки, чекбоксы, списки и остальные рюшечки и бантики). Соответственно если нас интересует динамическое изменение диалога до его показа - то пишем все тут. Еще у меня закрались подозрения, что вас интересует изменение диалогового окна уже после его отображения, это так?
--[+++++++<---->>-->+>+>+<<<<]
<.>++++[-<++++<++>>>->--<<]>>-.>--..>+.<<<.<<-.>>+>->>.+++[.<]<<++.

Oleg_SS
Сообщения: 34
Зарегистрирован: 11 янв 2012, 10:59

Re: Как сделать радиодиалог, если количество кнопок неизвест

Сообщение Oleg_SS » 13 янв 2012, 17:24

damager82 писал(а):Да, пожалуй, теперь я окончательно запутался и не понимаю, чего нужно :)
еще раз постановка задачи:
Начну из далека. Надо отправить СМС, по определенному телефону. Телефон можно выбрать из справочника контактов.
Я выбираю некий контакт из справочника. У этого контакта есть несколько номеров телефонов. Теперь надо предложить пользователю выбрать один из телефонов, по которому надо отправить СМС.
Так вот именно диалог выбора телефона мне и надо реализовать через alert.
Согласен, что телефонные номера можно засунуть в спинер, но на мой взгляд радиобутоны будут выглядеть красивее.
Итак: в содержимое радиобутонов и их количество зависит от выбранного контакта.
Надеюсь сейчас понятно описал.
Выше я приводил пример со статическим массивом кнопок. Теперь как мне изменить этот пример, что бы можно было изменять количество и содержимое радиобутонов.

Oleg_SS
Сообщения: 34
Зарегистрирован: 11 янв 2012, 10:59

Re: Как сделать радиодиалог, если количество кнопок неизвест

Сообщение Oleg_SS » 13 янв 2012, 18:02

RagnarR писал(а):Еще у меня закрались подозрения, что вас интересует изменение диалогового окна уже после его отображения, это так?
нет это не так, надо именно подготовить ДО отображения. Но при каждом новом вызове диалога, количество кнопок разное, и надписи на кнопках другие.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Как сделать радиодиалог, если количество кнопок неизвест

Сообщение damager82 » 13 янв 2012, 20:26

Oleg_SS писал(а): Выше я приводил пример со статическим массивом кнопок. Теперь как мне изменить этот пример, что бы можно было изменять количество и содержимое радиобутонов.
Каждый раз диалог будет перечитывать массив и по нему создавать список. Вы меняете содержимое массива - диалог получается другой.
Т.е. ваш вопрос - "как поменять содержимое массива"?
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Oleg_SS
Сообщения: 34
Зарегистрирован: 11 янв 2012, 10:59

Re: Как сделать радиодиалог, если количество кнопок неизвест

Сообщение Oleg_SS » 14 янв 2012, 05:32

damager82 писал(а):Т.е. ваш вопрос - "как поменять содержимое массива"?
да, у меня не получается.
во-первых он не очищается
во-вторых данные не добавляются

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Как сделать радиодиалог, если количество кнопок неизвест

Сообщение damager82 » 14 янв 2012, 18:36

Oleg_SS писал(а):
damager82 писал(а):Т.е. ваш вопрос - "как поменять содержимое массива"?
да, у меня не получается.
во-первых он не очищается
во-вторых данные не добавляются
Используйте ArrayList. Он как раз является оболочкой, позволяющей удобно работать с массивом. И ArrayAdapter умеет с ним работать.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

gtkgroup
Сообщения: 5
Зарегистрирован: 26 янв 2012, 11:18

Re: Как сделать радиодиалог, если количество кнопок неизвест

Сообщение gtkgroup » 26 янв 2012, 11:32

Вот пример из книги Голощапова

Код: Выделить всё

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. просто в качестве предложения: может вместо радиокнопок использовать просто список? пользователь нажимает нужную строку (выбрал номер телефона), а твой обработчик отправляет СМС на соответствующий (выбранный) номеру?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Как сделать радиодиалог, если количество кнопок неизвест

Сообщение damager82 » 26 янв 2012, 14:40

gtkgroup писал(а):Вот пример из книги Голощапова
Русская книга по Android? Напишите про нее здесь, плз! viewtopic.php?f=17&t=155
Мы собираем ссылки на различные материалы.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Ответить