web-dev-qa-db-fra.com

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

Chaque fois que je commence cette activité, elle commence toujours par le fond - défilée jusqu'au fond. Je ne fais rien de bizarre dans l'activité OnCreate (ni ailleurs d'ailleurs) que je m'attendrais à changer de position de défilement. J'ai essayé de définir le focus sur le contrôle le plus élevé pouvant être focalisé et la méthode scrollto, mais aucun d'entre eux ne fonctionne. En outre, aucune de mes autres activités n'a 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>
81
MrGibbage

Lorsque Android démarre une activité, certains contrôles doivent être ciblés. S'il n'y a pas de contrôle désigné pour prendre le focus, le système choisit le premier contrôle éligible qui le souhaite .. Si vous définissez la propriété suivante dans votre LinearLayout - Android:focusableInTouchMode="true" votre LinearLayout sera concentré sur le début et votre activité ne fera pas défiler jusqu'à EditText dans le fond.

279
devmiles.com

Au lieu d'éléments polluants dans votre mise en page, vous pouvez ajouter ceci à 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 ayant le focus, c'est votre scrollView en tant que conteneur qui obtient le premier focus, passant ensuite à la vue enfant.

28
Graeme

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

3
user4356416

Pour le développement Android Xamarin, si vous voulez utiliser la solution @Graeme, alors:

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

Avec ce que devmiles.com a dit. 

Si vous définissez la propriété suivante dans votre LinearLayout - Android: focusableInTouchMode = "true", votre LinearLayout sera concentré sur le début et votre activité ne fera pas défiler jusqu'à EditText en bas.

Si vous appelez requestLayout () sur une vue située au bas de votre présentation linéaire, cela risque de dérober le focus de la vue supérieure. Il suffit donc d'appeler requestFocus () dans la vue la plus haute de la présentation linéaire après avoir appelé requestLayout () dans une vue inférieure.

1
luca992

Avez-vous déjà utilisé la méthode fullScroll? Http: //developer.Android.com/reference/Android/widget/ScrollView.html#fullScroll (int)

yourScrollView.fullScroll(ScrollView.FOCUS_UP);
1
Mike

Il suffit de le rendre non focalisable dans onCreate ()

editText.setFocusable(false);

et utilise 

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

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

 ......
 };

et il ne fera pas défiler Edittext la prochaine fois, un fragment ou une activité est créé.

0
codepeaker

Dans mon cas, j'avais une VideoView dans une ConstraintLayout dans une ScrollView. La VideoView volait toujours la cible, et il y a des problèmes avec elle . La solution consiste à utiliser une TextureView. Espérons que cela aide quelqu'un, cela m'a coûté une heure au moins :)

0
Daniel Wilson

Ajoutez ces deux lignes dans votre ScrollView 

 Android:focusableInTouchMode="true"
 Android:descendantFocusability="blocksDescendants"
0
Hemendra Gangwar

Je ne sais pas pourquoi mais tu pourrais expérimenter

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

dans votre onCreate pour le faire défiler manuellement à l'endroit souhaité.

0
zapl

scrollView.requestFocus(View.FOCUS_UP) a résolu mon problème lorsque je voulais que la vue de dessus soit visible . Spécifier un paramètre de direction pour la méthode requestFocus(int direction) est un bon moyen de contrôler la position ScrollView. Plus de détails ici .

0
Amit