2012-11-06 18 views
23

私のアプリでは、一部の線画、テキストビュー、WebView、その他の線形レイアウトなどが含まれるScrollViewがあります。問題はWebViewがスクロールしないことです。 ScrollはScrollViewだけをリスンします。 提案がありますか? - ヘッダ ScrollView内のAndroid WebViewスクロール表示のみ

  • のWebView - メインレイアウト
  • 第二のTextView - フッタ

    1. 初のTextView:あなたは3つのレイアウトに変更することができます


      <ScrollView > 
          <TextView /> 
          <WebView />    <-- this does not scroll 
          <TextView /> 
      </ScrollView > 
      

    答えて

    63

    ここに解決策があります。オンラインで見つかりました。私はWebViewをサブクラス化し、私はrequestDisallowInterceptTouchEvent(true);メソッドを使って、私のwebviewがスクロールイベントを処理できるようにしています。

    TouchyWebView.java

    package com.mypackage.common.custom.android.widgets 
    
    public class TouchyWebView extends WebView { 
    
        public TouchyWebView(Context context) { 
         super(context); 
        } 
    
        public TouchyWebView(Context context, AttributeSet attrs) { 
         super(context, attrs); 
        } 
    
        public TouchyWebView(Context context, AttributeSet attrs, int defStyle) { 
         super(context, attrs, defStyle); 
        } 
    
        @Override 
        public boolean onTouchEvent(MotionEvent event){ 
         requestDisallowInterceptTouchEvent(true); 
         return super.onTouchEvent(event); 
        }   
    } 
    

    そしてlayout.xml

    <com.mypackage.common.custom.android.widgets.TouchyWebView 
           android:id="@+id/description_web" 
           android:layout_width="match_parent" 
           android:layout_height="wrap_content" 
           /> 
    
    +0

    +1 ...それは動作します。 –

    +2

    これは 'WebView'の外側に触れると壊れます。 – theblang

    +0

    @mattblangもう一度webviewに触れてからもう一度スクロールしてみてください。 – Panos

    -9
    WebView web = (WebView) findViewById(R.id.webView); 
    View header = getLayoutInflater().inflate(R.layout.header_layout, null); 
    View footer = getLayoutInflater().inflate(R.layout.foorer_layout, null); 
    web.addHeaderView(headerComment); 
    web.addFooterView(footerComment); 
    
    +0

    これらの項目が画面に収まらないため、スクロール表示があります。私の例では、上記のtextviewとtextviewの1つだけを追加しました。しかし、実際には、他の相対的なレイアウトがあります。そこにはイメージビューがあり、webviewは中間のどこか他のものです...だから私はすべてを見ることができるようにスクロールビューが必要です。 – Panos

    +0

    この[ソリューション](http://stackoverflow.com/questions/9718245/webview-in-scrollview)を試してみてください –

    +4

    のWebViewは、ListViewコントロールは、これらのメソッドを持って、 "addHeaderView" または "addFooterView" メソッドを持っていません。これは解決策ではありません。 – ismailarilik

    6

    で@panos作品によって提供される解決策が、ScrollViewで使用した場合、それはまだ問題があります。次の拡張バージョンは、この問題を克服します。

    public class TouchyWebView extends WebView { 
    
    public TouchyWebView(Context context) { 
        super(context); 
    } 
    
    public TouchyWebView(Context context, AttributeSet attrs) { 
        super(context, attrs); 
    } 
    
    public TouchyWebView(Context context, AttributeSet attrs, int defStyle) { 
        super(context, attrs, defStyle); 
    } 
    
        @Override 
        public boolean onTouchEvent(MotionEvent event) { 
    
        //Check is required to prevent crash 
        if (MotionEventCompat.findPointerIndex(event, 0) == -1) { 
        return super.onTouchEvent(event); 
        } 
    
        if (event.getPointerCount() >= 2) { 
        requestDisallowInterceptTouchEvent(true); 
        } else { 
        requestDisallowInterceptTouchEvent(false); 
        } 
    
        return super.onTouchEvent(event); 
    } 
    
    @Override 
    protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) { 
        super.onOverScrolled(scrollX, scrollY, clampedX, clampedY); 
        requestDisallowInterceptTouchEvent(true); 
    
    
    } 
    
        } 
    

    さらに、TouchyWebViewには次の設定が必要です。

    mWebView.getSettings().setLoadWithOverviewMode(true); 
    mWebView.getSettings().setUseWideViewPort(true); 
    mWebView.getSettings().setSupportZoom(true); 
    mWebView.getSettings().setBuiltInZoomControls(true); 
    
    +0

    あなたのソリューションの 'WebView'は2本の指だけでスクロール可能ですが、1本の指だけがスクロールしています...それほど直感的ではありません: – snachmsm

    2

    パノス・ソリューションは...私の固定の高さ(200dp)WebViewが空であってもよいし、コンテンツの多くをロードしていることがあり、1つの例外を除いて、私のために十分です。したがって、スクロール可能であるか、スクロール可能でない可能性があります。パノラマソリューションはWebViewが空とユーザのタッチWebViewあるときに、常にMotionEvent秒かかり、その後、WebViewは(ないコンテンツが存在しないため)、スクロールしてスクロール可能な親も、WebView「ツバメ」MotionEventが発生することはありませんスクロールしようとしている - ので、何も起こりません。私が期待される動作のために小さなif文を追加しました:

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
        if(computeVerticalScrollRange() > getMeasuredHeight()) 
         requestDisallowInterceptTouchEvent(true); 
        return super.onTouchEvent(event); 
    } 
    
    • WebViewが、その後computeVerticalScrollRange() > getMeasuredHeight()
    • 空と垂直ではない、スクロール、その後 computeVerticalScrollRange() == getMeasuredHeight()
    • WebViewは、その高さよりも長いコンテンツを持っている(スクロール可能である)であります
    0

    @Panosと@Dipendraの解決策を取り組んでいます。スクロールビュー内のマップビューにはまだいくつかの問題がありました。それは一貫して垂直にスクロールせず、メソッドは非難されたので、私はscrollviews内のmapviewで使用するこのトリックをうまく処理し、素晴らしい作品です。これがあなたの数人を助けてくれることを願っています。

    public class TouchyWebView extends WebView { 
    ViewParent mViewParent; 
    
    public TouchyWebView(Context context) { 
        super(context); 
    } 
    
    public TouchyWebView(Context context, AttributeSet attrs) { 
        super(context, attrs); 
    } 
    
    public TouchyWebView(Context context, AttributeSet attrs, int defStyle) { 
        super(context, attrs, defStyle); 
    } 
    
    public void setViewParent(@Nullable final ViewParent viewParent) { //any ViewGroup 
        mViewParent = viewParent; 
    } 
    
    
    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
    
        switch (event.getAction()) { 
         case MotionEvent.ACTION_DOWN: 
          if (null == mViewParent) { 
           getParent().requestDisallowInterceptTouchEvent(true); 
          } else { 
           mViewParent.requestDisallowInterceptTouchEvent(true); 
          } 
          break; 
         case MotionEvent.ACTION_UP: 
          if (null == mViewParent) { 
           getParent().requestDisallowInterceptTouchEvent(false); 
          } else { 
           mViewParent.requestDisallowInterceptTouchEvent(false); 
          } 
          break; 
         default: 
          break; 
        } 
        return super.onTouchEvent(event); 
    } 
    
    @Override 
    protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) { 
        super.onOverScrolled(scrollX, scrollY, clampedX, clampedY); 
        requestDisallowInterceptTouchEvent(true); 
    
    
    } 
    

    }

    私はまた、設定のコントロールについて@Dipendraのアドバイスに従いました。

    mWebView.getSettings().setLoadWithOverviewMode(true); 
    mWebView.getSettings().setUseWideViewPort(true); 
    mWebView.getSettings().setSupportZoom(true); 
    mWebView.getSettings().setBuiltInZoomControls(true); 
    
    関連する問題