Как мне создать Android Spinner как всплывающее окно? - PullRequest
53 голосов
/ 09 июня 2011

Я хочу вызвать диалоговое окно, когда пользователь нажимает на элемент меню, чтобы позволить пользователю выбрать элемент.

Нужно ли для этого отдельное диалоговое окно или я могу использовать Spinner напрямую?Я вижу эту ссылку, упоминает опцию MODE_DIALOG, но она, похоже, больше не определяется.AlertDialog может быть в порядке, но все опции говорят: «щелчок по элементу в списке не приведет к закрытию диалога», что я и хочу.Любое предложение?

В идеале, код будет аналогичен случаю, когда счетчик отображается на экране:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(activity,
     android.R.layout.simple_spinner_item, items);              
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
myspinner.setAdapter(adapter);  
// myspinner.showAsDialog() <-- what i want             

Ответы [ 11 ]

107 голосов
/ 09 июня 2011

Вы можете использовать диалоговое окно с предупреждением

    AlertDialog.Builder b = new Builder(this);
    b.setTitle("Example");
    String[] types = {"By Zip", "By Category"};
    b.setItems(types, new OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {

            dialog.dismiss();
            switch(which){
            case 0:
                onZipRequested();
                break;
            case 1:
                onCategoryRequested();
                break;
            }
        }

    });

    b.show();

Это закроет диалоговое окно, когда один из них нажимается так, как вы хотите.Надеюсь, это поможет!

78 голосов
/ 29 июля 2015

В xml есть опция

android:spinnerMode="dialog"

используйте это для Режим диалога

17 голосов
/ 15 июля 2014

Попробуйте это:

Spinner popupSpinner = new Spinner(context, Spinner.MODE_DIALOG);

См. ссылку для более подробной информации.

10 голосов
/ 09 июня 2011

MODE_DIALOG и MODE_DROPDOWN определены в API 11 (Сота).MODE_DIALOG описывает обычное поведение в предыдущих версиях платформы.

9 голосов
/ 27 августа 2015

Добавление небольшого атрибута как android:spinnerMode="dialog" отобразит содержимое счетчика во всплывающем окне.

6 голосов
/ 09 июня 2011

Вы можете создать свой собственный диалог. Это довольно просто. Если вы хотите отклонить его с помощью выделения в счетчике, добавьте OnItemClickListener и добавьте

int n = mSpinner.getSelectedItemPosition();
mReadyListener.ready(n);
SpinnerDialog.this.dismiss();

как в OnClickListener для кнопки ОК. Однако есть одно предостережение: слушатель onclick не срабатывает, если вы повторно выберете опцию по умолчанию. Вам также нужна кнопка ОК.

Начните с макета:

Рез / макет / spinner_dialog.xml :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content" 
  android:layout_height="wrap_content">
<TextView 
    android:id="@+id/dialog_label" 
    android:layout_height="wrap_content" 
    android:layout_width="fill_parent"
    android:hint="Please select an option" 
    />
<Spinner
    android:id="@+id/dialog_spinner" 
    android:layout_height="wrap_content" 
    android:layout_width="fill_parent"
    />
<Button
    android:id="@+id/dialogOK" 
    android:layout_width="120dp"
    android:layout_height="wrap_content" 
    android:text="OK"
    android:layout_below="@id/dialog_spinner"
    />
<Button
    android:id="@+id/dialogCancel" 
    android:layout_width="120dp"
    android:layout_height="wrap_content" 
    android:text="Cancel"
    android:layout_below="@id/dialog_spinner"
    android:layout_toRightOf="@id/dialogOK"
    />
</RelativeLayout>

Затем создайте класс:

SRC / ваш / пакет / SpinnerDialog.java

public class SpinnerDialog extends Dialog {
    private ArrayList<String> mList;
    private Context mContext;
    private Spinner mSpinner;

   public interface DialogListener {
        public void ready(int n);
        public void cancelled();
    }

    private DialogListener mReadyListener;

