2010-06-20 7 views
120

Je voudrais un ScrollView pour commencer tout en bas. Des méthodes?Android: ScrollView force vers le bas

+1

Je pense que c'est juste scrollTo(), oui je viens de vérifier les documents de développement pour ScrollView. Peasy facile. –

Répondre

166

scroll.fullScroll(View.FOCUS_DOWN) devrait également fonctionner.

+4

Cela ne semble rien faire, aucune suggestion? Je l'ai essayé sur onCreate et plus tard dans le onClick d'un bouton. – RichardJohnn

+4

Voir les réponses ci-dessous – Oliv

+0

Cela ne semble pas fonctionner pour changer d'orientation. Sinon, son fonctionnement. – Prashant

256

vous devez exécuter le code à l'intérieur du scroll.post comme ceci:

scroll.post(new Runnable() {    
    @Override 
    public void run() { 
      scroll.fullScroll(View.FOCUS_DOWN);    
    } 
}); 
+0

Oui, doit être posté à la file d'attente exécutable pour travailler. – josh527

+3

il y a un moyen sans perdre focus élément actuel, quand je fais cela je perds le focus de mon élément actuel (différent de scrollview) – rkmax

+2

Ceci est nécessaire uniquement dans les cas où la mise en page n'a pas encore été mesurée et mise en page (par exemple dans onCreate). Dans les cas comme en appuyant sur un bouton, .post() n'est pas nécessaire. –

27

J'incrémenter fonctionner parfaitement.

private void sendScroll(){ 
     final Handler handler = new Handler(); 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try {Thread.sleep(100);} catch (InterruptedException e) {} 
       handler.post(new Runnable() { 
        @Override 
        public void run() { 
         scrollView.fullScroll(View.FOCUS_DOWN); 
        } 
       }); 
      } 
     }).start(); 
    } 

Remarque

Cette réponse est une solution pour vraiment vieille version Android. Aujourd'hui, le postDelayed n'a plus ce bug et vous devriez l'utiliser.

+3

Pas au-dessus de deux, mais cela fonctionne bien dans mon téléphone (LG JellyBean 4.1.2 Optimus G). – Youngjae

+7

Pourquoi ne pas utiliser scrollView.postDelayed (runnable, 100)? –

+1

@ MattWolfe à l'époque ne fonctionne pas dans certaines anciennes versions d'Android. Mais aujourd'hui, cette réponse est déconseillée du tout. – ademar111190

3

Lorsque la vue n'est pas encore chargée, vous ne pouvez pas faire défiler. Vous pouvez le faire «plus tard» avec un appel de poste ou de sommeil comme ci-dessus, mais ce n'est pas très élégant.

Il est préférable de planifier le défilement et de le faire lors du prochain onLayout(). Exemple de code ici:

https://stackoverflow.com/a/10209457/1310343

2

Une chose à considérer est ce que ne pas régler. Assurez-vous que vos contrôles enfants, en particulier les contrôles EditText, n'ont pas la propriété RequestFocus définie. Cela peut être l'une des dernières propriétés interprétées sur la mise en page et elle va remplacer les paramètres de gravité sur ses parents (la mise en page ou ScrollView).

29

Ce qui fonctionne le mieux pour moi est

scroll_view.post(new Runnable() { 
    @Override 
    public void run() { 
     // This method works but animates the scrolling 
     // which looks weird on first load 
     // scroll_view.fullScroll(View.FOCUS_DOWN); 

     // This method works even better because there are no animations. 
     scroll_view.scrollTo(0, scroll_view.getBottom()); 
    } 
}); 
+0

J'ai essayé cela, mais l'algorithme ici est faux. Vérifiez ma réponse en bas s'il vous plaît. – peacepassion

30

scroll.fullScroll(View.FOCUS_DOWN) conduira au changement de mise au point. Cela entraînera un comportement étrange lorsqu'il existe plusieurs vues pouvant être mises en évidence, par exemple deux EditText. Il y a un autre moyen pour cette question.

View lastChild = scrollLayout.getChildAt(scrollLayout.getChildCount() - 1); 
    int bottom = lastChild.getBottom() + scrollLayout.getPaddingBottom(); 
    int sy = scrollLayout.getScrollY(); 
    int sh = scrollLayout.getHeight(); 
    int delta = bottom - (sy + sh); 

    scrollLayout.smoothScrollBy(0, delta); 

Cela fonctionne bien.

+0

Alors content de ne pas avoir perdu de temps à ce sujet. Juste ce dont j'avais besoin –

+4

Cela devrait avoir plus de votes upvotes. C'est la meilleure réponse de loin. –

+1

Voici la meilleure réponse ici. –

1

Pas exactement la réponse à la question, mais j'avais besoin de faire défiler vers le bas dès qu'un EditText a eu le focus. Cependant, la réponse acceptée ferait que l'ET perdrait tout de suite son attention (pour le ScrollView, je suppose).

Ma solution est la suivante:

emailEt.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     if(hasFocus){ 
      Toast.makeText(getActivity(), "got the focus", Toast.LENGTH_LONG).show(); 
      scrollView.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        scrollView.fullScroll(ScrollView.FOCUS_DOWN); 
       } 
      }, 200); 
     }else { 
      Toast.makeText(getActivity(), "lost the focus", Toast.LENGTH_LONG).show(); 
     } 
    } 
}); 
13

Parfois scrollView.post ne fonctionne pas

scrollView.post(new Runnable() { 
     @Override 
     public void run() { 
      scrollView.fullScroll(ScrollView.FOCUS_DOWN); 
     } 
    }); 

Donc, si vous utilisez scrollView.postDelayed, il va certainement travailler

scrollView.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      scrollView.fullScroll(ScrollView.FOCUS_DOWN); 
     } 
    },1000); 
Questions connexes