Perché la mia attività su Android inizia sempre con lo scorrimento verso il basso?


91

Ogni volta che inizio questa attività, inizia sempre toccando il fondo - scorreva fino in fondo. Non sto facendo nulla di strano nell'attività OnCreate (o ovunque per quella materia) che mi aspetterei di cambiare la posizione di scorrimento. Ho provato a impostare lo stato attivo sul controllo attivabile più in alto e il metodo scrollto, ma nessuno dei due funziona. Inoltre, nessuna delle mie altre attività ha questo problema. Ecco il layout:

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scroll"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/edit_refresh_update_header"
            android:textSize="18sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Variable:"
            android:textSize="18sp"/>

        <Spinner
            android:id="@+id/edit_refresh_variables_spinner"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Network:"
            android:textSize="18sp"/>

        <RadioGroup
            android:id="@+id/widget1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="vertical">

            <RadioButton
                android:text="Web"
                android:id="@+id/edit_refresh_update_rb_web"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="NetRadioButtonSelected"
                android:checked="true"/>

            <RadioButton
                android:text="Socket Server"
                android:id="@+id/edit_refresh_update_rb_socket_server"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:onClick="NetRadioButtonSelected"/>
        </RadioGroup>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Socket server request type:"
            android:textSize="18sp"/>

        <Spinner
            android:id="@+id/edit_refresh_socket_server_req_types_spinner"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Socket server body:"
            android:textSize="18sp"/>

        <EditText
            android:layout_width="match_parent"
            android:id="@+id/edit_refresh_update_ss_body"
            android:layout_height="wrap_content"
            android:enabled="false"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Url:"
            android:textSize="18sp"/>

        <EditText
            android:layout_width="match_parent"
            android:id="@+id/edit_refresh_update_url"
            android:layout_height="wrap_content"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>

        <Button
            android:text="Save refresh update"
            android:id="@+id/edit_refresh_save_btn"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:layout_marginLeft="20dip"
            android:layout_marginRight="20dip"
            android:layout_marginBottom="20dp"
            android:layout_alignParentBottom="true"
            android:onClick="SaveRefreshUpdate">
        </Button>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="\n"
            android:textSize="4sp"/>
    </LinearLayout>
</ScrollView>

Come hai provato esattamente a cambiare focus?
devmiles.com

1
utilizzando il metodo fulscroll come descritto di seguito e il metodo scrollto come descritto anche di seguito. Non mi dispiace necessariamente aggiustarlo in questo modo, ma deve esserci un motivo per cui sta iniziando così e preferirei risolverlo correggendolo.
MrGibbage

Risposte:


306

Quando Android avvia un'attività, alcuni controlli devono essere concentrati. Quando non è presente alcun controllo designato su cui concentrarsi, il sistema sceglie il primo controllo idoneo che desidera concentrarsi. Se si imposta la seguente proprietà nel vostro LinearLayout - android:focusableInTouchMode="true"la vostra LinearLayoutsarà focalizzata su inizio e la vostra attività non sarà di scorrimento per EditTextsul fondo.


Non funziona nel mio GridLayout. Ho un GridView nel mezzo del layout e ottiene lo stato attivo ogni volta.
Iqbal

2
Mi sono grattato la testa per un'intera giornata e non sono riuscito a trovare il motivo per cui stava accadendo in una determinata attività e ancora non capisco poiché non ho abilitato la messa a fuoco su nessuna vista. Ma grazie a te sono riuscito a risolvere questo problema. Sarebbe fantastico se qualcuno potesse gettare un po 'di luce su quale potrebbe essere la possibile ragione poiché non c'è nulla di nuovo che sto facendo nella nuova attività.
Shubhral

2
Una nota importante: questa deve essere aggiunta come proprietà LinearLayoutall'interno della ScrollView, non alla visualizzazione a scorrimento stessa.
Boris Strandjev

@ BorisStrandjev nota molto importante. Dovrebbe essere aggiunto alla risposta. A proposito, grazie per questo: P
Coreggon

