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?

Navarr
quelle
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" >
Peter Nguyen
quelle
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.

mjp66
quelle
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.

user1417127
quelle
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"
arun-r
quelle
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" >
YaC König
quelle
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 */
James
quelle
-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" >
Cathal Coffey
quelle