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

时间:2012-03-13 18:54:01

标签: android layout

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

12 个答案:

答案 0 :(得分:287)

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

答案 1 :(得分:29)

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

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

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

答案 2 :(得分:3)

您可以尝试以下代码:

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

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

答案 3 :(得分:2)

与devmiles.com所说的一样。

  

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

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

答案 4 :(得分:1)

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

yourScrollView.fullScroll(ScrollView.FOCUS_UP);

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

让它在onCreate()

中无法集中注意力
editText.setFocusable(false);

并使用

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

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

 ......
 };

下次不会向下滚动到Edittext,会创建一个片段或活动。

答案 7 :(得分:0)

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

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

onCreate中手动将其滚动到您喜欢的位置。

答案 8 :(得分:0)

scrollView.requestFocus(View.FOCUS_UP)解决了我希望看到顶视图时遇到的问题。 为方法requestFocus(int direction)指定方向参数是控制ScrollView位置的好方法。更多详细信息here

答案 9 :(得分:0)

在您的 ScrollView

中添加这两行
 android:focusableInTouchMode="true"
 android:descendantFocusability="blocksDescendants"

答案 10 :(得分:0)

在我的情况下,我在VideoView内的ConstraintLayout内有一个ScrollViewVideoView总是在抢夺焦点,而there are issues with it。解决方案是使用TextureView。希望这对某人有帮助,至少花了我一个小时:)

答案 11 :(得分:0)

使用 KotlinViewBinding,您可以将其添加到您的 fragmentactivity 中:

binding.mainScroll.isFocusableInTouchMode = true
binding.mainScroll.descendantFocusability = ViewGroup.FOCUS_BEFORE_DESCENDANTS