[android] Detener EditText para que no se centre en el inicio de la actividad


Answers

¿Es el problema real que simplemente no desea que tenga foco en absoluto? ¿O no quieres que muestre el teclado virtual como resultado de enfocar EditText ? Realmente no veo un problema con EditText tenga foco en el inicio, pero definitivamente es un problema tener la ventana de SoftInput abierta cuando el usuario no solicitó explícitamente centrarse en EditText (y abrir el teclado como resultado).

Si se trata del problema del teclado virtual, consulte la documentación del elemento AndroidManifest.xml <actividad> .

android:windowSoftInputMode="stateHidden" - siempre android:windowSoftInputMode="stateHidden" al ingresar la actividad.

o android:windowSoftInputMode="stateUnchanged" - no lo cambie (p. ej., no lo muestre si aún no se muestra, pero si estaba abierto al ingresar la actividad, déjelo abierto).

Question

Tengo una Activity en Android, con dos elementos:

  1. EditText
  2. ListView

Cuando se inicia mi Activity , EditText tiene inmediatamente el foco de entrada (cursor intermitente). No quiero que ningún control tenga foco de entrada al inicio. Lo intenté:

EditText.setSelected(false);

Sin suerte. ¿Cómo puedo convencer a EditText que no se seleccione a sí mismo cuando comience la Activity ?




En onCreate of your Activity, solo agregue use clearFocus() en su elemento EditText. Por ejemplo,

edittext = (EditText) findViewById(R.id.edittext);
edittext.clearFocus();

Y si desea desviar el foco a otro elemento, use requestFocus() en eso. Por ejemplo,

button = (Button) findViewById(R.id.button);
button.requestFocus();



Esta es la solución perfecta y más fácil. Siempre uso esto en mi aplicación.

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



Siendo que no me gusta contaminar el XML con algo que está relacionado con la funcionalidad, creé este método que "roba" de forma transparente el foco de la primera vista enfocable y luego se asegura de eliminarse cuando sea necesario.

public static View preventInitialFocus(final Activity activity)
{
    final ViewGroup content = (ViewGroup)activity.findViewById(android.R.id.content);
    final View root = content.getChildAt(0);
    if (root == null) return null;
    final View focusDummy = new View(activity);
    final View.OnFocusChangeListener onFocusChangeListener = new View.OnFocusChangeListener()
    {
        @Override
        public void onFocusChange(View view, boolean b)
        {
            view.setOnFocusChangeListener(null);
            content.removeView(focusDummy);
        }
    };
    focusDummy.setFocusable(true);
    focusDummy.setFocusableInTouchMode(true);
    content.addView(focusDummy, 0, new LinearLayout.LayoutParams(0, 0));
    if (root instanceof ViewGroup)
    {
        final ViewGroup _root = (ViewGroup)root;
        for (int i = 1, children = _root.getChildCount(); i < children; i++)
        {
            final View child = _root.getChildAt(i);
            if (child.isFocusable() || child.isFocusableInTouchMode())
            {
                child.setOnFocusChangeListener(onFocusChangeListener);
                break;
            }
        }
    }
    else if (root.isFocusable() || root.isFocusableInTouchMode())
        root.setOnFocusChangeListener(onFocusChangeListener);

    return focusDummy;
}



Para mí, lo que funcionó en todos los dispositivos es este:

    <!-- fake first focusable view, to allow stealing the focus to itself when clearing the focus from others -->

    <View
    android:layout_width="0px"
    android:layout_height="0px"
    android:focusable="true"
    android:focusableInTouchMode="true" />

Simplemente ponga esto como una vista antes de la vista enfocada problemática, y eso es todo.




Pruebe clearFocus() lugar de setSelected(false) . Todas las vistas en Android tienen tanto capacidad de enfoque como de selección, y creo que quieres simplemente despejar el foco.




onCreate en el método onCreate :

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



Ninguna de estas soluciones funcionó para mí. La forma en que corrijo el enfoque automático fue:

<activity android:name=".android.InviteFriendsActivity" android:windowSoftInputMode="adjustPan">
    <intent-filter >
    </intent-filter>
</activity>



La única solución que he encontrado es:

  • Crea un LinearLayout (no sé si funcionarán otros tipos de LinearLayout )
  • Establezca los atributos android:focusable="true" y android:focusableInTouchMode="true"

Y EditText no obtendrá el foco después de comenzar la actividad




usando la información proporcionada por otros carteles, utilicé la siguiente solución:

en el diseño XML

<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
    android:id="@+id/linearLayout_focus"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:layout_width="0px"
    android:layout_height="0px"/>

<!-- AUTOCOMPLETE -->
<AutoCompleteTextView
    android:id="@+id/autocomplete"
    android:layout_width="200dip"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dip"
    android:inputType="textNoSuggestions|textVisiblePassword"/>

en onCreate ()

private AutoCompleteTextView mAutoCompleteTextView;
private LinearLayout mLinearLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mylayout);

    //get references to UI components
    mAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.autocomplete);
    mLinearLayout = (LinearLayout) findViewById(R.id.linearLayout_focus);
}

y finalmente, en onResume ()

@Override
protected void onResume() {
    super.onResume();

    //do not give the editbox focus automatically when activity starts
    mAutoCompleteTextView.clearFocus();
    mLinearLayout.requestFocus();
}



Necesitaba borrar el foco de todos los campos programáticamente. Acabo de agregar las dos afirmaciones siguientes a la definición de mi diseño principal.

myLayout.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
myLayout.setFocusableInTouchMode(true);

Eso es. Solucionado mi problema al instante. Gracias, Silver, por apuntarme en la dirección correcta.




Puede configurar "enfocable" y "enfocable en modo táctil" para establecer el valor verdadero en el primer TextView del layout . De esta forma, cuando comience la actividad, TextView se enfocará pero, debido a su naturaleza, no verá nada enfocado en la pantalla y, por supuesto, no se mostrará el teclado ...




Escriba este código dentro del archivo Manifest en la Activity donde no desea abrir el teclado.

android:windowSoftInputMode="stateHidden"

Archivo manifiesto

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.projectt"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="24" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
         <activity
            android:name=".Splash"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Login"
            **android:windowSoftInputMode="stateHidden"**
            android:label="@string/app_name" >
        </activity>

    </application>

</manifest>



Asegúrese de eliminar la línea "<requestFocus />" de la etiqueta EditText en xml.

<EditText
   android:id="@+id/input"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content">

   <requestFocus /> <!-- remove this line --> 
</EditText>



Si tiene otra vista de su actividad como ListView , también puede hacer:

ListView.requestFocus(); 

en su onResume() para tomar el foco del editText .

Sé que esta pregunta ha sido respondida, pero solo brindé una solución alternativa que funcionó para mí :)




Related