not item first android dialog spinner

item - ¿Cómo creo un Android Spinner como una ventana emergente?



spinner android (10)

Agregar un pequeño atributo como android:spinnerMode="dialog" mostraría los contenidos del spinner en un pop-up.

Quiero mostrar un diálogo giratorio cuando el usuario toca un elemento del menú para permitir que el usuario seleccione un elemento.

¿Necesito un diálogo separado para esto o puedo usar Spinner directamente? Veo este enlace, menciona una opción MODE_DIALOG, pero parece que ya no está definida. AlertDialog puede estar bien, pero todas las opciones dicen que "hacer clic en un elemento de la lista no descarta el diálogo", que es lo que quiero. ¿Cualquier sugerencia?

Idealmente, el código sería similar al caso en que se muestra el rotador en la pantalla:

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


Aquí hay una subclase Spinner que anula performClick () para mostrar un cuadro de diálogo en lugar de un menú desplegable. No se requiere XML. Pruébalo, avísame si te funciona.

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

Para obtener más información, lea este artículo: Cómo hacer que las opciones de Spinner de Android aparezcan en un cuadro de diálogo


En xml hay una opción

android:spinnerMode="dialog"

usar esto para el modo de diálogo


Esto es del código fuente de Android SDK. Como puede ver, tiene un constructor especial para crear un Spinner con el modo especificado que desea usar.

Espero que te ayude :)

/** * Construct a new spinner with the given context''s theme, the supplied attribute set, * and default style. <code>mode</code> may be one of {@link #MODE_DIALOG} or * {@link #MODE_DROPDOWN} and determines how the user will select choices from the spinner. * * @param context The Context the view is running in, through which it can * access the current theme, resources, etc. * @param attrs The attributes of the XML tag that is inflating the view. * @param defStyle The default style to apply to this view. If 0, no style * will be applied (beyond what is included in the theme). This may * either be an attribute resource, whose value will be retrieved * from the current theme, or an explicit style resource. * @param mode Constant describing how the user will select choices from the spinner. * * @see #MODE_DIALOG * @see #MODE_DROPDOWN */ public Spinner(Context context, AttributeSet attrs, int defStyle, int mode) { super(context, attrs, defStyle);


MODE_DIALOG y MODE_DROPDOWN se definen en API 11 (Honeycomb). MODE_DIALOG describe el comportamiento habitual en las versiones de plataforma anteriores.


Puede crear su propio cuadro de diálogo personalizado. Es bastante fácil. Si desea descartarlo con una selección en la rueda giratoria, agregue un OnItemClickListener y agregue

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

como en OnClickListener para el botón Aceptar. Sin embargo, hay una advertencia, y es que el oyente onclick no se activa si vuelve a seleccionar la opción predeterminada. Necesitas el botón OK también.

Comience con el diseño:

res / layout / 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>

Entonces, crea la clase:

src / your / package / 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(); } }); } }

Finalmente, úsalo como:

mSpinnerDialog = new SpinnerDialog(this, mTimers, new SpinnerDialog.DialogListener() { public void cancelled() { // do your code here } public void ready(int n) { // do your code here } });


Puede usar un diálogo de alerta

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

Esto cerrará el diálogo cuando uno de ellos sea presionado como lo desea. ¡Espero que esto ayude!


Puede usar un spinner y configurar el spinnerMode en el cuadro de diálogo y establecer el layout_width y el layout_height en 0, para que la vista principal no se muestre, solo el cuadro de diálogo (vista desplegable). Llamar a performClick en el botón click listener.

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

Diseño:

<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"/>

La ventaja de esto es que puedes personalizar tu ruleta de la forma que quieras.

Ver mi respuesta aquí para personalizar el control de giro: Anulando el estilo de lista desplegable para el modo Diálogo


Prueba esto:

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

Vea este link para más detalles.


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