Почему моя андроидная активность всегда начинается прокруткой вниз?

Всякий раз, когда я начинаю эту деятельность, она всегда начинает снижаться - прокручивается до конца. Я не делаю ничего странного в деятельности 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>

Ответ 1

Когда Android начинает свою деятельность, некоторый элемент управления должен сфокусироваться. Когда нет назначенного управления для фокусировки, система выбирает первый подходящий элемент управления, который хочет фокусироваться. Если вы установили следующее свойство в LinearLayout - android:focusableInTouchMode="true", ваш LinearLayout будет сфокусирован на запуске, и ваша активность не будет прокручиваться до EditText внизу.

Ответ 2

Вместо загрязняющих элементов в вашем макете вы можете добавить это в свой Activity/Class:

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

Таким образом, это не элемент внутри вашего scrollView, получающего фокус, это ваш scrollView как контейнер, который получает первый фокус, после этого перемещаясь по дочернему виду.

Ответ 3

Вы можете попробовать этот код:

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

[N: B] [ссылка ссылки] 1

Ответ 4

Вы пробовали использовать метод fullScroll? http://developer.android.com/reference/android/widget/ScrollView.html#fullScroll (int)

yourScrollView.fullScroll(ScrollView.FOCUS_UP);

Ответ 5

Наряду с тем, что сказал devmiles.com.

Если вы установили следующее свойство в LinearLayout - android: focusableInTouchMode = "true", ваш LinearLayout будет сфокусирован на запуске, и ваша активность не будет прокручиваться до EditText в нижней части.

Если вы вызываете requestLayout() в представлении внизу своей линейной компоновки, он может украсть фокус с вашего максимального вида. Поэтому просто вызовите функцию requestFocus() в верхней части экрана в линейном макете после вызова функции requestLayout() в нижнем виде.

Ответ 6

Я не знаю, почему, но вы можете экспериментировать с

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

в вашем onCreate, чтобы вручную прокрутить его туда, где вам нравится.

Ответ 7

Для разработки Xamarin Android, если вы хотите сделать решение @Graeme, выполните следующие действия:

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