Создание настраиваемого диалога с помощью списка переключателей

У меня есть метод, в котором у меня есть список значений:

     /**
     * ISO
     * */
    public void getISO(View view) {
        // Open dialog with radio buttons
        List<String> supported_isos = preview.getSupportedISOs();
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
        String current_iso = sharedPreferences.getString(MainActivity.getISOPreferenceKey(), "auto");

    }

Этот метод указан на onClick() для a ImageButton:

android:onClick="getISO"

Но мне нужно показать этот список в диалоговом окне с помощью переключателей. Возможно, значения предпочтений должны быть уже выбраны в диалоговом окне. Возможно ли это?

Ответ 1

Вызовите showRadioButtonDialog() с помощью кнопки.

Это просто пример:

private void showRadioButtonDialog() {

        // custom dialog
        final Dialog dialog = new Dialog(mActivity);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(R.layout.radiobutton_dialog);
        List<String> stringList=new ArrayList<>();  // here is list 
        for(int i=0;i<5;i++) {
            stringList.add("RadioButton " + (i + 1));
        }
        RadioGroup rg = (RadioGroup) dialog.findViewById(R.id.radio_group);

            for(int i=0;i<stringList.size();i++){
                RadioButton rb=new RadioButton(mActivity); // dynamically creating RadioButton and adding to RadioGroup.
                rb.setText(stringList.get(i));
                rg.addView(rb);
            }

        dialog.show();

    }

Вид макета: radiobutton_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RadioGroup

        android:id="@+id/radio_group"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"


        android:layout_gravity="center_vertical"
        android:orientation="vertical">


    </RadioGroup>
</LinearLayout>

введите описание изображения здесь

Примечание. вы можете настроить диалоговое окно (например, заголовок, сообщение и т.д.)

Edit: Чтобы получить значение выбранного RadioButton, вы должны реализовать setOnCheckedChangeListener прослушиватель для RadioGroup как:

 rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId) {
                 int childCount = group.getChildCount();
                 for (int x = 0; x < childCount; x++) {
                    RadioButton btn = (RadioButton) group.getChildAt(x);
                    if (btn.getId() == checkedId) {
                         Log.e("selected RadioButton->",btn.getText().toString());

                    }
                 }
            }
        });

Ответ 2

лучший и простой способ......

void dialog(){

        AlertDialog.Builder alt_bld = new AlertDialog.Builder(this);
        //alt_bld.setIcon(R.drawable.icon);
        alt_bld.setTitle("Select a Group Name");
        alt_bld.setSingleChoiceItems(grpname, -1, new DialogInterface
                .OnClickListener() {
            public void onClick(DialogInterface dialog, int item) {
                Toast.makeText(getApplicationContext(),
                        "Group Name = "+grpname[item], Toast.LENGTH_SHORT).show();
                dialog.dismiss();// dismiss the alertbox after chose option

            }
        });
        AlertDialog alert = alt_bld.create();
        alert.show();


///// grpname is a array where data is stored... 


    }

Ответ 3

Чистый способ выглядит следующим образом:

http://developer.android.com/guide/topics/ui/dialogs.html

Выдержка из (Добавление постоянного списка с несколькими вариантами выбора или одного выбора)

mSelectedItems = new ArrayList();  // Where we track the selected items
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
// Set the dialog title
builder.setTitle(R.string.pick_toppings)
// Specify the list array, the items to be selected by default (null for none),
// and the listener through which to receive callbacks when items are selected
       .setMultiChoiceItems(R.array.toppings, null,
                  new DialogInterface.OnMultiChoiceClickListener() {
           @Override
           public void onClick(DialogInterface dialog, int which,
                   boolean isChecked) {
               if (isChecked) {
                   // If the user checked the item, add it to the selected items
                   mSelectedItems.add(which);
               } else if (mSelectedItems.contains(which)) {
                   // Else, if the item is already in the array, remove it 
                   mSelectedItems.remove(Integer.valueOf(which));
               }
           }
       })
// Set the action buttons
       .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
           @Override
           public void onClick(DialogInterface dialog, int id) {
               // User clicked OK, so save the mSelectedItems results somewhere
               // or return them to the component that opened the dialog
               ...
           }
       })
       .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
           @Override
           public void onClick(DialogInterface dialog, int id) {
               ...
           }
       });

return builder.create();

Читайте о http://developer.android.com/reference/android/app/AlertDialog.Builder.html#setSingleChoiceItems (int, int, android.content.DialogInterface.OnClickListener)

Пользовательский вид не требуется.

Ответ 4

Проверьте это. Это настраиваемая строка dialog_row.xml, которую вы должны использовать в CustomAdapter:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical" android:layout_width="match_parent"
      android:layout_height="match_parent">

    <RadioButton
       android:id="@+id/list"
       android:layout_width="match_parent"
       android:layout_height="wrap_content" />
    </LinearLayout>

Затем в методе onclick:

@Override
public void onClick(View arg0) {

    // custom dialog
    final Dialog dialog = new Dialog(context);
    dialog.setContentView(R.layout.custom_layout); //Your custom layout
    dialog.setTitle("Title...");


    Listview listview= (ListView) dialog.findViewById(R.id.listview);

    CustomAdapter adapter=new CustomAdapter(context,your_list);
    listview.setadapter(adapter);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        //Do something

        }
    });

    dialog.show();
}

Ссылка для учебника

Ответ 5

когда вы хотите показать данные из базы данных SQLIte

private void showRadioButtonDialog() {

    // custom dialog
    final Dialog dialog = new Dialog(this);
    dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialog.setContentView(R.layout.radiobutton_dialog);
    List<String> stringList=new ArrayList<>();  // here is list 

    if (cursor.moveToFirst()) {
        do {
            String a=( cursor.getString(0).toString());
            String b=(cursor.getString(1).toString());
            String c=(cursor.getString(2).toString());
            String d=(cursor.getString(3).toString());
            stringList.add(d);
        } while (cursor.moveToNext());        
    }   

    RadioGroup rg = (RadioGroup) dialog.findViewById(R.id.radio_group);

    for(int i=0;i<stringList.size();i++) {
        RadioButton rb=new RadioButton(this); // dynamically creating RadioButton and adding to RadioGroup.
        rb.setText(stringList.get(i));
        rg.addView(rb);
    }

    dialog.show();

    rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {

         @Override
         public void onCheckedChanged(RadioGroup group, int checkedId) {
             int childCount = group.getChildCount();
             for (int x = 0; x < childCount; x++) {
                 RadioButton btn = (RadioButton) group.getChildAt(x);
                 if (btn.getId() == checkedId) {
                     Toast.makeText(getApplicationContext(), btn.getText().toString(), Toast.LENGTH_SHORT).show();
                 }
             }
         }
     });
}