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