Чому моя діяльність на Android завжди починає прокручуватися донизу?


91

Щоразу, коли я починаю цю діяльність, вона завжди починається знизу - прокручується до самого дна. Я не роблю нічого дивного в діяльності OnCreate (або де-небудь з цього приводу), що я очікував би змінити положення прокрутки. Я намагався встановити фокус на найфокусивніший елемент керування та метод прокрутки, але жоден з них не працює. Крім того, жодна з інших моїх дій не має цієї проблеми. Ось макет:

<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

1
використовуючи метод повного прокручування, як описано нижче, і метод прокрутки до, як також описано нижче. Я не обов'язково маю намір це виправити таким чином, але повинна бути причина, чому він починається так, і я волів би це виправити, виправивши це.
MrGibbage

Відповіді:


306

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


Не працює в моєму GridLayout. У мене є GridView посередині макета, і він кожного разу фокусується.
Ікбал

2
Я почухав голову цілий день і не міг зрозуміти, чому це відбувається лише в одній конкретній діяльності, і я досі не розумію, оскільки я не ввімкнув фокус на жодному виді. Але завдяки вам мені вдалося вирішити цю проблему. Було б чудово, якби хтось міг пролити світло на те, що може бути можливою причиною, оскільки в цій діяльності я нічого нового не роблю.
Шубраль

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 як контейнер, який отримує перший фокус, переміщуючись до дочірнього подання після цього.


Частково працює для мене, коли я намагаюся встановити висоту ListView на основі дочірніх елементів всередині ScrollView
Костянтин

Це допомогло! (хоча ті самі атрибути в xml не працювали ..)
Матан Дахан,

Працює як оберіг! Thx
Bogy

Це спрацювало для мене, але я додав цей рядок: scrollView.fullScroll (ScrollView.FOCUS_UP) Обидва окремо не працювали.
Хуан Джорелло,

3

Ви можете спробувати цей код:

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

[N: B] [посилання на посилання] 1


1
це хороший варіант, але він імітує ривок після відкриття, тому я думаю, що це не хороший досвід користувача
iBabur

2

Разом з тим, що сказав devmiles.com.

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

Якщо ви викликаєте requestLayout () у поданні внизу лінійного макета, це може викрасти фокус із самого верхнього виду. Отже, просто зателефонуйте requestFocus () до самого верхнього подання в лінійному макеті після виклику requestLayout () до нижнього подання.


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.


1

Додайте ці два рядки у свій ScrollView

 android:focusableInTouchMode="true"
 android:descendantFocusability="blocksDescendants"

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всередині a ScrollView. VideoViewЗавжди крали увагу, і є проблеми з ним . Рішення полягає у використанні TextureView. Сподіваюся, це комусь допомагає, це коштувало мені щонайменше години :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.