92 votes

Pourquoi mon activité Android commence-t-elle toujours par défiler vers le bas ?

Chaque fois que je commence cette activité, elle démarre toujours en bas de l'écran, c'est-à-dire qu'elle défile jusqu'en bas. Je ne fais rien de bizarre dans l'activité OnCreate (ou ailleurs d'ailleurs) qui pourrait modifier la position de défilement. J'ai essayé de mettre l'accent sur le contrôle focalisable le plus haut, et la méthode scrollto, mais aucune de ces méthodes ne fonctionne. Par ailleurs, aucune de mes autres activités ne présente ce problème. Voici la mise en page :

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

0 votes

Comment avez-vous essayé de changer de cible ?

1 votes

En utilisant la méthode fulscroll comme décrit ci-dessous et la méthode scrollto comme également décrit ci-dessous. Cela ne me dérange pas nécessairement de le réparer de cette façon, mais il doit y avoir une raison pour laquelle il commence comme ça et je préfère le réparer en corrigeant cette raison.

310voto

devmiles.com Points 2694

Lorsque Android démarre une activité, un contrôle doit être mis en place. Lorsqu'il n'y a pas de contrôle désigné pour prendre le focus, le système choisit le premier contrôle éligible qui veut prendre le focus. Si vous définissez la propriété suivante dans votre LinearLayout - android:focusableInTouchMode="true" votre LinearLayout sera concentrée sur le début et votre activité ne défilera pas à EditText dans le fond.

0 votes

Cela ne fonctionne pas dans mon GridLayout. J'ai un GridView au milieu de la disposition, et il obtient le focus à chaque fois.

2 votes

Je me suis gratté la tête pendant une journée entière et je n'ai pas réussi à comprendre pourquoi cela se produisait dans une seule activité particulière et je ne comprends toujours pas puisque je n'ai pas activé le focus sur aucune vue. Mais grâce à vous, j'ai réussi à résoudre ce problème. Ce serait formidable si quelqu'un pouvait m'éclairer sur ce qui pourrait être la raison possible puisque je ne fais rien de nouveau dans la nouvelle activité.

2 votes

Une note importante : ceci doit être ajouté comme propriété à l'objet de l'utilisateur. LinearLayout à l'intérieur de la ScrollView et non à la vue défilante elle-même.

35voto

Graeme Points 9167

Au lieu de polluer les éléments de votre mise en page, vous pouvez ajouter ceci dans votre activité/classe :

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

De cette façon, ce n'est pas un élément de votre scrollView qui reçoit le focus, c'est votre scrollView en tant que conteneur qui reçoit le premier focus, puis les vues enfants.

0 votes

Cela fonctionne partiellement pour moi lorsque j'essaie de définir la hauteur du ListView en fonction des enfants dans le ScrollView.

0 votes

Cela a aidé ! (alors que les mêmes attributs en xml n'ont pas fonctionné )

0 votes

Fonctionne comme un charme ! Thx

4voto

Vous pouvez essayer ce code :

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

[N:B] [lien de référence] 1

3voto

Hemendra Gangwar Points 434

Ajoutez ces deux lignes dans votre ScrollView

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

2voto

luca992 Points 36

Tout comme ce qu'a dit devmiles.com.

Si vous définissez la propriété suivante dans votre LinearLayout - Android:focusableInTouchMode="true", votre LinearLayout sera centré sur le début et votre activité ne défilera pas vers l'EditText en bas.

Si vous appelez requestLayout() sur une vue située en bas de votre mise en page linéaire, elle risque de détourner l'attention de la vue la plus haute. Il suffit donc d'appeler requestFocus() sur la vue la plus haute de la disposition linéaire après avoir appelé requestLayout() sur une vue plus basse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X