2012-03-13 9 views
62

Cada vez que comienzo esta actividad, siempre comienza tocando fondo: se desplaza hasta abajo. No estoy haciendo nada extraño en la actividad OnCreate (o en cualquier otro lugar) que esperaba cambiar la posición de desplazamiento. Intenté establecer el foco en el control enfocable superior y el método scrollto, pero ninguno de ellos está funcionando. Además, ninguna de mis otras actividades tiene este problema. Aquí está la disposición:¿Por qué mi actividad de Android siempre comienza a desplazarse hacia abajo?

<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> 
+0

¿Cómo exactamente trataste de cambiar el enfoque? –

+1

utilizando el método fulscroll como se describe a continuación y el método scrollto como también se describe a continuación. No necesariamente me importa arreglarlo de esta manera, pero debe haber una razón por la cual está comenzando así y prefiero corregirlo corrigiéndolo. – MrGibbage

Respuesta

236

Cuando Android se inicia una actividad, un cierto control necesita enfocarse. Cuando no hay un control designado para enfocar, el sistema elige el primer control elegible que quiere enfocarse. Si configura la siguiente propiedad en su LinearLayout - android:focusableInTouchMode="true" su LinearLayout se enfocará en el inicio y su actividad no se desplazará al EditText en la parte inferior.

+0

No funciona en mi GridLayout. Tengo un GridView en el medio del diseño, y siempre se enfoca. – Iqbal

+0

¿por qué esto no funciona con 'focusable = true'? –

+0

Me rasqué la cabeza por un día completo y no pude encontrar por qué estaba sucediendo en una sola actividad en particular y todavía no entiendo, ya que no he activado el enfoque en ninguna vista. Pero gracias a ti, logré solucionar este problema. Sería genial si alguien pudiera arrojar algo de luz sobre cuál podría ser la posible razón, ya que no hay nada nuevo que esté haciendo en la nueva actividad. – Shubhral

0

No sé por qué pero se puede experimentar con

ScrollView sv = (ScrollView) findViewById(R.id.scroll); 
sv.scrollTo(0,0); 

en su onCreate para desplazarse manualmente a donde quiera que sea.

+0

Eso es exactamente lo que probé, pero no funcionó. – MrGibbage

1

Ha intentado uso fullScroll método http: //developer.android.com/reference/android/widget/ScrollView.html#fullScroll (int)

yourScrollView.fullScroll(ScrollView.FOCUS_UP); 
+1

Intenté eso. No funcionó. – MrGibbage

2

Puede probar este código:

scroller.post(new Runnable() { 
    public void run() { 
     scroller.fullScroll(ScrollView.FOCUS_DOWN); 
    } 
}); 

[N: B] [link referance] 1

+1

es una buena opción, pero simula un tirón después de la apertura, así que no es una buena experiencia de usuario. Creo que – iBabur

1

Junto con lo devmiles.com dicho.

Si se establece la siguiente propiedad en su LinearLayout - android: focusableInTouchMode = "true" su LinearLayout se centrará en el arranque y su actividad no se desplazará a EditarTexto en la parte inferior.

Si llama a requestLayout() en una vista en la parte inferior de su diseño lineal, puede robar el foco de su vista más alta. Así que simplemente llame a requestFocus() en la vista superior en el diseño lineal después de llamar a requestLayout() en una vista inferior.

22

En lugar de contaminar los elementos de su diseño, puede agregar esto en su actividad/Clase:

ScrollView scrollView = (ScrollView) findViewById(R.id.scrollView); 
    scrollView.setFocusableInTouchMode(true); 
    scrollView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS); 

De esta manera no es un elemento dentro de su conseguir el enfoque ScrollView, es su ScrollView como un contenedor que obtener el primer foco, pasar a la vista del niño después de esto.

+0

gracias fue la única que funcionó para mí – commonSenseCode

+0

Parcialmente funciona para mí cuando intento establecer la altura de ListView en niños dentro de ScrollView –

+0

¡ayudado! (Mientras que los mismos atributos en xml no funcionaron) –

0

Para el desarrollo Xamarin Android, si usted quiere hacer una solución @Graeme continuación:

// Set Focus to ScrollView 
ScrollView scrollView = (ScrollView)FindViewById(Resource.Id.scrollView); 
scrollView.FocusableInTouchMode = true; 
scrollView.DescendantFocusability = Android.Views.DescendantFocusability.BeforeDescendants; 
0

sólo lo hacen no enfocable en onCreate()

editText.setFocusable(false); 

y utilizar

editText.setOnClickListener(new ....){ 
...... 
    editText.setFocusable(true); 
    editText.setFocusableInTouchMode(true); 
    editText.requestFocus(); 

    showSoftKeyboard(); //Use InputMethodManager to open soft Keyboard 

...... 
}; 

y no se desplazará hacia abajo hasta Edittext la próxima vez, se creará un fragmento o actividad.

Cuestiones relacionadas