为什么我的android活动总是开始滚动到底部?

每当我开始这个活动,它总是开始触底 – 滚动到底部。 我没有做任何奇怪的活动OnCreate(或任何地方的事情),我希望改变滚动位置。 我已经尝试将焦点设置到最上面的可调焦控件和scrollto方法,但是它们都没有工作。 另外,我的其他活动都没有这个问题。 这是布局:

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

当Android开始一个活动,一些控制需要重点。 当没有指定的控制要关注时,系统会select第一个需要关注的合格控制。 如果在LinearLayout中设置了以下属性 – android:focusableInTouchMode="true" LinearLayout将专注于开始,而您的活动将不会滚动到底部的EditText

您可以将其添加到活动/课程中,而不是污染布局中的项目:

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

这样,它不是你的scrollView中的一个元素获得焦点,它是你的scrollView作为一个容器获得第一个焦点,在这之后移动到子视图。

你可以试试这个代码:

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

[N:B] [参考链接] 1

你有没有尝试过使用fullScroll方法?http://developer.android.com/reference/android/widget/ScrollView.html#fullScroll(int)

 yourScrollView.fullScroll(ScrollView.FOCUS_UP); 

与devmiles.com所说的一样。

如果在LinearLayout中设置了以下属性 – android:focusableInTouchMode =“true”,则LinearLayout将专注于开始,而您的活动将不会滚动到底部的EditText。

如果在线性布局底部的视图上调用requestLayout(),它可能会从最顶层的视图中窃取焦点。 因此,只需在较低视图上调用requestLayout()之后,在线性布局的顶部视图中调用requestFocus()。

我不知道为什么,但你可以尝试

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

在你的onCreate手动滚动到你喜欢的地方。

对于Xamarin Android开发,如果你想做@Graeme解决scheme,那么:

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