    public SpinnerDialog(Context context, ArrayList<String> list, DialogListener readyListener) {
        super(context);
        mReadyListener = readyListener;
        mContext = context;
        mList = new ArrayList<String>();
        mList = list;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.spinner_dialog);
        mSpinner = (Spinner) findViewById (R.id.dialog_spinner);
        ArrayAdapter<String> adapter = new ArrayAdapter<String> (mContext, android.R.layout.simple_spinner_dropdown_item, mList);
        mSpinner.setAdapter(adapter);

        Button buttonOK = (Button) findViewById(R.id.dialogOK);
        Button buttonCancel = (Button) findViewById(R.id.dialogCancel);
        buttonOK.setOnClickListener(new android.view.View.OnClickListener(){
            public void onClick(View v) {
                int n = mSpinner.getSelectedItemPosition();
                mReadyListener.ready(n);
                SpinnerDialog.this.dismiss();
            }
        });
        buttonCancel.setOnClickListener(new android.view.View.OnClickListener(){
            public void onClick(View v) {
                mReadyListener.cancelled();
                SpinnerDialog.this.dismiss();
            }
        });
    }
}

Наконец, используйте его как:

mSpinnerDialog = new SpinnerDialog(this, mTimers, new SpinnerDialog.DialogListener() {
  public void cancelled() {
    // do your code here
  }
  public void ready(int n) {
    // do your code here
  }
});
2 голосов
/ 28 мая 2014

Вот подкласс Spinner, который переопределяет executeClick (), чтобы показать диалог вместо выпадающего списка. XML не требуется. Попробуйте, дайте мне знать, если это работает для вас.

public class DialogSpinner extends Spinner {
    public DialogSpinner(Context context) {
        super(context);
    }

    @Override 
    public boolean performClick() {
        new AlertDialog.Builder(getContext()).setAdapter((ListAdapter) getAdapter(), 
            new DialogInterface.OnClickListener() {
                @Override public void onClick(DialogInterface dialog, int which) {
                    setSelection(which);
                    dialog.dismiss();
                }
            }).create().show();
        return true;
    }
}

Для получения дополнительной информации читайте эту статью: Как сделать всплывающее окно параметров Spinner Android в диалоговом окне

1 голос
/ 12 апреля 2018

Вы можете использовать спиннер и установить spinnerMode в диалоговое окно и установить для layout_width и layout_height значение 0, чтобы основной вид не отображал только диалоговое окно (раскрывающийся вид). Вызвать executeНажмите кнопку прослушивания кнопки.

    mButtonAdd.setOnClickListener(view -> {
        spinnerAddToList.performClick();
    });

Компоновка:

    <Spinner
        android:id="@+id/spinnerAddToList"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginTop="10dp"
        android:prompt="@string/select_from_list"
        android:theme="@style/ThemeOverlay.AppCompat.Light"
        android:spinnerMode="dialog"/>

Преимущество этого в том, что вы можете настроить свой счетчик так, как вам нравится.

Смотрите мой ответ здесь, чтобы настроить счетчик: Переопределение стиля выпадающего списка для Spinner в режиме диалога

1 голос
/ 29 сентября 2016
android:spinnerMode="dialog"

// Creating adapter for spinner

ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, categories);

// Drop down layout style - list view with radio button
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

// attaching data adapter to spinner
spinner.setAdapter(dataAdapter);
0 голосов
/ 11 июня 2019

Если вы хотите показать его как полноэкранное всплывающее окно, то вам даже не нужен XML-макет. Вот как это сделать в Котлине.

 val inputArray: Array<String> = arrayOf("Item 1","Item 2")
                val alt_bld =  AlertDialog.Builder(context);
                alt_bld.setTitle("Items:")
                alt_bld.setSingleChoiceItems(inputArray, -1) { dialog, which ->
                    if(which == 0){
                        //Item 1 Selected
                    }
                    else if(which == 1){
                        //Item 2 Selected
                    }
                    dialog.dismiss();

                }

                val alert11 = alt_bld.create()
                alert11.show()
...