wake-up-neo.com

Wie kann verhindert werden, dass ein Bildlauf nach dem Laden von Daten zu einem Webbild-Bildlauf scrollt?

Ich habe also ein faszinierendes Problem. Obwohl ich meine Ansicht nicht manuell oder programmgesteuert scrolle, wird mein WebView automatisch nach dem Laden der darin enthaltenen Daten gescrollt.

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

Weiß jemand, wie man das verhindern kann?

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 auf nichts. Standardmäßig scheint es nach dem Laden automatisch zum WebView zu scrollen. Wie kann ich das verhindern?

102
Navarr

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" >
38
Peter Nguyen

Ich hatte das gleiche Problem, nachdem ich mehrere Stunden versucht hatte, verschiedene Ideen auszuprobieren. Was schließlich für mich funktionierte, war das einfache Hinzufügen des descendantFocusability-Attributs zu ScrollView, das LinearLayout enthielt, mit dem Wert blockDescendants. In Ihrem Fall:

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

Habe das Problem seitdem nicht wieder gehabt :)

264
mjp66

Erstellen Sie eine neue Klasse, erweitern Sie ScrollView und überschreiben Sie requestChildFocus:

public class MyScrollView extends ScrollView {

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

Dann in Ihrem XML-Layout mit:

<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-Ansicht wird nicht mehr automatisch zur WebView-Ansicht verschoben.

25
user1417127

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

Android:descendantFocusability="blocksDescendants"
5
arun-r

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
YaC King

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

Ich habe versucht, Android: descendantFocusability = "beforeDescendants" in meinen Hauptbildschirm wie folgt 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 hat nicht funktioniert, also musste ich ein relativesLayout als übergeordnetes Element der ScrollView erstellen und das Android: descendantFocusability = "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 */
3
Firecat

Ich musste den vollständig qualifizierten Namen für MyScrollView verwenden, andernfalls bekam ich eine aufgeblasene 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" >
0
Cathal Coffey