J'ai essayé de définir la position initiale d'une vue de défilement, mais je n'ai pas trouvé de moyen. Quelqu'un a-t-il une idée? De plus, j'ai un fragment GoogleMaps en tant qu'enfant de la vue par défilement.
Merci,
Ryan
Oui, c'est possible
ScrollView.scrollTo(int x, int y);
ScrollView.smoothScrollTo(int x, int y);
ScrollView.smoothScrollBy(int x, int y);
peut être utilisé pour cela. Les paramètres x et y sont les coordonnées sur lesquelles défiler les axes horizontal et vertical.
Exemple en code:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_layout);
ScrollView sv = (ScrollView) findViewById(R.id.scrollView);
sv.scrollTo(0, 100);
}
Dans cet exemple, une fois que la Activity
est démarrée, votre ScrollView
défilera de 100 pixels.
Vous pouvez également essayer de delay le processus de défilement:
final ScrollView sv = (ScrollView) findViewById(R.id.scrollView);
Handler h = new Handler();
h.postDelayed(new Runnable() {
@Override
public void run() {
sv.scrollTo(0, 100);
}
}, 250); // 250 ms delay
La réponse acceptée ne fonctionne pas pour moi. Il n'y a pas de moyen direct pour définir la position initiale d'une vue de défilement.
Cependant, vous pouvez définir la position initiale avant de dessiner la vue de défilement, comme suit:
rootView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
scrollView.getViewTreeObserver().removeOnPreDrawListener(this);
scrollView.setScrollY(100);
return false;
}
});
Vous pouvez également utiliser scrollView.setScrollY(100)
dans Handler
, mais ce sera saccadé lors du défilement.
Après plusieurs heures de recherche sur Internet
ça marche pour moi:
ScrollView.post(new Runnable() {
@Override
public void run() {
//setting position here :
ScrollView.scrollTo(X, Y);
}
});
Aucune des réponses n'a fonctionné pour moi. Ma ScrollView
fait partie d'un LinearLayout
environnant. Je mets l'ajustement de la ScrollView
dans la méthode onDraw()
de cette LinearLayout
comme ceci:
@Override
protected void onDraw(Canvas canvas){
if(scrollAdjustTries > 2){
return;
}
scrollAdjustTries++;
mScrollView.scrollTo(0, mModel.scrollLine());
}
Très moche, mais travail.
Scrollview sw = (ScrollView) findViewById(R.id.scrollView);
sw.post(new Runnable() {
public void run() {
sw.smoothScrollTo(0, 5000);
}
});
Le problème est que le ScrollView ne connaît pas sa taille avant son agencement. Une solution consiste à enregistrer la position de défilement unil onLayout a été appelée, puis à définir la position de défilement.
Voici un exemple (kotlin):
class MyScrollView constructor(context: Context, attrs: AttributeSet) : ScrollView(context, attrs) {
private var hasStartPositionBeenSet = false
var startPosition = 0
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
super.onLayout(changed, l, t, r, b)
if(!hasStartPositionBeenSet) {
scrollTo(0, startPosition)
hasStartPositionBeenSet = true
}
}
}
class MyActivity: Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
/* ... */
findViewById<MyScrollView>(R.id.scrollView).startPosition = scrollPosition
}
}