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>
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.
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.
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
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;
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.
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);
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éé.
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 :)
Ajoutez ces deux lignes dans votre ScrollView
Android:focusableInTouchMode="true"
Android:descendantFocusability="blocksDescendants"
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é.
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 .