Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does my android activity always start scrolled to the bottom?

Tags:

android

layout

Whenever I start this activity, it always starts bottomed out--scrolled all the way to the bottom. I am not doing anything weird in the activity OnCreate (or anywhere for that matter) that I would expect to change the scroll position. I have tried setting focus to the topmost focusable control, and the scrollto method, but neither of them are working. Besides, none of my other activities has this problem. Here's the layout:

<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> 
like image 275
MrGibbage Avatar asked Mar 13 '12 18:03

MrGibbage


2 Answers

When Android starts an activity, some control needs to take focus. When there's no designated control to take focus, the system chooses the first eligible control that wants focus. If you set the following property in your LinearLayout - android:focusableInTouchMode="true" your LinearLayout will be focused on start and your activity won't scroll to EditText in the bottom.

like image 128
devmiles.com Avatar answered Sep 18 '22 06:09

devmiles.com


Instead of polluting items in your layout, you can add this into your Activity/Class:

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

This way it isn't an element within your scrollView getting focus, it's your scrollView as a container which get's the first focus, moving onto the child view's after this.

like image 32
Graeme Avatar answered Sep 19 '22 06:09

Graeme