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

288
17

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

спросил(а) 2012-03-13T21:54:00+04:00 8 лет, 4 месяца назад
1
Решение
583

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

ответил(а) 2012-03-13T22:24:00+04:00 8 лет, 4 месяца назад
186

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


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

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

ответил(а) 2015-09-04T12:28:00+03:00 4 года, 11 месяцев назад
68

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


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

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

ответил(а) 2014-12-21T16:36:00+03:00 5 лет, 7 месяцев назад
55

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


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



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

ответил(а) 2015-07-11T05:00:00+03:00 5 лет назад
56

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


yourScrollView.fullScroll(ScrollView.FOCUS_UP);

ответил(а) 2012-03-13T22:01:00+04:00 8 лет, 4 месяца назад
39

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


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

ответил(а) 2017-03-02T00:29:00+03:00 3 года, 5 месяцев назад
40

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


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

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

ответил(а) 2012-03-13T21:59:00+04:00 8 лет, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема