Почему моя активность андроида всегда начинает прокручиваться до дна? - PullRequest
84 голосов
/ 13 марта 2012

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

Ответы [ 11 ]

290 голосов
/ 13 марта 2012

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

31 голосов
/ 04 сентября 2015

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

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

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

3 голосов
/ 21 декабря 2014

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

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

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

2 голосов
/ 11 июля 2015

Вместе с тем, что сказал devmiles.com.

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

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

1 голос
/ 05 марта 2018

Просто сделайте это не фокусируемым в onCreate ()

editText.setFocusable(false);

и используйте

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

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

 ......
 };

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

1 голос
/ 02 марта 2017

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

// Set Focus to ScrollView
ScrollView scrollView = (ScrollView)FindViewById(Resource.Id.scrollView);
scrollView.FocusableInTouchMode = true;
scrollView.DescendantFocusability = Android.Views.DescendantFocusability.BeforeDescendants;
1 голос
/ 13 марта 2012

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

yourScrollView.fullScroll(ScrollView.FOCUS_UP);
0 голосов
/ 26 февраля 2019

В моем случае у меня было VideoView внутри ConstraintLayout внутри ScrollView.VideoView всегда крал фокус, а есть проблемы с ним .Решение заключается в использовании TextureView.Надеюсь, это кому-нибудь поможет, это стоило мне как минимум часа:)

0 голосов
/ 26 декабря 2018

Добавьте эти две строки в ваш ScrollView

 android:focusableInTouchMode="true"
 android:descendantFocusability="blocksDescendants"
0 голосов
/ 05 ноября 2018

scrollView.requestFocus(View.FOCUS_UP) решил мою проблему, когда я хотел видеть вид сверхуЗадание параметра направления для метода requestFocus(int direction) является хорошим способом управления положением ScrollView.Подробнее здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...