android remove - Interrompe EditText dalla messa a fuoco all'avvio dell'attività




15 Answers

Ottima risposta da Luc e Mark, tuttavia manca un buon esempio di codice. Aggiungendo il tag android:focusableInTouchMode="true" a <LinearLayout> come il seguente esempio risolverà il problema.

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

<!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
to prevent the dummy from receiving focus again -->
<AutoCompleteTextView android:id="@+id/autotext"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:nextFocusUp="@id/autotext" 
    android:nextFocusLeft="@id/autotext"/>
focus force

Ho un'attività in Android, con due elementi:

  1. EditText
  2. ListView

All'avvio della mia Activity , EditText ha immediatamente il focus di input (cursore lampeggiante). Non voglio che nessun controllo abbia il focus di input all'avvio. Provai:

EditText.setSelected(false);

Senza fortuna. Come posso convincere EditText a non selezionare se stesso all'avvio Activity ?




Esiste una soluzione più semplice. Imposta questi attributi nel tuo layout genitore:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainLayout"
    android:descendantFocusability="beforeDescendants"
    android:focusableInTouchMode="true" >

E ora, quando l'attività inizia, questo layout principale otterrà il focus di default.

Inoltre, è possibile rimuovere l'attenzione dalle viste secondarie in fase di esecuzione (ad esempio, dopo aver terminato la modifica dei figli) dando di nuovo il focus al layout principale, in questo modo:

findViewById(R.id.mainLayout).requestFocus();

Buon commento di Guillaume Perrot :

android:descendantFocusability="beforeDescendants" sembra essere il valore predefinito (il valore intero è 0). Funziona solo aggiungendo android:focusableInTouchMode="true" .

In realtà, possiamo vedere che i beforeDescendants impostati come predefiniti nel metodo ViewGroup.initViewGroup() (Android 2.2.2). Ma non uguale a 0. ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;

Grazie a Guillaume.




Il problema sembra provenire da una proprietà che posso vedere solo nella XML form del layout.

Assicurati di rimuovere questa riga alla fine della dichiarazione all'interno dei tag XML EditText :

<requestFocus />

Questo dovrebbe dare qualcosa del genere:

<EditText
   android:id="@+id/emailField"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:inputType="textEmailAddress">

   //<requestFocus /> /* <-- without this line */
</EditText>



Quanto segue impedirà a edittext di mettere a fuoco quando viene creato, ma afferralo quando lo tocchi.

<EditText
    android:id="@+id/et_bonus_custom"
    android:focusable="false" />

Quindi puoi impostare focusable su false in xml, ma la chiave è in java, a cui aggiungi il seguente listener:

etBonus.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.setFocusable(true);
        v.setFocusableInTouchMode(true);
        return false;
    }
});

Poiché stai restituendo false, cioè non consumando l'evento, il comportamento di messa a fuoco procederà normalmente.




Avevo provato diverse risposte individualmente ma il focus è ancora su EditText. Sono riuscito a risolverlo solo utilizzando due delle soluzioni sottostanti.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/mainLayout"
  android:descendantFocusability="beforeDescendants"
  android:focusableInTouchMode="true" >

(Riferimento da Silver https://.com/a/8639921/15695 )

e rimuovere

 <requestFocus />

su EditText

(Riferimento da floydaddict share )




Soluzione semplice: in AndroidManifest nell'utilizzo del tag Activity

android:windowSoftInputMode="stateAlwaysHidden"



Il seguente ha funzionato per me in Manifest . Scrivi ,

<activity
android:name=".MyActivity"
android:windowSoftInputMode="stateAlwaysHidden"/>



Aggiungi android:windowSoftInputMode="stateAlwaysHidden" nel tag di attività del file Manifest.xml .

Source




Se hai un'altra vista sulla tua attività come un ListView , puoi anche fare:

ListView.requestFocus(); 

nel tuo onResume() per catturare l'attenzione da editText .

So che questa domanda ha avuto risposta, ma ho appena fornito una soluzione alternativa che ha funzionato per me :)




Aggiungi seguendo nel metodo onCreate :

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



Essendo che non mi piace inquinare l'XML con qualcosa che riguarda la funzionalità, ho creato questo metodo che "in modo trasparente" ruba l'attenzione dalla prima vista focalizzabile e quindi si assicura di rimuovere se stessa quando necessario!

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;
}



Scrivi questa linea nel tuo layout principale ...

 android:focusableInTouchMode="true"



Questa è la soluzione perfetta e più semplice. Lo uso sempre nella mia app.

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



Scrivi questo codice all'interno del file Manifest nell'attività in cui non desideri aprire la tastiera.

android:windowSoftInputMode="stateHidden"

File manifest:

 <?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>



Su onCreate della tua attività, aggiungi semplicemente clearFocus() sull'elemento EditText. Per esempio,

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

E se vuoi deviare lo stato attivo su un altro elemento, usa requestFocus() su quello. Per esempio,

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



Related

android listview android-edittext