Come impedire a una visualizzazione a scorrimento di scorrere in una visualizzazione Web dopo il caricamento dei dati?


107

Quindi ho un problema affascinante. Nonostante il fatto che non sto scorrendo manualmente o programmaticamente la mia vista, il mio WebView viene automaticamente spostato dopo il caricamento dei dati al suo interno.

Ho un frammento in un viewpager. Quando carico per la prima volta il cercapersone, funziona come previsto e viene visualizzato tutto. Ma una volta che "capovolgo la pagina" i dati vengono caricati e il WebView si apre all'inizio della pagina, nascondendo le visualizzazioni sopra di esso, il che è indesiderabile.

Qualcuno sa come evitare che ciò accada?

Il mio layout è simile a questo:

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

Inoltre non mi concentro su nulla. Per impostazione predefinita, sembra scorrere automaticamente al WebView dopo che è stato caricato. Come posso impedirlo?


perché esattamente hai bisogno di ScrollView poiché una WebView è scorrevole?
znat

Per mantenere alcuni aspetti fuori dalla visualizzazione web invece di renderli come HTML. Per velocità e qualità.
Navarr

1
mjp66 ha la risposta migliore - forse dovresti accettare la sua risposta
AndrewS

Risposte:


43

Puoi semplicemente aggiungerlo al tuo LinearLayout: android: focusableInTouchMode = "true". Per me funziona.

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

4
Funziona senza effetti collaterali!
Vaibhav Jani

267

Ho avuto lo stesso problema, dopo ore descendantFocusabilitypassate a provare diverse idee, quello che alla fine ha funzionato per me è stato semplicemente aggiungere l' attributo a ScrollView contenente LinearLayout, con il valore blocksDescendants. Nel tuo caso:

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

Da allora il problema non si è ripresentato.


3
Ciò ha un impatto negativo sull'accessibilità di questi controlli?
Cory Trese

34
Nota che se ci sono visualizzazioni figlio come EditText, questo metodo renderà non modificabili.
djhworld

2
Questa domanda / risposta non viene visualizzata quando si cercano le parole ScrollView Webview autoscroll e dovrebbe. Forse questo commento aiuterà! Ho avuto lo stesso problema con l'utilizzo di un WebViewFragment e non ho trovato questa domanda anche dopo molte ricerche fino a quando non ho pubblicato la mia domanda (ora eliminata).
Colin M.

1
Lavorando su un progetto Xamarin.Android, si sono verificati problemi di scorrimento automatico in una visualizzazione a scorrimento con più visualizzazioni griglia, popolata in modo asincrono con immagini scaricate. Questa soluzione ha funzionato così perfettamente che ho avuto difficoltà a crederci a prima vista e ho dovuto testarla di nuovo.
YumeYume

1
Lo stesso problema si verifica anche per gli annunci in a RecyclerView. La tua soluzione funziona anche in questo caso :)
Minas Mina

26

Dovresti creare una nuova classe estendere ScrollView, quindi Override requestChildFocus:

public class MyScrollView extends ScrollView {

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

Quindi nel tuo layout xml, usando:

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

Per me va bene. Il ScrollView non scorrerà più automaticamente al WebView.


5
Servono anche i costruttori: 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

L'aggiunta di queste righe nel layout principale risolve il problema

android:descendantFocusability="blocksDescendants"

4

Come questo:

<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

Probabilmente ci sono persone che hanno lo stesso problema che stavo avendo io, quindi ti aiuterò.

Stavo cercando di mettere android: descendantFocusability = "beforeDescendants" nel mio ScrollView principale come segue:

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

e non funzionava, quindi ho dovuto creare un RelativeLayout il genitore di ScrollView e posizionare android: descendantFocusability = "beforeDescendants" anche nel genitore.

Quindi l'ho risolto facendo quanto segue:

<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

Ho dovuto usare il nome completo per MyScrollView, altrimenti ho ottenuto un'eccezione di gonfiaggio.

<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" >
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.