2010-06-20 21 views

Respuesta

166

scroll.fullScroll(View.FOCUS_DOWN) también debería funcionar.

+4

Eso no parece hacer nada, ¿alguna sugerencia? Lo probé onCreate y más tarde en el onClick de un botón. – RichardJohnn

+4

Ver respuestas debajo de – Oliv

+0

Parece que no funciona para cambiar la orientación. De lo contrario, funciona. – Prashant

256

se debe ejecutar el código dentro del scroll.post así:

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

Sí, debe publicarse en la cola ejecutable para que funcione. – josh527

+3

hay alguna manera sin perder elemento actual de enfoque, cuando hago esto pierdo el foco de mi elemento actual (diferente de scrollview) – rkmax

+2

Esto es necesario solo en los casos en que el diseño aún no se ha medido y trazado (por ejemplo, si ejecuta en onCreate). En casos como presionar un botón, no se necesita .post(). –

27

Me incremento para funcionar a la perfección.

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(); 
    } 

Nota

Esta respuesta es una solución para las versiones antiguas de Android realmente. Hoy el postDelayed no tiene más ese error y deberías usarlo.

+3

No más de dos, pero esto funciona bien en mi teléfono (LG JellyBean 4.1.2 Optimus G). – Youngjae

+7

¿Por qué no usar scrollView.postDelayed (ejecutable, 100)? –

+1

@MattWolfe en ese momento no funciona en algunas versiones anteriores de Android. Pero hoy esta respuesta está en desuso en absoluto. – ademar111190

3

Cuando la vista no está cargada, no puede desplazarse. Puede hacerlo 'más tarde' con una llamada de correo o de espera como se indica arriba, pero esto no es muy elegante.

Es mejor planear el desplazamiento y hacerlo en el próximo onLayout(). Código de ejemplo aquí:

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

2

Una cosa a considerar es lo que no va a establecer. Asegúrese de que los controles de su hijo, especialmente los controles EditText, no tengan configurada la propiedad RequestFocus. Esta puede ser una de las últimas propiedades interpretadas en el diseño y anulará la configuración de gravedad en sus padres (el diseño o ScrollView).

29

Lo que funcionó mejor para mí es

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

Intenté esto, pero el algoritmo aquí es incorrecto. Verifique mi respuesta en la parte inferior, por favor. – peacepassion

30

scroll.fullScroll(View.FOCUS_DOWN) dará lugar al cambio de enfoque. Eso traerá un comportamiento extraño cuando hay más de una vista enfocable, por ejemplo, dos EditText. Hay otra manera para esta pregunta.

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); 

Esto funciona bien.

+0

Me alegro de no tener que perder más tiempo en esto. Justo lo que necesitaba –

+4

Esto debería tener más votos positivos. Es la mejor respuesta de lejos. –

+1

Esta es la mejor respuesta que tenemos aquí. –

1

No era exactamente la respuesta a la pregunta, pero necesitaba desplazarme hacia abajo tan pronto como EditText obtuviera el enfoque. Sin embargo, la respuesta aceptada haría que ET también pierda el enfoque de inmediato (para el ScrollView supongo).

Mi solución fue la siguiente:

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

veces scrollView.post no funciona

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

tanto, si utiliza scrollView.postDelayed, que sin duda trabajar

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