Как предотвратить прокрутку прокрутки до веб-просмотра после загрузки данных?


107

Итак, у меня есть интересная проблема. Несмотря на то, что я не прокручиваю свое представление вручную или программно, мой WebView автоматически прокручивается после загрузки данных внутри него.

У меня есть фрагмент в окне просмотра. Когда я впервые загружаю пейджер, он работает, как ожидалось, и все отображается. Но как только я «переворачиваю страницу», данные загружаются, и WebView всплывает вверху страницы, скрывая представления над ним, что нежелательно.

Кто-нибудь знает, как этого не допустить?

Мой макет выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/background" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/article_title"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginRight="10dp"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="2dp"
            android:text="Some Title"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:textColor="@color/article_title"
            android:textStyle="bold" />

        <LinearLayout
            android:id="@+id/LL_Seperator"
            android:layout_width="fill_parent"
            android:layout_height="1dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="5dp"
            android:layout_marginBottom="5dp"
            android:background="@color/text"
            android:orientation="horizontal" >
        </LinearLayout>

        <WebView
            android:id="@+id/article_content"
            android:layout_width="match_parent"
            android:layout_marginRight="10dp"
            android:layout_marginLeft="10dp"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/article_link"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="5dp"
            android:layout_marginTop="5dp"
            android:layout_marginRight="10dp"
            android:layout_marginLeft="10dp"
            android:text="View Full Article"
            android:textColor="@color/article_title"
            android:textStyle="bold" />
    </LinearLayout>

</ScrollView>

Я тоже ни на что не акцентирую внимание. По умолчанию он автоматически прокручивается до WebView после загрузки. Как мне предотвратить это?


зачем именно вам нужен ScrollView, поскольку WebView прокручивается?
Знать

Чтобы некоторые аспекты не попадали в веб-просмотр, а не отображали их как HTML. За скорость и качество.
Navarr

1
У mjp66 есть лучший ответ - может быть, вам стоит принять его ответ
AndrewS

Ответы:


43

Вы можете просто добавить это в свой LinearLayout: android: focusableInTouchMode = "true". Меня устраивает.

 <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:focusableInTouchMode="true"
    android:orientation="vertical" >

4
Работает без побочных эффектов!
Vaibhav Jani

267

У меня была та же проблема, после нескольких часов descendantFocusabilityпробования нескольких идей, что в итоге сработало для меня, это просто добавление атрибута в ScrollView, содержащего LinearLayout, со значением blocksDescendants. В твоем случае:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:descendantFocusability="blocksDescendants" >

С тех пор проблема больше не возникала.


3
Оказывает ли это негативное влияние на доступность этих элементов управления?
Cory Trese

34
Обратите внимание, что если есть какие-либо дочерние представления, такие как EditText, этот метод сделает их недоступными для редактирования.
djhworld

2
Этот вопрос / ответ не возникает при поиске слов ScrollView Webview autoscroll, а должен. Может этот комментарий поможет! У меня была такая же проблема с использованием WebViewFragment, и я не нашел этот вопрос даже после большого количества поисков, пока я не опубликовал свой собственный вопрос (теперь удален).
Колин М.

1
При работе над проектом Xamarin.Android возникли проблемы с автоматической прокруткой в ​​режиме прокрутки с несколькими представлениями сетки, асинхронно заполненными загруженными изображениями. Это решение сработало настолько идеально, что мне было трудно поверить в это с первого взгляда, и мне пришлось снова его протестировать.
YumeYume

1
Та же проблема возникает и с рекламой в RecyclerView. Ваше решение работает и в этом случае :)
Минас Мина

26

Вы должны создать новый класс, расширить ScrollView, а затем переопределить requestChildFocus:

public class MyScrollView extends ScrollView {

    @Override 
    public void requestChildFocus(View child, View focused) { 
        if (focused instanceof WebView ) 
           return;
        super.requestChildFocus(child, focused);
    }
}

Затем в вашем макете xml, используя:

<MyScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/background" >

Это подходит для меня. ScrollView больше не будет автоматически прокручиваться до WebView.


5
Также нужны конструкторы: public ExtendedScrollView(Context context) { super(context); } public ExtendedScrollView( Context context, AttributeSet attributeSet) { super(context, attributeSet); } public ExtendedScrollView( Context context, AttributeSet attributeSet, int defStyle) { super(context, attributeSet, defStyle); }
Erik B

5

Добавление этих строк в основной макет решает проблему.

android:descendantFocusability="blocksDescendants"

4

Как это:

<com.ya.test.view.MyScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:descendantFocusability="beforeDescendants"
        android:focusable="true"
        android:focusableInTouchMode="true" >

4

Наверное, есть люди, у которых такая же проблема, как и у меня, так что я помогу.

Я пытался поместить android: ПотомкуFocusability = "beforeDescendants" в свой основной ScrollView следующим образом:

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:descendantFocusability="beforeDescendants">
    /*my linearlayout or whatever to hold the views */

и это не сработало, поэтому мне пришлось сделать RelativeLayout родительским элементом ScrollView, а также разместить в родительском элементе android: DecndantFocusability = "beforeDescendants" .

Я решил это сделать следующим образом:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants">

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">
/*my linearlayout or whatever to hold the views */

-2

Мне пришлось использовать полностью определенное имя для MyScrollView, иначе я получил исключение inflate.

<com.mypackagename.MyScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/background" >
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.