Làm thế nào để ngăn chế độ xem cuộn cuộn sang chế độ xem web sau khi dữ liệu được tải?


107

Vì vậy, tôi có một vấn đề hấp dẫn. Mặc dù thực tế là tôi không cuộn chế độ xem của mình theo cách thủ công hoặc theo chương trình, nhưng WebView của tôi đang được tự động cuộn đến sau khi dữ liệu bên trong nó tải.

Tôi có một mảnh vỡ trong một máy ngắm. Khi tôi tải máy nhắn tin lần đầu tiên, nó hoạt động như mong đợi và mọi thứ đều được hiển thị. Nhưng khi tôi "lật trang", dữ liệu sẽ tải và WebView bật lên đầu trang, ẩn các chế độ xem phía trên nó, điều này không mong muốn.

Có ai biết làm thế nào để ngăn chặn điều này xảy ra?

Bố cục của tôi trông giống như vậy:

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

Tôi cũng không tập trung vào bất cứ thứ gì. Theo mặc định, nó dường như tự động cuộn đến WebView sau khi tải xong. Làm cách nào để ngăn chặn điều này?


chính xác tại sao bạn cần ScrollView vì WebView có thể cuộn được?
znat

Để loại bỏ một số khía cạnh của chế độ xem web thay vì hiển thị chúng dưới dạng HTML. Đối với tốc độ và chất lượng.
Navarr

1
mjp66 có câu trả lời tốt nhất - có thể bạn nên chấp nhận câu trả lời của ông
Andrews

Câu trả lời:


43

Bạn chỉ cần thêm nó vào LinearLayout: android: focusableInTouchMode = "true". Nó làm việc cho tôi.

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

4
Hoạt động mà không có tác dụng phụ!
Vaibhav Jani

267

Tôi cũng gặp phải vấn đề tương tự, sau nhiều giờ thử nhiều ý tưởng, cuối cùng điều làm được với tôi chỉ đơn giản là thêm descendantFocusabilitythuộc tính vào ScrollView có chứa LinearLayout, với giá trị blocksDescendants. Trong trường hợp của bạn:

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

Đã không có vấn đề tái xuất hiện kể từ đó.


3
Điều này có bất kỳ tác động tiêu cực nào đến khả năng truy cập của các kiểm soát này không?
Cory Trese

34
Lưu ý rằng nếu có bất kỳ chế độ xem con nào như EditText, phương pháp này sẽ khiến chúng trở nên không thể chỉnh sửa.
djhworld

2
Câu hỏi / câu trả lời này không xuất hiện khi bạn tìm kiếm các từ tự động cuộn ScrollView Webview và đúng như vậy. Có lẽ bình luận này sẽ giúp ích! Gặp vấn đề tương tự khi sử dụng WebViewFragment và không tìm thấy câu hỏi này ngay cả sau nhiều lần tìm kiếm cho đến khi tôi đăng câu hỏi của riêng mình (hiện đã bị xóa).
Colin M.

1
Làm việc trên một dự án Xamarin.Android, đã gặp sự cố tự động cuộn trong một chế độ xem cuộn với nhiều chế độ xem lưới, được điền không đồng bộ với các hình ảnh đã tải xuống. Giải pháp này hoạt động hoàn hảo đến nỗi tôi đã khó tin ngay từ cái nhìn đầu tiên và phải thử nghiệm lại.
YumeYume

1
Vấn đề tương tự cũng xảy ra đối với Quảng cáo RecyclerView. Giải pháp của bạn cũng hoạt động trong trường hợp đó :)
Minas Mina

26

Bạn nên tạo lớp mới mở rộng ScrollView, sau đó Ghi đè requestChildFocus:

public class MyScrollView extends ScrollView {

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

Sau đó, trong bố cục xml của bạn, sử dụng:

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

Nó ổn với tôi. ScrollView sẽ không tự động cuộn đến WebView nữa.


5
Các hàm tạo cũng cần thiết: 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

Thêm dòng này vào bố cục chính sẽ giải quyết được vấn đề

android:descendantFocusability="blocksDescendants"

4

Như thế này:

<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

Có lẽ có những người có cùng vấn đề với tôi, vì vậy tôi sẽ giúp đỡ.

Tôi đang cố gắng đặt android :cendantFocusability = "beforeDescendants" trong ScrollView chính của mình như sau:

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

và nó không hoạt động, vì vậy tôi phải đặt một RelativeLayout làm cha mẹ của ScrollView và đặt android :cendantFocusability = "beforeDescendants" trong cha mẹ.

Vì vậy, tôi đã giải quyết nó bằng cách sau:

<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

Tôi phải sử dụng tên đầy đủ đủ điều kiện cho MyScrollView, nếu không, tôi có một ngoại lệ tăng cao.

<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" >
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.