¿Cómo establecer el foco en una vista cuando se crea y muestra un diseño?


90

Actualmente, tengo un diseño que contiene un Button, un TextViewy un EditText. Cuando se muestra el diseño, el enfoque se colocará automáticamente en EditText, lo que activará el teclado para que aparezca en el teléfono Android. No es lo que quiero. ¿Hay alguna forma de que pueda establecer el enfoque en TextViewo en nada cuando se muestra un diseño?

Respuestas:


109

Establecer foco: el marco manejará el foco en movimiento en respuesta a la entrada del usuario. Para forzar el enfoque a una vista específica, llame a requestFocus ()


17

Esto funciona:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

¿Qué hace? Parece que está modificando algún estado para toda la actividad, y no solo una vista o un fragmento, por lo que sería cauteloso con esto y no lo usaría a menos que entienda todas sus implicaciones.
Vaddadi Kartick

De hecho, no haría esto basándome en la solicitud del cartel original. Esto puede resolver el problema actual, pero su uso tiene efectos secundarios que podrían causar problemas más adelante. Son hacks como este los que se abren paso en las bases de código que hacen que se agreguen otros hacks más adelante para negar el hack original ... el círculo vicioso continúa ... y la gente se pregunta por qué el código se vuelve inmanejable. Sí, lo adivinaste ... Trabajo con otras personas que hacen cosas como esta y me hace la vida muy difícil.
dell116


6

Conjunto

 android:focusable="true"

en tus <EditText/>


6

Para establecer el enfoque, retrase requestFocus () usando un Handler.

private Handler mHandler= new Handler();

public class HelloAndroid extends Activity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);

     LinearLayout mainVw = (LinearLayout) findViewById(R.id.main_layout);

     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( 
           LinearLayout.LayoutParams.FILL_PARENT,
           LinearLayout.LayoutParams.WRAP_CONTENT);

     EditText edit = new EditText(this);
     edit.setLayoutParams(params);
     mainVw.addView(edit);

     TextView titleTv = new TextView(this);
     titleTv.setText("test");
     titleTv.setLayoutParams(params);
     mainVw.addView(titleTv);

     mHandler.post(
       new Runnable() 
       {
          public void run() 
          {
            titleTv.requestFocus();
          } 
       }
     );
   }
}

5

Puedes intentar ocultar el teclado. Algo como esto:

InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);


3

Establezca estas líneas en OnResumetambién y asegúrese de que focusableInTouchesté establecido en verdadero mientras inicializa sus controles

<controlName>.requestFocus();

<controlName>.requestFocusFromTouch();

3

para cambiar el enfoque, haga que el textView en xml se pueda enfocar

<TextView
            **android:focusable="true"**
            android:id="@+id/tv_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

y en java en crear

textView.requestFocus();

o simplemente esconde el teclado

public void hideKeyBoard(Activity act) {
    act.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
    InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
}

android: focusable = "true" y textView.requestFocus (); trabajó para mi. ¡Gracias!
Werner

2

Ninguna de las respuestas anteriores me funciona. La única solución (digamos) ha sido cambiar el primer TextView en un EditText deshabilitado que recibe el foco y luego agregar

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

en la devolución de llamada onCreate para evitar que se muestre el teclado. Ahora mi primer EditText parece un TextView pero finalmente puede obtener el enfoque inicial.


2

La última sugerencia es la solución correcta. Solo para repetir, primero configure android:focusable="true"en el xmlarchivo de diseño , luego requestFocus()en la vista en su código.


1

Creo que una vista de texto no se puede enfocar. Intente establecer el foco en un botón, por ejemplo, o establecer la propiedad enfocable en verdadero.


1

puede agregar un texto de edición de tamaño "0 dip" como el primer control en ur xml, por lo que se centrará en el render (asegúrese de que sea enfocable y todo ...)


1

Puede comenzar agregando android:windowSoftInputModea su actividad en el AndroidManifest.xmlarchivo.

<activity android:name="YourActivity"
          android:windowSoftInputMode="stateHidden" />

Esto hará que el teclado no se muestre, pero EditTextaún tiene el foco. Para solucionar esto, se puede establecer android:focusableInTouchmodey android:focusableque trueen su vista raíz.

<LinearLayout android:orientation="vertical"
              android:focusable="true"
              android:focusableInTouchMode="true"
              ...
              >
    <EditText
         ...
       />
    <TextView
         ...
       />
    <Button
         ...
       />
</LinearLayout>

El código anterior se asegurará de que se RelativeLayoutesté enfocando en lugar deEditText


0

El enfoque es para seleccionar componentes de la interfaz de usuario cuando está usando algo además del tacto (es decir, un d-pad, un teclado, etc.). Cualquier vista puede recibir el enfoque, aunque algunas no se pueden enfocar de forma predeterminada. (Puede hacer que una vista setFocusable(true)se pueda enfocar con y forzarla a enfocarse con requestFocus()).

Sin embargo, es importante tener en cuenta que cuando está en modo táctil, el enfoque está desactivado . Entonces, si está usando sus dedos, cambiar el enfoque programáticamente no hace nada. La excepción a esto es para las vistas que reciben información de un editor de entrada. An EditTextes un ejemplo. Para esta situación especial setFocusableInTouchMode(true)se utiliza para que el teclado virtual sepa dónde enviar la entrada. UnEditText tiene esta configuración por defecto. El teclado virtual aparecerá automáticamente.

Si no desea que el teclado virtual aparezca automáticamente, puede suprimirlo temporalmente como señaló @abeljus:

InputMethodManager inputManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

Cuando un usuario hace clic en el EditText embargo, cuando , todavía debería mostrar el teclado.

Otras lecturas:


¿Esta respuesta es incorrecta? No se dejó ningún comentario con el voto negativo.
Suragch
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.