Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Cómo borrar el enfoque de todos los elementos seleccionables en una vista?

Mi problema es simple. Cómo borrar el enfoque de todos los elementos en una vista que puede tener foco ( como EditText -o- TextView cuyo textIsSelectable="true" y el texto se selecciona en él en la ocurrencia del evento clearFocus ).

¿Por qué estoy preguntando (en caso de que no reciba una respuesta genérica):

Tengo pocos fragmentos que estoy accediendo a través de la vista de navegación . Mi objetivo principal es perder el foco de los elementos en el fragmento en el cajón abierto en la vista de navegación. Sé que es posible obtener el método onDrawerSlide para el NavigationDrawer y de hecho lo ha establecido en mi MainActivity para que en el cajón abierto, si mi EditText en uno de los fragmentos está abierto, llamo código hideSoftKeyboard para que cierre el SoftKeyboard.

Mi código para obtener el evento en la apertura del cajón : (en el método onCreate () de MainActivity)

 DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) { //Hide SoftKeyboard on Navigation Drawer Open @Override public void onDrawerSlide(View drawerView, float slideOffset) { //Hide SoftKeyboard if it is open hideSoftKeyboard(); //And Make any view having focus loose focus //... //ClearFocus for the whole view is done from here (for whichever Fragment is visible right now) super.onDrawerSlide(drawerView, slideOffset); } }; public void hideSoftKeyboard() //Declared outside onCreate { InputMethodManager inputMethodManager = (InputMethodManager)getSystemService(Activity.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0); } 

Aquí, mi código hideSoftKeyboard () es genérico y puede cerrar SoftKeyboard no importa qué fragmento es visible en el momento de MainActivity sí mismo . Del mismo modo quiero clearFocus de todos mis EditTexts y TextView (ya que la opción Copiar / Pegar aparece en la mitad del cajón cuando está abierto).

Sé que puedo escribir el código para cada Fragmento que llama la función OnDrawerSlide y despejar el foco para cada elemento individualmente, pero quiero saber si es posible para una solución genérica y si es así, cómo hacerlo.

(Si es posible, puede haber muchas implicaciones de esto y puede ayudar en muchos casos)

  • Android: se centra en EditText después de la selección de Spinner
  • Amplíe y dé enfoque a SearchView automáticamente
  • Editado Android enfoque automático
  • Cómo hacer que EditText no se enfoque al crear la actividad
  • Toque fuera de edittext para perder el foco
  • Problema de enfoque de Android WebView
  • Problema de enfoque con múltiples EditTexts
  • Cómo configurar un Android SeekBar para ser inmóvil / congelado?
  • 3 Solutions collect form web for “Cómo borrar el enfoque de todos los elementos seleccionables en una vista?”

    Bueno, finalmente decidí que no podía esperar más para una respuesta general y así decidí implementar el onDrawerSlide para cada fragmento . Resulta, incluso que es un poco complicado ya que necesita para acceder a su barra de herramientas y configurar su cajón con cajón actual y un poco de experimentación fue vomitando NPE! (Sólo mi suerte habitual)

    Así que estaba pasando por el sitio oficial de los desarrolladores de Android para cualquier idea cuando este flash para mí. ¿Por qué no utilizar getCurrentFocus para obtener mi vista actual y luego clearFocus() ! Y voilla, funciona. Me estaba centrando en la compleja situación tanto que me olvidé de comprobar en las partes fáciles.

    Así que aquí está la respuesta a mi propia pregunta: (en onCreate for MainActivity)

     DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) { //Hide SoftKeyboard on Navigation Drawer Open @Override public void onDrawerSlide(View drawerView, float slideOffset) { //Hide SoftKeyboard if it is open hideSoftKeyboard(); getCurrentFocus().clearFocus(); //Make any view having focus - clear focus super.onDrawerSlide(drawerView, slideOffset); } 

    Gracias a @keivan Esbati por señalar una falla que no me di cuenta debido a mi uso de la vista dummy (usada en el layout xml para que tan pronto como se cargue Layout, el primer EditText no obtenga el foco). Según el foro de desarrolladores de Android:

    ClearFocus (): Cuando una vista borra el enfoque, el marco está intentando darle enfoque a la primera vista que se puede enfocar desde la parte superior. Por lo tanto, si esta vista es la primera de la parte superior que puede tomar el foco, a continuación, todas las devoluciones de llamada relacionadas con la limpieza de enfoque se invocará después de que el marco se centrará en esta vista.

    Una ronda alrededor de esto es por supuesto para configurar una variable ficticia que llama a enfocar tan pronto como se cargue Layout (método que usé) o esto compartido por @keivan.

    Nota: Yo había puesto una recompensa por ello, ya que nadie fue capaz de responder y yo mismo tuve la respuesta, me pregunto qué pasará con el Bounty: D

    Actualización: Bounty expiró y um, no pasó nada. Supongo que tiene sentido si vas por la teoría de la publicidad. Pero aún.

    Para borrar el foco de una vista puedes llamar a getCurrentFocus().clearFocus() Pero recuerda que esto Simplemente moverá el foco de la vista actual al primer elemento de tu vista, no Eliminando completamente el enfoque de las vistas; Así que si el primer elemento en su diseño es un EditText va a ganar foco de nuevo.

    Una forma de asegurarse de que su vista no vuelva a enfocarse es agregar estos atributos a su vista raíz en su xml, permitiendo que la vista raíz capture el foco:

     android:focusableInTouchMode="true" android:descendantFocusability="beforeDescendants" 

    Así que si usted declara su elemento raíz como a continuación va a atrapar automáticamente el foco antes de llegar a las vistas de niño:

     <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:focusableInTouchMode="true" android:descendantFocusability="beforeDescendants"> <!-- Rest of Layout --> <.../> </LinearLayout> 

    Si tiene actividad múltiple y en esas actividades sólo una actividad tiene Vista de navegación. En ese caso, si desea eliminar el foco en navView utilizar este código,

     @Override protected void onResume() { super.onResume(); int size = navigationView.getMenu().size(); for (int i = 0; i < size; i++) { navigationView.getMenu().getItem(i).setChecked(false); } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.