2010-10-08 28 views
47

Duplicar posible:
Stop EditText from gaining focus at Activity startup?Cómo quitar el foco de un solo EDITTEXT

En mi aplicación tengo una sola EditarTexto junto con algunos TextViews, botón y un control de giro. My EditText recibe foco ya que es la única vista enfocable en esta actividad, creo. My EditText se muestra con un borde naranja y un cursor en el campo.
Ahora me gustaría eliminar el enfoque de este campo (no quiero que se muestren el cursor y el borde). ¿Hay alguna forma de hacer esto?
He podido enfocar el botón haciendo clic en button.seFocusableInTouchMode() y button.requestFocus(). Pero esto resalta el botón y obviamente no es lo que quiero.

+8

No es realmente un duplicado. Esa pregunta es para evitar que EditText se concentre en el inicio de la actividad. Este es sobre quitar el foco. Estos son problemas diferentes. –

Respuesta

23

compruebe esta pregunta y la respuesta seleccionada: Stop EditText from gaining focus at Activity startup Es feo pero funciona, y hasta donde yo sé que no hay mejor solución.

+4

Gracias, no había visto eso. Mi EditarTexto estaba envuelto en una TableLayout, por lo que haciendo esto: resuelto el problema para mí. – tobbenb3

+0

genial, realmente es un problema feo, y la solución no es intuitiva en absoluto. – Maragues

+1

Me gusta mucho más en la apurada API de Android, y escribo esto en 2013. – sebrock

41

¿trató de usar edad buena View.clearFocus()

+2

No funciona para mí. Llamar a onCreate pero EditText se mantiene con el borde y el cursor parpadeante. – Ixx

+0

mismo no funciona para mí –

+1

Utilicé ese método y agregué un OnFocusChangeListener, y el enfoque se borró y luego se configuró (automáticamente) de nuevo. –

2

Utilice el código adjunto para dar el foco al "otro", esto está bien si se tiene una vista en la que sólo desea ocultar el teclado y liberar el foco , realmente no te importa quién lo consigue.

uso como esto: FocusHelper.releaseFocus (viewToReleaseFocusFrom)

public class FocusHelper { 
    public static void releaseFocus(View view) { 
     ViewParent parent = view.getParent(); 
     ViewGroup group = null; 
     View child = null; 
     while (parent != null) { 
      if (parent instanceof ViewGroup) { 
       group = (ViewGroup) parent; 
       for (int i = 0; i < group.getChildCount(); i++) { 
        child = group.getChildAt(i); 
        if(child != view && child.isFocusable()) 
         child.requestFocus(); 
       } 
      } 
      parent = parent.getParent(); 
     } 
    } 
} 

Doc: El método atraviesa desde el punto de vista del niño y el árbol de vista y busca el primer hijo para dirigir el foco a.

Editar: También puede utilizar la API para esto:

View focusableView = v.focusSearch(View.FOCUS_DOWN); 
if(focusableView != null) focusableView.requestFocus(); 
25

nuevo a Android .. trataron

getWindow().getDecorView().clearFocus(); 

funciona para mí .. amablemente me corrija si hay algo mal :)

sólo para añadir .. que el diseño debe tener:

android:focusable="true" 
android:focusableInTouchMode="true" 
+0

¡Funcionó para mí! – GFPF

3

Sé que es demasiado tarde, pero para alguien con la misma necesidad editText.setFocusable (falso) si lo que estás buscando.

0

basta con incluir esta línea

android:selectAllOnFocus="false" 

en el segmento de XML correspondiente a la disposición EditarTexto.

2

tuve un problema similar con editText, que ganó foco desde que se inició la actividad. este problema i fijo fácil como esto:

que añadir esta pieza de código en la disposición que contiene el EDITTEXT en xml:

android:id="@+id/linearlayout" 
    android:focusableInTouchMode="true" 

no se olvide la android:id, sin que yo tengo un error.

el otro problema que tuve con editText es que una vez que gana el primer foco, el foco nunca desapareció. este es un pedazo de mi código en Java, tiene un EDITTEXT y un botón que captura el texto en el EDITTEXT:

