Bagaimana cara mencegah scrollview dari bergulir ke tampilan web setelah data dimuat?

107

Jadi saya punya masalah yang menarik. Terlepas dari kenyataan bahwa saya tidak menggulir tampilan saya secara manual atau terprogram, Tampilan Web saya secara otomatis digulir ke setelah data di dalamnya dimuat.

Saya punya fragmen di viewpager. Ketika saya pertama kali memuat pager, itu berfungsi seperti yang diharapkan dan semuanya ditampilkan. Tapi begitu saya "membalik halaman", data akan dimuat dan WebView muncul di bagian atas halaman, menyembunyikan tampilan di atasnya, yang tidak diinginkan.

Adakah yang tahu bagaimana mencegah hal ini terjadi?

Tata letak saya terlihat seperti ini:

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

Saya juga tidak fokus pada apapun. Secara default, tampaknya secara otomatis menggulir ke WebView setelah dimuat. Bagaimana cara mencegahnya?

Navarr
sumber
mengapa tepatnya Anda membutuhkan ScrollView karena WebView dapat digulir?
znat
Untuk menjauhkan beberapa aspek dari tampilan web alih-alih menampilkannya sebagai HTML. Untuk kecepatan dan kualitas.
Navarr
1
mjp66 memiliki jawaban terbaik - mungkin Anda harus menerima jawabannya
AndrewS

Jawaban:

43

Anda cukup menambahkan ini ke LinearLayout: android: focusableInTouchMode = "true". Ini bekerja untuk saya.

 <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:focusableInTouchMode="true"
    android:orientation="vertical" >
Peter Nguyen
sumber
4
Bekerja tanpa efek samping!
Vaibhav Jani
267

Saya memiliki masalah yang sama, setelah berjam-jam mencoba beberapa ide, yang akhirnya berhasil bagi saya hanyalah menambahkan descendantFocusabilityatribut ke ScrollView yang berisi LinearLayout, dengan nilainya blocksDescendants. Dalam kasus Anda:

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

Belum pernah masalah terulang kembali sejak saat itu.

mjp66.dll
sumber
3
Apakah ini berdampak negatif pada aksesibilitas kontrol ini?
Cory Trese
34
Perhatikan bahwa jika ada tampilan anak seperti EditText, metode ini akan menyebabkannya menjadi tidak dapat diedit.
djhworld
2
Tanya jawab ini tidak muncul ketika Anda mencari kata-kata Autoscroll ScrollView Webview, dan seharusnya begitu. Mungkin komentar ini bisa membantu! Memiliki masalah yang sama dengan menggunakan WebViewFragment dan tidak menemukan pertanyaan ini bahkan setelah banyak pencarian sampai saya memposting pertanyaan saya sendiri (sekarang dihapus).
Colin M.
1
Bekerja pada proyek Xamarin.Android, mengalami masalah gulir otomatis dalam tampilan gulir dengan beberapa tampilan kisi, diisi secara asinkron dengan gambar yang diunduh. Solusi ini bekerja dengan sangat sempurna sehingga saya kesulitan mempercayainya pada pandangan pertama dan harus mengujinya lagi.
YumeYume
1
Masalah yang sama terjadi pada Iklan di RecyclerViewjuga. Solusi Anda berfungsi dalam kasus itu juga :)
Minas Mina
26

Anda harus membuat kelas baru, memperpanjang ScrollView, lalu Ganti requestChildFocus:

public class MyScrollView extends ScrollView {

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

Kemudian di tata letak xml Anda, menggunakan:

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

Itu berhasil untuk saya. ScrollView tidak akan menggulir otomatis ke WebView lagi.

pengguna1417127
sumber
5
Juga membutuhkan konstruktor: 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

Menambahkan baris ini di tata letak utama memecahkan masalah

android:descendantFocusability="blocksDescendants"
arun-r
sumber
4

Seperti ini:

<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
sumber
4

Mungkin ada orang yang memiliki masalah yang sama dengan saya, jadi saya akan membantu.

Saya mencoba untuk menempatkan android: descendantFocusability = "beforeDescendants" di ScrollView utama saya sebagai berikut:

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

dan itu tidak berfungsi, jadi saya harus menjadikan RelativeLayout sebagai induk ScrollView, dan menempatkan android: descendantFocusability = "beforeDescendants" di induk juga.

Jadi saya menyelesaikannya dengan melakukan hal berikut:

<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
sumber
-2

Saya harus menggunakan nama yang sepenuhnya memenuhi syarat untuk MyScrollView, jika tidak, saya mendapat pengecualian penggelembungan.

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