web-dev-qa-db-ja.com

データがロードされた後にスクロールビューがウェブビューにスクロールするのを防ぐ方法は?

だから私には魅力的な問題があります。ビューを手動またはプログラムでスクロールしていませんが、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に自動的にスクロールするようです。これを防ぐにはどうすればよいですか?

105
Navarr

これをLinearLayoutに追加するだけです:Android:focusableInTouchMode = "true"。わたしにはできる。

 <LinearLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:focusableInTouchMode="true"
    Android:orientation="vertical" >
39
Peter Nguyen

私は同じ問題を抱えていました。いくつかのアイデアを何時間も試した後、最終的に働いたのは、descendantFocusability属性を持つLinearLayoutを含むScrollViewにblockDescendants属性を追加するだけでした。あなたの場合:

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

以来、問題は再発していません:)

264
mjp66

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に自動スクロールしなくなります。

26
user1417127

メインレイアウトにこれらの行を追加すると、問題が解決します

Android:descendantFocusability="blocksDescendants"
5
arun-r

このような:

<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

おそらく私が抱えていたのと同じ問題を抱えている人がいるので、私は手伝います。

私はAndroid:descendantFocusability = "beforeDescendants"をメインのScrollViewに次のように配置しようとしていました。

<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 */
4
Firecat

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" >
0
Cathal Coffey