【问题标题】:Android WebView inside ListViewListView 内的 Android WebView
【发布时间】:2014-08-14 12:33:36
【问题描述】:

我在ListView 中有一个WebView。一切正常,除了我不能阻止ListView 向上/向下滚动,如果WebView 处理滚动手势。

我知道,我可以使用 OnTouchListener 中的以下代码完全阻止 ListView 的滚动

@Override
public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_UP) {
        webView.getParent().requestDisallowInterceptTouchEvent(false);
    } else {
        webView.getParent().requestDisallowInterceptTouchEvent(true);
    }
}

但我只想阻止它,而WebView没有处理滚动/触摸手势。

例如。我有两个 HTML 页面。一个显示一个位置的 360 度视图。这个WebView 应该完全阻止父级的滚动,而第二个WebView 只是文本。该页面不会处理触摸事件,因此父 ListView 可以滚动。

PS:HTML不是我自己写的,不能修改。

【问题讨论】:

    标签: android android-listview android-webview


    【解决方案1】:

    在@mars3142 之后,下面的代码显示并允许滚动更像浏览器中显示的网页。

    public class InnerScrollWebView extends WebView {
    
        private Boolean enableScroll = true;
    
        public InnerScrollWebView(Context context, AttributeSet attrs){
            super(context, attrs);
            getSettings().setDomStorageEnabled(true);
            getSettings().setJavaScriptEnabled(true);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
    
            if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) {
                enableScroll = true;
            }
            if (getParent() != null) {
                getParent().requestDisallowInterceptTouchEvent(enableScroll);
            }
            return super.onTouchEvent(event);
        }
    
        @Override
        protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
            if (getParent() != null) {
                enableScroll = false;
            }
            super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
        }
    }
    

    【讨论】:

      【解决方案2】:

      你应该把它放在每个 webview 的父布局上,它应该可以解决问题。

      android:descendantFocusability="blocksDescendants" 
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      

      【讨论】:

        【解决方案3】:

        我通过创建自定义WebView 解决了这个问题,它似乎工作得很好。

        public class CustomWebView extends WebView {
        
            private Boolean enableScroll = true;
        
            public CustomWebView(Context context, AttributeSet attrs){
                super(context, attrs);
            }
        
            public CustomWebView(Context context, AttributeSet attrs, int defStyleAttr){
                super(context, attrs, defStyleAttr);
            }
        
            @Override
            public boolean onTouchEvent(MotionEvent event) {
        
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    enableScroll = true;
                }
                if (getParent() != null) {
                    getParent().requestDisallowInterceptTouchEvent(enableScroll);
                }
                return super.onTouchEvent(event);
            }
        
            @Override
            protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
                if (getParent() != null) {
                    enableScroll = false;
                }
                super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
            }
        }
        

        【讨论】:

          【解决方案4】:

          我刚刚覆盖了触摸事件

          import java.util.ArrayList;
          import java.util.HashMap;
          import java.util.List;
          import java.util.Map;
          
          import com.google.android.gms.internal.ev;
          import com.google.android.gms.internal.ol;
          import com.notifyme.R;
          import com.notifyme.test.InteractiveScrollView;
          
          import android.app.Activity;
          import android.content.Context;
          import android.os.Bundle;
          import android.util.Log;
          import android.view.MotionEvent;
          import android.view.View;
          import android.view.View.OnTouchListener;
          import android.view.ViewGroup;
          import android.webkit.WebView;
          import android.webkit.WebViewClient;
          import android.widget.AbsListView;
          import android.widget.Adapter;
          import android.widget.ArrayAdapter;
          import android.widget.ListView;
          import android.widget.RelativeLayout;
          import android.widget.ScrollView;
          
          public class TestActivity extends Activity {
          
              ListView listView;
              Map<Integer, List<Float>>  map = new HashMap<Integer, List<Float>>();
              @Override
              protected void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
          
                  setContentView(R.layout.test_activity);
                  listView = (ListView) findViewById(R.id.lv_test);
          
                  MyAdapter adapter = new MyAdapter(this, R.layout.test_activity);
                  List<String> strings = new ArrayList<String>();
                  strings.add("http://youtube.com");
                  strings.add("https://google.com");
                  strings.add("http://www.tutorialspoint.com/");
                  strings.add("http://stackoverflow.com/");
                  adapter.addAll(strings);
                  listView.setAdapter(adapter);
              }
          
              private class MyAdapter extends ArrayAdapter<String> {
          
                  public MyAdapter(Context context, int textViewResourceId) {
                      super(context, textViewResourceId);
                      // TODO Auto-generated constructor stub
                  }
          
                  @Override
                  public View getView(final int position, View convertView, ViewGroup parent) {
          
                      /*
                       * RelativeLayout relativeLayout = new RelativeLayout(getContext());
                       * RelativeLayout.LayoutParams params1 = new
                       * RelativeLayout.LayoutParams(
                       * RelativeLayout.LayoutParams.MATCH_PARENT,
                       * RelativeLayout.LayoutParams.WRAP_CONTENT); params1.height = 600;
                       * ScrollView scrollView = new ScrollView(getContext());
                       */
                      /*
                       * scrollView.setLayoutParams(params1);
                       * relativeLayout.setOnTouchListener(new OnTouchListener() {
                       * 
                       * @Override public boolean onTouch(View v, MotionEvent event) {
                       * Log.e("error","here");
                       * v.getParent().getParent().requestDisallowInterceptTouchEvent
                       * (true); return true; } });
                       */
                      WebView w = new WebView(getContext());
                      AbsListView.LayoutParams params = new AbsListView.LayoutParams(
                              RelativeLayout.LayoutParams.MATCH_PARENT,
                              RelativeLayout.LayoutParams.WRAP_CONTENT);
                      params.height = 600;
                      w.setLayoutParams(params);
                      w.setScrollContainer(false);
                      w.getSettings().setLoadsImagesAutomatically(true);
                      w.getSettings().setJavaScriptEnabled(true);
                      w.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
                      w.setWebViewClient(new WebViewClient());
          
                      w.setOnTouchListener(new OnTouchListener() {
          
                          @Override
                          public boolean onTouch(View v, MotionEvent event) {
                              // TODO Auto-generated method stub
                              return false;
                          }
                      });
                      w.loadUrl(getItem(position));
                      w.setOnTouchListener(new OnTouchListener() {
          
                          @Override
                          public boolean onTouch(View v, MotionEvent event) {
                              Log.e("error",event.getEventTime()+"");
                              v.getParent()
                                      .requestDisallowInterceptTouchEvent(true);
          
                              WebView scrollView =(WebView) v;
          
                              switch (event.getAction()) {
                              case MotionEvent.ACTION_DOWN:
          
                                      map.put(position, new ArrayList<Float>());
          
                                  map.get(position).add(0,event.getX());
                                  map.get(position).add(1,event.getY());
                                  break;
                              case MotionEvent.ACTION_MOVE:
          
                                  float diff = (scrollView.getContentHeight()*scrollView.getScale()) - (scrollView.getScrollY()+600);
                                 // Log.e("scrollView",scrollView.getContentHeight()*scrollView.getScale()+"   ");
          
                                 // Log.e("diff",diff+"v.getBottom()"+ v.getBottom()+"v.getHeight()"+v.getHeight()+"v.getScrollY() "+v.getScrollY());
                                 if (diff <= 0 ) {
                                     scrollView.scrollTo((int)event.getX(), (int)(scrollView.getContentHeight()*scrollView.getScale()-600));
                                      v.getParent()
                                      .requestDisallowInterceptTouchEvent(false);
          
                                    //Log.e("TestActivity", "bottom");
                                    return false;
                                  }if(v.getScrollY() < 0 ||  v.getHeight() > scrollView.getContentHeight()){
                                      scrollView.scrollTo((int)event.getX(), (int)0);
                                      v.getParent()
                                      .requestDisallowInterceptTouchEvent(false);
                                      // Log.e("TestActivity", "top");
                                        return false;
                                  }
                                  float oldX =0;
                                  float oldY = 0;
                                  if(map.containsKey(position)){
                                       oldX = map.get(position).get(0);
                                       oldY = map.get(position).get(1);
                                  }
          
                                  float diffX = oldX -event.getX();
                                  float diffY = oldY - event.getY();
                                  //Log.e("Scroll To", "oldX "+ oldX+"oldY "+oldY+"diffX "+diffX+"diffY "+diffY+"event.getX() "+event.getX()+"event.getY() "+event.getY());
                                  scrollView.scrollBy((int)diffX, (int)diffY);
                                  Log.e("error",event.getEventTime()+"  =  "+diffY);
                                  map.get(position).clear();
                                  map.get(position).add(0,event.getX());
                                  map.get(position).add(1,event.getY());
                                  break;
                              default:
                                  break;
                              }
          
          
          
          
          
                              return true;
                          }
                      });
                      /*
                       * scrollView.addView(w); relativeLayout.addView(scrollView);
                       */
                      return w;
                      // return super.getView(position, convertView, parent);
                  }
          
              }
          }
          

          和 test_activity.xml

          <?xml version="1.0" encoding="utf-8"?>
          <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical" >
          
              <ListView
                  android:id="@+id/lv_test"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent" >
              </ListView>
          
          </LinearLayout>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-26
            • 1970-01-01
            • 2016-07-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多