web-dev-qa-db-fra.com

Comment définir la position de départ d'un ScrollView?

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

11
RyanCW

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
18
Philipp Jahoda

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.

4
vijay

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);
    } 
});
1
Amir194

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.

0
Josef K.
Scrollview sw = (ScrollView) findViewById(R.id.scrollView);
sw.post(new Runnable() {
     public void run() {
           sw.smoothScrollTo(0, 5000);
     }
});
0
user7222571

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
    }
}
0
Selti99