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


91

每当我开始此活动时,它总是从最低点开始-一直滚动到最低点。我没有在活动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>

您究竟如何尝试改变焦点?
devmiles.com 2012年

1
使用如下所述的fulscroll方法和如下所述的scrollto方法。我不必介意以这种方式修复它,但是一定有一个原因使它像这样开始,我宁愿通过更正来解决它。
MrGibbage 2012年

Answers:


306

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


无法在我的GridLayout中工作。我在布局的中间有一个GridView,它每次都会得到焦点。
伊克巴尔(Iqbal)

2
整整一整天都在抓挠我的头,找不到为什么它只是在一项特定的活动中发生的原因,我仍然不明白,因为我没有将注意力集中在任何视图上。但是,感谢您,我设法解决了这个问题。如果有人可以提出一些可能的原因,那是很好的,因为在新活动中我没有做任何新的事情。
Shubhral

2
重要说明:这是作为属性添加到的LinearLayout内部ScrollView,而不是滚动视图本身。
鲍里斯·斯特兰杰夫

@BorisStrandjev非常重要的说明。应该添加到答案中。顺便说一句,谢谢你:P
Coreggon

答案中确实提到了它。
devmiles.com

35

您可以将其添加到“活动/类”中,而不用污染布局中的项目:

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

这样,它不是您的scrollView中获得焦点的元素,而是您的scrollView作为一个容器,它成为了第一个焦点,之后又移到了子视图。


当我尝试根据ScrollView中的子级设置ListView高度时,部分为我工作
Konstantin Konopko

这有帮助!(尽管xml中的相同属性不起作用。)
Matan Dahan

奇迹般有效!Thx
Bogy

它确实对我有用,但是我添加了这一行:scrollView.fullScroll(ScrollView.FOCUS_UP)两者分别无效。
Juan Giorello

3

您可以尝试以下代码:

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

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


1
它是一个不错的选择,但是打开后它会模拟一个混蛋,所以我认为不是一个很好的用户体验
iBabur '16

2

以及devmiles.com所说的。

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

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


1

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

yourScrollView.fullScroll(ScrollView.FOCUS_UP);

1

对于Xamarin Android开发,如果要执行@Graeme解决方案,则:

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

1

只是使其无法集中在onCreate()

editText.setFocusable(false);

和使用

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

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

 ......
 };

并且下次将不会向下滚动到Edittext,而是创建片段或活动。



0

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

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

onCreate可以手动将其滚动到所需的位置。


0

scrollView.requestFocus(View.FOCUS_UP)当我希望可以看到顶视图时,解决了我的问题。为该方法指定方向参数requestFocus(int direction)是控制ScrollView位置的好方法。更多细节在这里


0

在我的情况下,我有一个VideoView内在一个ConstraintLayout内在ScrollView。该VideoView总是偷焦点,而它存在的问题。解决方法是使用TextureView。希望这对某人有帮助,至少花了我一个小时:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.