editText=(EditText) findViewById(R.id.et1); 
    tvhome= (TextView)findViewById(R.id.tv_home); 
    etBtn= (Button) findViewById(R.id.btn_homeadd); 
    etBtn.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      tvhome.setText(editText.getText().toString()); 

      //** this code is for hiding the keyboard after pressing the button 
      View view = Settings.this.getCurrentFocus(); 
      if (view != null) 
      { 
       InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
       imm.hideSoftInputFromWindow(view.getWindowToken(), 0); 
      } 
      //** 

      editText.getText().clear();//clears the text 
      editText.setFocusable(false);//disables the focus of the editText 
      Log.i("onCreate().Button.onClickListener()", "et.isfocused= "+editText.isFocused()); 
     } 
    }); 
    editText.setOnClickListener(new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View v) 
     { 
      if(v.getId() == R.id.et1) 
      { 
       v.setFocusableInTouchMode(true);// when the editText is clicked it will gain focus again 

       //** this code is for enabling the keyboard at the first click on the editText 
       if(v.isFocused())//the code is optional, because at the second click the keyboard shows by itself 
       { 
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
        imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT); 
       } 
       //** 

       Log.i("onCreate().EditText.onClickListener()", "et.isfocused= "+v.isFocused()); 
      } 
      else 
       Log.i("onCreate().EditText.onClickListener()", "the listener did'nt consume the event"); 
     } 
    }); 

esperanza de que ayudará a algunos de ustedes!

0

Si entiendo bien su pregunta, esto le ayudará a:

TextView tv1 = (TextView) findViewById(R.id.tv1); 
tv1 .setFocusable(false); 
0

sólo hay que despejar el centro de atención de la vista como

EditText.clearFocus() 
0

Desde que estaba en un widget y no en una actividad que hice:

`getRootView(). clearFocus();

2

Solo encuentra otra vista y concéntrate en ella.

var refresher = FindViewById<MvxSwipeRefreshLayout>(Resource.Id.refresher); 

refresher.RequestFocus(); 
+0

Por alguna razón, esta fue la mejor solución para mí. Solo solicito centrarme en el diseño lineal para que mi texto de edición pierda su foco –

2

Trataré de explicar cómo eliminar el foco (cursor intermitente) de la vista EditText con más detalles y más comprensión. Por lo general, esta línea de código debería funcionar

editText.clearFocus() 

pero podría ser la situación cuando el EDITTEXT todavía tiene el foco, y esto está sucediendo porque el método clearFocus() está tratando de establecer el foco a la primera vista enfocable en el diseño de actividad/fragmento.

Así que si solo tiene una vista en la actividad que se puede enfocar, y esta será normalmente su vista de Editar texto, clearFocus() volverá a establecer el foco en esa vista, y para usted se verá clearFocus() no está trabajando. Recuerda que las vistas de EditText son enfocables (verdaderas) de forma predeterminada, por lo que si solo tienes una vista de EditText dentro de tu diseño, siempre se enfocará en la pantalla. En este caso la solución será encontrar la vista padre (algunos diseño, ex LinearLayout, FrameLayout) dentro de su archivo de diseño y ajuste a ella el código XML

android:focusable="true" 
android:focusableInTouchMode="true" 

Después de que cuando se ejecuta editText.clearFocus() del la vista principal dentro de su diseño aceptará el foco y su editText quedará fuera del foco.

Espero que esto ayude a alguien a entender cómo funciona clearFocus().

1

He intentado mucho borrar el foco de un texto de edición. clearfocus() y enfocables y otras cosas nunca funcionaron para mí. Así que se le ocurrió la idea de dejar una ganancia EditarTexto falso enfoque:

<LinearLayout 
    ... 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     ... 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

    <!--here comes your stuff--> 

    </LinearLayout> 

    <EditText 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/fake" 
     android:textSize="1sp"/> 

</LinearLayout> 

continuación en el código Java:

View view = Activity.this.getCurrentFocus(); 
        if (view != null) { 
         InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
         imm.hideSoftInputFromWindow(view.getWindowToken(), 0); 
         fake.requestFocus(); 
        } 

va a ocultar el teclado y quitar el foco de cualquier EditarTexto que tiene eso. y también como se ve, el texto de edición falso está fuera de la pantalla y no se puede ver

Cuestiones relacionadas