데이터가로드 된 후 scrollview가 webview로 스크롤되는 것을 방지하는 방법은 무엇입니까?


107

그래서 저는 흥미로운 문제가 있습니다. 수동으로 또는 프로그래밍 방식으로 뷰를 스크롤하지 않는다는 사실에도 불구하고 내 WebView는 내부 데이터가로드 된 후 자동으로 스크롤됩니다.

뷰 페이저에 조각이 있습니다. 호출기를 처음로드하면 예상대로 작동하고 모든 것이 표시됩니다. 그러나 일단 "페이지를 넘기면"데이터가로드되고 WebView가 페이지 상단에 팝업되어 그 위에보기가 숨겨지는 것은 바람직하지 않습니다.

누구든지 이것을 방지하는 방법을 알고 있습니까?

내 레이아웃은 다음과 같습니다.

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

나는 또한 어떤 것에 초점을 맞추지 않고있다. 기본적으로 WebView가로드 된 후 자동으로 스크롤되는 것처럼 보입니다. 이것을 어떻게 방지합니까?


WebView가 스크롤 가능하기 때문에 ScrollView가 정확히 필요한 이유는 무엇입니까?
znat

일부 측면을 HTML로 렌더링하는 대신 webview에서 제외합니다. 속도와 품질을 위해.
Navarr

1
mjp66이 가장 좋은 답변을 제공합니다-그의 답변을 수락해야 할 수도 있습니다
AndrewS

답변:


43

LinearLayout에 간단히 추가 할 수 있습니다 : android : focusableInTouchMode = "true". 그것은 나를 위해 작동합니다.

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

4
부작용없이 작동합니다!
Vaibhav Jani

267

몇 시간 동안 몇 시간 동안 아이디어를 시도한 후 동일한 문제가 발생했습니다. 마지막으로 효과가 있었던 descendantFocusability것은 값이있는 ScrollView의 LinearLayout을 포함 하는 속성을 추가하는 것 blocksDescendants입니다. 귀하의 경우 :

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

그 이후로 문제가 다시 발생하지 않았습니다.


3
이것이 이러한 컨트롤의 접근성에 부정적인 영향을 미칩니 까?
Cory Trese 2014 년

34
EditText와 같은 자식 뷰가있는 경우이 메서드를 사용하면 편집 할 수 없게됩니다.
djhworld

2
이 질문 / 답변은 ScrollView Webview autoscroll이라는 단어를 검색 할 때 표시되지 않습니다. 이 의견이 도움이 될 것입니다! WebViewFragment를 사용하는 것과 동일한 문제가 있었고 내 질문을 게시하기 전까지는 많은 검색 후에도이 질문을 찾지 못했습니다 (현재 삭제됨).
Colin M.

1
Xamarin.Android 프로젝트에서 작업하는 동안 다운로드 된 이미지로 비동기 적으로 채워진 여러 gridview가있는 scrollview에서 자동 스크롤 문제가 발생했습니다. 이 솔루션은 완벽하게 작동하여 첫눈에 믿기 어려웠고 다시 테스트해야했습니다.
YumeYume

1
광고에서도 똑같은 문제가 발생 RecyclerView합니다. 이 경우에도 솔루션이 작동합니다. :)
Minas Mina

26

ScrollView를 확장 한 다음 requestChildFocus를 재정의하는 새 클래스를 만들어야합니다.

public class MyScrollView extends ScrollView {

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

그런 다음 XML 레이아웃에서 다음을 사용합니다.

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

그것은 나를 위해 작동합니다. ScrollView는 더 이상 WebView로 자동 스크롤되지 않습니다.


5
또한 필요한 생성자 : 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

기본 레이아웃에이 줄을 추가하면 문제가 해결됩니다.

android:descendantFocusability="blocksDescendants"

4

이렇게 :

<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

아마 저와 똑같은 문제를 가진 사람들이있을 것입니다. 그래서 제가 도와 드리겠습니다.

다음과 같이 기본 ScrollView 에 android : descendantFocusability = "beforeDescendants" 를 넣으려고했습니다 .

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

작동하지 않았기 때문에 RelativeLayout을 ScrollView의 부모로 만들고 android : descendantFocusability = "beforeDescendants" 를 부모에도 배치해야했습니다.

그래서 다음과 같이 해결했습니다.

<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

MyScrollView에 대해 정규화 된 이름을 사용해야했습니다. 그렇지 않으면 팽창 예외가 발생했습니다.

<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" >
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.