【问题标题】:Android WebView inside ListView onclick event issuesListView onclick事件问题内的Android WebView
【发布时间】:2011-02-11 19:34:25
【问题描述】:

我有一个 ListView,其中每一行有两个并排的 webview,占据了整行。我已经在我的 ListActivity 中设置了 onListItemClick(),但是当我点击其中一行时它们不会被触发(除非我碰巧点击的地方在 webview 的边界之外 - 但这不太可能是行为,用户最会可能想要点击 webview 中的图像)。

我尝试设置 setFocusable(false) 和 setFocusableInTouchMode(false),但这些都没有帮助。

理想情况下,这将像 Facebook 的新闻源一样运行,您可以在其中点击某人墙上帖子的个人资料图片,就好像您已经点击了整行(在 FB 中是墙上帖子的文本)

【问题讨论】:

    标签: android android-webview android-listview


    【解决方案1】:

    想通了,发布我的解决方案以防其他人想做类似的事情:

    我不得不使用 OnTouchListener,因为 OnClick 和 OnFocus 不起作用。我扩展了一个可重用的类:

    private class WebViewClickListener implements View.OnTouchListener {
        private int position;
        private ViewGroup vg;
        private WebView wv;
    
        public WebViewClickListener(WebView wv, ViewGroup vg, int position) {
            this.vg = vg;
            this.position = position;
            this.wv = wv;
        }
    
        public boolean onTouch(View v, MotionEvent event) {
            int action = event.getAction();
    
            switch (action) {
                case MotionEvent.ACTION_CANCEL:
                    return true;
                case MotionEvent.ACTION_UP:
                    sendClick();
                    return true;
            }
    
            return false;
        }
    
        public void sendClick() {
            ListView lv = (ListView) vg;
            lv.performItemClick(wv, position, 0);
        }
    }
    

    可以重写 sendClick 方法以执行您特定情况下所需的操作。用例:

    WebView image = (WebView) findViewById(R.id.myImage);
    image.setOnTouchListener(new WebViewClickListener(image, parent, position));
    

    【讨论】:

    • 我试过这个。它对我不起作用。感谢您的任何其他想法。
    • 这样可以正常工作!谢谢!。在一些实际案例中,您可能会将它与 set 和 get Tag 一起使用。
    【解决方案2】:

    我设法通过以下方式解决了这个问题:

    class NoClickWebView extends WebView {
        public NoClickWebView(Context context) {
            super(context);
            setClickable(false);
            setLongClickable(false);
            setFocusable(false);
            setFocusableInTouchMode(false);
        }
    }
    

    您可以使用这个类,也可以只在标准 WebView 上设置这些属性。

    【讨论】:

      【解决方案3】:

      使用与上述 bjdodson 相同的方法使其在 Android 4.4 中工作,但也覆盖了 dispatchTouchEvent

      public class NonClickableWebview extends WebView {
          public NonClickableWebview(Context context, AttributeSet attrs) {
              super(context, attrs);
              setClickable(false);
              setLongClickable(false);
              setFocusable(false);
              setFocusableInTouchMode(false);
          }
          @Override
          public boolean dispatchTouchEvent(MotionEvent ev) {
              return false;
          }
      }
      

      【讨论】:

      • 谢谢。在尝试了上述所有解决方案后,它对我有用。
      • 此解决方案运行良好,而其他解决方案似乎工作量更大。请注意,在“现代”Android Studio-ish 技术中,完成此操作的最简单方法是使用此代码添加一个新类文件,在您的 XML 布局文件中创建一个常规 WebView,然后编辑 XML,替换 WebViewcom.myapp.NonClickableWebview 之后,您的代码类似于(NonClickableWebview) myView = (NonClickableWebview) findViewById( R.id.myView );,但您可以将其作为标准WebView
      【解决方案4】:

      设置每个 WebView 的父布局:

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

      【讨论】:

        【解决方案5】:

        我刚刚尝试了这篇文章WebView inside the Custom ListView: Click Listener is not Working 中的建议,我不知道为什么,但是如果您在 XML 中设置这些功能,它们似乎不起作用。动态执行此操作确实允许您单击列表视图项 =)

        【讨论】:

        • 目前此链接收到 404。
        【解决方案6】:

        我在 ListView 中使用了以下布局,它运行良好,即点击、滚动等。

        TextView1 
        ImageView1 TextView2 ImageView2
        TextView3
        

        然后我改变了布局,即我在最左角添加了WebView控件来代替ImageView1

        TextView1 
        WebView TextView2 ImageView2
        TextView3
        

        执行此操作后,单击对我不起作用。

        我通过将它添加到 Webview 来解决这个问题:

        webView.setFocusable(false);
        webView.setClickable(false);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-12
          • 2017-04-12
          • 2011-11-07
          • 2011-07-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多