【问题标题】:WebView properties not changing after scrolling滚动后 WebView 属性不变
【发布时间】:2012-01-30 12:19:44
【问题描述】:

我要做的是更改 webview 的字体大小和前景色/背景色。 我使用以下方法(放置在活动内)完成了此操作:

private void updateFont(int fontSize, String fontColor) {
  if (fontSize != 0) {
    contentWebview.getSettings().setDefaultFontSize(fontSize);
  }
  if (!fontColor.equals("")) {
    contentWebview.loadUrl(fontColor);
  }
}

现在一切正常。但是我在我的 contentWebview 中添加了一些东西(这是我创建的自定义 webview) - 下面是自定义 webview 的一些 sn-p:

public class ContentWebview extends WebView {

  public ContentWebview(Context context) {
    super(context);
  }

  public ContentWebview(Context context, AttributeSet attrs) {
    super(context, attrs);
    loadWebview();

    gestureDetector = new GestureDetector(new MyGestureDetector());
    gestureListener = new OnTouchListener() {
      public boolean onTouch(View v, MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
      }
    };
    setOnTouchListener(gestureListener);
  }

  class MyGestureDetector extends SimpleOnGestureListener {
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
      try {
        if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) {                 
          return false;
        }
        // right to left swipe
        if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
          int currentPosition = getScrollX()/displayWidth +1;
            scrollTo(currentPosition*displayWidth, 0);
        }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
          int currentPosition = getScrollX()/displayWidth;
            scrollTo(currentPosition*displayWidth, 0);
        }
      } catch (Exception e) {
        // nothing
      }
      return true;
    }
  }

  public boolean onTouchEvent(MotionEvent ev) {
    if(ev.getAction()==MotionEvent.ACTION_UP) {
      int currentPosition = getScrollX()/displayWidth;
      if(getScrollX()%displayWidth>displayWidth/2) {
        currentPosition++;
      } else {
        // do nothing
      }     
      scrollTo(currentPosition*displayWidth, 0);
    }
    return super.onTouchEvent(ev);
  }

基本上,我创建了一个自定义 WebView,当它滚动或弹出时,它会捕捉到一个固定的计算位置。现在这就是问题出现的地方——一旦我滚动了这个特定的 webview,以前的方法(updateFont)就不再起作用了——webview 不会改变字体大小或颜色。

我也将问题缩小到这一行:

setOnTouchListener(gestureListener);

如果我注释掉这一行,updateFont 方法即使在我滚动 webview 后仍然有效,但我的 webview 的快速跳转页面功能也消失了。

我在这里错过了什么?

更新:问题仅出现在 froyo 设备中。 2.3及以上似乎没有问题

【问题讨论】:

    标签: android webview horizontal-scrolling


    【解决方案1】:

    WebView 和 GestureDetectors 存在一些问题 - 尝试 always 在您的 onFling(..) 方法中返回 false 而不是 true - 使用众所周知,您所做的手势检测器会阻止非常基本的内容(例如甚至更新当前显示的页面)。

    【讨论】:

      【解决方案2】:

      在对项目进行了一些修改后,我发现自定义 webview 中加载的属性更改会在一段时间后被解释。延迟是由 onNewPictureListener 触发对 javascript 命令的无休止调用引起的,该命令首先由 webview 解释,然后再执行其他内容。删除它可以解决问题。

      【讨论】:

        猜你喜欢
        • 2013-04-01
        • 2013-05-21
        • 2017-01-30
        • 2012-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-10
        • 2017-05-10
        相关资源
        最近更新 更多