Android spinner cerrar
Tengo una actividad con un hilandero, y me preguntaba si es posible cerrar el hilador programáticamente, si el usuario lo ha abierto.
La historia entera es que en el fondo estoy corriendo un proceso en un hilo separado. Cuando el proceso ha terminado, invoco a un manejador en la actividad principal y, dependiendo del resultado, realizo algunas tareas. Es entonces que quiero cerrar el spinner, que el usuario lo ha abierto.
- Medición de la altura del texto a dibujar en lienzo (Android)
- FilePicker desde android webview trabajando sólo una vez
- Cambios en una página web a través de JavaScript que no aparecen en WebView. ¿Hay una manera de forzar el WebView para volver a dibujar su contenido?
- ¿Qué pasa con setScaleX / setScaleY?
- OnTouchListener en vista invisible
La ruleta está en el diseño main.xml:
<Spinner android:id="@+id/birthPlaceSpinner" android:layout_weight="1" android:layout_height="wrap_content" android:prompt="@string/select" android:layout_width="fill_parent" />
Y este es el Manejador:
private class BirthplaceChangedHandler extends Handler { @Override public void handleMessage(Message msg) { String placeFilterStr = birthPlaceFilterText.getText().toString(); if ("".equals(placeFilterStr) || placeFilterStr == null || validNewAddresses.isEmpty()) { birthPlaceSpinner.setEnabled(false); hideGeoLocationInformation(); } else { birthPlaceSpinner.setEnabled(true); } adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.multiline_spinner_dropdown_item, validNewAddressesStr) birthPlaceSpinner.setAdapter(adapter); } }
¡Aclamaciones!
- ¿Cómo puedo determinar si una aplicación de Android se ha creado con una vista web?
- Cómo establecer el atributo de primer plano en otra vista no FrameLayout
- ¿Mostrar la vista por encima de la barra de estado?
- Android ClassCastException al recuperar Vista personalizada
- Elevación + error de transparencia en Android Lollipop
- Diferente ancho de diseño dentro de RecyclerView y LinearLayout normal
- Actualizar la posición de la vista debajo de otra vista en Android
- Android: ¿puedo crear una vista / lienzo que no sea rectangular, pero por ejemplo, redondo?
No veo una manera de lograr eso – no hay ningún método en Spinner
para cerrarlo. La parte "abierta" de un Spinner
es un AlertDialog
en Android AlertDialog
2.x, y no estoy completamente seguro de cómo se implementa en Honeycomb cuando se usa el tema holográfico.
La única solución sería clonar la fuente de Spinner
y añadir algún código para descartar el diálogo. Pero, de nuevo, no funcionaría en Honeycomb o superior hasta que pueda ver y clonar ese código también.
Más allá de eso, creo que lo que quieres es UX pobre. Si el usuario abrió el Spinner
, lo más probable es que examinen activamente el contenido del Spinner
y realicen una selección. Tirando eso de debajo de su dedo los confundirá, en el mejor de los casos. Por favor considere un enfoque alternativo.
Además, no utilice getApplicationContext()
menos que sepa por qué está utilizando getApplicationContext()
. Usted no necesita ni siquiera quiere getApplicationContext()
al crear un ArrayAdapter
.
Esto funciona para mí:
class SomeAdapter extends BaseAdapter implements SpinnerAdapter { //...... public View getDropDownView(int position, View convertView, ViewGroup parent) { View view = convertView; if (view == null) { //...... } view.setOnClickListener(new ItemOnClickListener(parent)); return view; } //..... }
Y el oyente de clics:
class ItemOnClickListener implements View.OnClickListener { private View _parent; public ItemOnClickListener(ViewGroup parent) { _parent = parent; } @Override public void onClick(View view) { //....... // close the dropdown View root = _parent.getRootView(); root.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK)); root.dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_BACK)); } }
Bueno, es un poco complicado de lo que pensaba.
Estoy agregando los detalles paso a paso aquí. Trate de seguirlo. Yo era capaz de lograr esto en api nivel 10.
Y esta solución supone que se supone que se debe cerrar el diálogo de solicitud de programación cuando el usuario hace clic en el botón Inicio o Si tuvo que pasar a la siguiente actividad sin interacción del usuario
El primer paso es crear un Spinner personalizado extendiendo la Clase Spinner. Digamos que he creado una clase llamada CustomSpinner en el paquete com.bts.sampleapp
Mi clase de CustomSpinner se parece a esto,
package com.bts.sampleapp; import android.content.Context; import android.util.AttributeSet; import android.widget.Spinner; public class CustomSpinner extends Spinner{ Context context=null; public CustomSpinner(Context context) { super(context); this.context=context; } public CustomSpinner(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public CustomSpinner(Context context, AttributeSet attrs) { super(context, attrs); } @Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); } }
Ahora en su archivo Xml, reemplace el elemento Spinner por este hilandero personalizado,
<com.bts.sampleapp.CustomSpinner android:id="@+id/spin" android:layout_width="wrap_content" android:layout_height="wrap_content" />
El siguiente paso es inicializar y establecer el adaptador a este hilandero en su clase de actividad,
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); CustomSpinner spin=null; spin=(CustomSpinner)findViewById(R.id.spin); spin.setAdapter(spinnerAdapter); //you can set your adapter here. }
El paso final es cerrar el diálogo cuando el usuario hace clic en HomeButton o cuando la actividad se mueve al fondo. Para hacer esto, anulamos la onPause () como esto,
@Override protected void onPause() { Log.i("Life Cycle", "onPause"); spin.onDetachedFromWindow(); super.onPause(); }
Ahora dentro de la onPause () llama al método spin.onDetachedFromWindow();
Que hace el trabajo de cerrar el diálogo del aviso para usted.
Ahora que se dice, llamando a spin.onDetachedFromWindow();
Desde cualquier parte de su actividad, le ayudará a cerrar el programa giratorio mediante programación. Así que si esto es lo que quieres, entonces eliminar la onpause()
.
Creo que deberías eliminar tu uso de Spinner
y usar un ImageView
con una animación de cuadro (es decir, <animation-list>
) para crear tu propio spinner. Sólo tiene que configurar el fondo de ImageView
para que pueda dibujarse su Animación de marco.
Entonces usted puede hacer fácilmente algo como esto para comenzar y para él.
¿Qué pasa con la clonación de una tecla de regreso?
Ok lo intenté
[current activity].dispatchKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_BACK));
Y no hacer nada que pude ver – luego presionado física volver clave y el desplegable se fue. También intentó hacer un ACTION_UP derecho después de la abajo – ningún efecto tampoco.
Usted quisiera cerrar sus hilanderos de dondequiera. La inyección de la llave para la parte posterior presionada es la buena solución pero, aquí usted está cerrando todas las vistas inmediatamente.
¿Qué tal setPressed (false)?
Link: Cerrar el menú desplegable de Spinners cuando se hacen clic simultáneamente en dos de los grupos de una vista de grupos
Utilice clearFocus()
para cerrar la ruleta de forma programática
spinner.clearFocus();