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

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" >

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

mjp66
источник
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.

user1417127
источник
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"
Arun-R
источник
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" >
YaC King
источник
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" >
Катал Коффи
источник