È letteralmente menzionato nella risposta.
devmiles.com

35

Invece di inquinare gli elementi nel tuo layout, puoi aggiungerlo alla tua attività / classe:

    ScrollView scrollView = (ScrollView) findViewById(R.id.scrollView);
    scrollView.setFocusableInTouchMode(true); 
    scrollView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);

In questo modo non è un elemento all'interno del tuo scrollView che ottiene il focus, è il tuo scrollView come contenitore che ottiene il primo focus, spostandosi sulla vista figlio dopo questo.


Funziona parzialmente per me quando provo a impostare l'altezza di ListView in base ai bambini all'interno di ScrollView
Konstantin Konopko

Questo ha aiutato! (mentre gli stessi attributi in xml non funzionavano ..)
Matan Dahan

Funziona come un fascino! Thx
Bogy

Ha funzionato per me, ma ho aggiunto questa riga: scrollView.fullScroll (ScrollView.FOCUS_UP) Entrambi separatamente non funzionavano.
Juan Giorello

3

Puoi provare questo codice:

scroller.post(new Runnable() { 
    public void run() { 
        scroller.fullScroll(ScrollView.FOCUS_DOWN); 
    } 
}); 

[N: B] [link di riferimento] 1


1
è una buona opzione ma simula uno strappo dopo l'apertura, quindi non è una buona esperienza utente credo
iBabur

2

Insieme a ciò che ha detto devmiles.com.

Se imposti la seguente proprietà nel tuo LinearLayout - android: focusableInTouchMode = "true" il tuo LinearLayout sarà focalizzato sull'inizio e la tua attività non scorrerà fino a EditText in fondo.

Se chiami requestLayout () su una vista nella parte inferiore del tuo layout lineare, potrebbe rubare il focus dalla tua vista più in alto. Quindi chiama semplicemente requestFocus () nella vista più in alto nel layout lineare dopo aver chiamato requestLayout () in una vista inferiore.


1

Hai provato a utilizzare il metodo fullScroll? Http: //developer.android.com/reference/android/widget/ScrollView.html#fullScroll (int)

yourScrollView.fullScroll(ScrollView.FOCUS_UP);

1

Per lo sviluppo Xamarin Android, se vuoi fare la soluzione @Graeme allora:

// Set Focus to ScrollView
ScrollView scrollView = (ScrollView)FindViewById(Resource.Id.scrollView);
scrollView.FocusableInTouchMode = true;
scrollView.DescendantFocusability = Android.Views.DescendantFocusability.BeforeDescendants;

1

Basta renderlo non focalizzabile in onCreate ()

editText.setFocusable(false);

e utilizzare

editText.setOnClickListener(new ....){
 ......
  editText.setFocusable(true);
  editText.setFocusableInTouchMode(true);
  editText.requestFocus();

  showSoftKeyboard(); //Use InputMethodManager to open soft Keyboard

 ......
 };

e la prossima volta non scorrerà fino a Edittext, verrà creato un frammento o un'attività.


1

Aggiungi queste due linee nel tuo file ScrollView

 android:focusableInTouchMode="true"
 android:descendantFocusability="blocksDescendants"

0

Non so perché ma potresti sperimentare

ScrollView sv = (ScrollView) findViewById(R.id.scroll);
sv.scrollTo(0,0);

nel tuo onCreateper scorrere manualmente fino a dove preferisci che sia.


0

scrollView.requestFocus(View.FOCUS_UP)ha risolto il mio problema quando volevo che la vista dall'alto fosse visibile. Specificare il parametro di direzione nel metodo requestFocus(int direction)è un buon modo per controllare la ScrollViewposizione. Maggiori dettagli qui .


0

Nel mio caso avevo un VideoViewinterno un ConstraintLayoutinterno a ScrollView. L' VideoViewera sempre rubando messa a fuoco, e non ci sono problemi con esso . La soluzione è utilizzare un file TextureView. Spero che questo aiuti qualcuno, mi è costato almeno un'ora :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.