[Android] Interrompe EditText dalla messa a fuoco all'avvio dell'attività



Answers

Il vero problema è che non vuoi che si concentri? O non vuoi che mostri la tastiera virtuale come risultato della messa a fuoco di EditText ? Non vedo davvero un problema con EditText che si concentra sull'avvio, ma è sicuramente un problema avere la finestra softInput aperta quando l'utente non ha richiesto esplicitamente di focalizzarsi su EditText (e aprire la tastiera come risultato).

Se si tratta del problema della tastiera virtuale, consultare la documentazione dell'elemento <activity> di AndroidManifest.xml .

android:windowSoftInputMode="stateHidden" - nasconde sempre quando si accede all'attività.

o android:windowSoftInputMode="stateUnchanged" - non cambiarlo (es. non mostrarlo se non è già mostrato, ma se era aperto quando si entra nell'attività, lasciarlo aperto).

Question

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 ?




Puoi semplicemente impostare "focusable" e "focusable in touch mode" per il valore true sulla prima TextView del layout . In questo modo, quando l'attività inizia, TextView sarà focalizzato ma, per la sua natura, non vedrai nulla focalizzato sullo schermo e, ovviamente, non verrà visualizzata alcuna tastiera ...




Nessuna di queste soluzioni ha funzionato per me. Il modo in cui ho sistemato la messa a fuoco automatica era:

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



L'unica soluzione che ho trovato è:

  • Crea un LinearLayout (non so se funzioneranno altri tipi di layout)
  • Imposta gli attributi android:focusable="true" e android:focusableInTouchMode="true"

E EditText non si focalizzerà dopo l'avvio dell'attività




utilizzando le informazioni fornite da altri poster, ho utilizzato la seguente soluzione:

nel layout 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"/>

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

e infine, in onResume ()

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

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



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 è legato alla 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;
}



Assicurati di rimuovere la riga "<requestFocus />" dal tag EditText in xml.

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

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



Avevo bisogno di cancellare l'attenzione da tutti i campi a livello di programmazione. Ho appena aggiunto le seguenti due istruzioni alla mia definizione di layout principale.

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

Questo è tutto. Risolto il mio problema all'istante. Grazie, Silver, per avermi indicato nella giusta direzione.




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();



Prova clearFocus() invece di setSelected(false) . Ogni vista in Android ha sia focusability e selettività, e penso che tu voglia semplicemente cancellare l'attenzione.




Per me, ciò che ha funzionato su tutti i dispositivi è questo:

    <!-- 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" />

Basta mettere questo come vista prima della vista focalizzata problematica, e il gioco è fatto.




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

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



Links