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

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

У меня есть фрагмент в viewpager. Когда я впервые загружаю пейджер, он работает, как и ожидалось, и все отображается. Но как только я «переворачиваю страницу», данные загружаются, и 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 после его загрузки. Как предотвратить это?


person Navarr    schedule 23.03.2012    source источник
comment
почему именно вам нужен ScrollView, поскольку WebView можно прокручивать?   -  person znat    schedule 07.04.2012
comment
Чтобы некоторые аспекты не отображались в веб-просмотре, а не отображались в виде HTML. За скорость и качество.   -  person Navarr    schedule 08.04.2012
comment
У mjp66 лучший ответ - может быть, вам стоит принять его ответ   -  person AndrewS    schedule 04.11.2013


Ответы (7)


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

 <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:focusableInTouchMode="true"
    android:orientation="vertical" >
person Peter Nguyen    schedule 02.10.2013
comment
Работает без побочных эффектов! - person Vaibhav Jani; 27.07.2016

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

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

С тех пор проблема не повторялась.

person mjp66    schedule 31.01.2013
comment
Оказывает ли это негативное влияние на доступность этих элементов управления? - person Cory Trese; 23.03.2014
comment
Обратите внимание, что если есть какие-либо дочерние представления, такие как EditText, этот метод сделает их недоступными для редактирования. - person djhworld; 25.03.2014
comment
Этот вопрос/ответ не появляется при поиске слов ScrollView Webview autoscroll, хотя должен. Может этот комментарий поможет! Была такая же проблема с использованием WebViewFragment, и я не нашел этот вопрос даже после долгих поисков, пока не опубликовал свой собственный вопрос (теперь удаленный). - person Colin M.; 29.05.2014
comment
Хороший ответ. Было бы хорошо, если бы вы могли объяснить приоритеты просмотра для фокусировки в Android. - person VVB; 17.02.2016
comment
Работая над проектом Xamarin.Android, возникла проблема с автоматической прокруткой в ​​прокрутке с несколькими представлениями сетки, асинхронно заполненными загруженными изображениями. Это решение сработало настолько идеально, что мне было трудно поверить в него с первого взгляда, и мне пришлось проверить его снова. - person YumeYume; 19.08.2016
comment
Такая же проблема возникает и с рекламой в RecyclerView. Ваше решение работает и в этом случае :) - person Minas Mina; 22.02.2017
comment
Я думаю, это потому, что когда onLayout() вызывается в любом ScrollView, он проверяет, есть ли фокус на каком-либо дочернем элементе. Если они это сделают, ScrollView автоматически прокрутит до этого дочернего элемента. Когда в ScrollView загружаются новые вещи, я считаю, что они каким-то образом берут на себя фокус, и это вызывает проблему. - person Justin Liu; 23.02.2017
comment
У меня было представление ресайклера (A), внутри представления ресайклера (B), и страница прыгала, когда данные помещались в представление ресайклера (B). Я попытался переопределить laymanager для представления ресайклера (A) и отключить вертикальную прокрутку, и это было решением, но мне нужно было включить его после того, как данные были введены в представление ресайклера (B), но у меня это заработало. Грязное исправление. Это исправление избавило меня от многих хлопот. Ваше здоровье - person Killesk; 27.06.2017

Вы должны создать новый класс расширения 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.

person user1417127    schedule 02.07.2012
comment
Также нужны конструкторы: 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); } - person Erik B; 29.10.2012

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

android:descendantFocusability="blocksDescendants"
person arun-r    schedule 04.06.2014

Нравится:

<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" >
person YaC King    schedule 21.05.2015

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

Я пытался поместить android:descendantFocusability="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:descendantFocusability="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 */
person James    schedule 23.12.2016

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

<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" >
person Cathal Coffey    schedule 30.12.2012