Wie kann verhindert werden, dass eine Bildlaufansicht nach dem Laden von Daten zu einer Webansicht blättert?


107

Ich habe also ein faszinierendes Problem. Trotz der Tatsache, dass ich meine Ansicht nicht manuell oder programmgesteuert scrolle, wird meine WebView automatisch gescrollt, nachdem die darin enthaltenen Daten geladen wurden.

Ich habe ein Fragment in einem Viewpager. Wenn ich den Pager zum ersten Mal lade, funktioniert er wie erwartet und alles wird angezeigt. Sobald ich die Seite "umblättere", werden die Daten geladen und das WebView wird oben auf der Seite angezeigt, wodurch die Ansichten darüber ausgeblendet werden, was unerwünscht ist.

Weiß jemand, wie man das verhindert?

Mein Layout sieht so aus:

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

Ich konzentriere mich auch nicht auf irgendetwas. Standardmäßig scheint es nach dem Laden automatisch zum WebView zu scrollen. Wie verhindere ich das?


Warum genau benötigen Sie ScrollView, da WebView scrollbar ist?
Znat

Einige Aspekte aus der Webansicht heraushalten, anstatt sie als HTML zu rendern. Für Geschwindigkeit und Qualität.
Navarr

1
mjp66 hat die beste Antwort - vielleicht sollten Sie seine Antwort akzeptieren
AndrewS

Antworten:


43

Sie können dies einfach zu Ihrem LinearLayout hinzufügen: android: focusableInTouchMode = "true". Für mich geht das.

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

4
Funktioniert ohne Nebenwirkungen!
Vaibhav Jani

267

Nachdem ich stundenlang mehrere Ideen ausprobiert hatte, hatte ich das gleiche Problem. Schließlich funktionierte es für mich, einfach das descendantFocusabilityAttribut mit dem Wert zu den ScrollViews hinzuzufügen , die LinearLayout enthalten blocksDescendants. In deinem Fall:

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

Das Problem ist seitdem nicht mehr aufgetreten.


3
Hat dies negative Auswirkungen auf die Zugänglichkeit dieser Kontrollen?
Cory Trese

34
Beachten Sie, dass untergeordnete Ansichten wie EditText durch diese Methode nicht mehr bearbeitet werden können.
Djhworld

2
Diese Frage / Antwort wird nicht angezeigt, wenn Sie nach den Wörtern ScrollView Webview Autoscroll suchen, und sollte es auch sein. Vielleicht hilft dieser Kommentar! Hatte das gleiche Problem mit der Verwendung eines WebViewFragments und fand diese Frage auch nach langem Suchen nicht, bis ich meine eigene Frage stellte (jetzt gelöscht).
Colin M.

1
Bei der Arbeit an einem Xamarin.Android-Projekt gab es Probleme mit dem automatischen Bildlauf in einer Bildlaufansicht mit mehreren Rasteransichten, die asynchron mit heruntergeladenen Bildern gefüllt waren. Diese Lösung funktionierte so perfekt, dass ich Schwierigkeiten hatte, sie auf den ersten Blick zu glauben, und sie erneut testen musste.
YumeYume

1
Das gleiche Problem tritt auch bei Anzeigen in a RecyclerViewauf. Ihre Lösung funktioniert auch in diesem Fall :)
Minas Mina

26

Sie sollten eine neue Klasse erstellen, ScrollView erweitern und dann requestChildFocus überschreiben:

public class MyScrollView extends ScrollView {

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

Verwenden Sie dann in Ihrem XML-Layout Folgendes:

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

Das ist für mich in Ordnung. Die ScrollView scrollt nicht mehr automatisch zur WebView.


5
Auch benötigte Konstruktoren: 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

Das Hinzufügen dieser Zeile im Hauptlayout löst das Problem

android:descendantFocusability="blocksDescendants"

4

So was:

<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

Wahrscheinlich gibt es Leute, die das gleiche Problem haben, das ich hatte, also werde ich helfen.

Ich habe versucht, android: descantFocusability = "beforeDescendants" wie folgt in meine ScrollView einzufügen:

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

und es funktionierte nicht, also musste ich ein RelativeLayout zum übergeordneten Element der ScrollView erstellen und das android: descantFocusability = "beforeDescendants" auch im übergeordneten Element platzieren.

Also habe ich es folgendermaßen gelöst:

<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

Ich musste den vollständig qualifizierten Namen für MyScrollView verwenden, sonst bekam ich eine Inflate-Ausnahme.

<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" >
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.