Android ListView 中的 WebView 点击事件问题

8
我有一个ListView,每行都有两个并排的Webview,占据整个行。 我在ListActivity中设置了onListItemClick(),但当我点击其中一行时它们不会触发(除非我碰巧点击在webview的边框外 - 但这不是可能的行为,用户最有可能想要点击webview内部的图像)。
我已经尝试设置setFocusable(false)和setFocusableInTouchMode(false),但它们没有帮助。
理想情况下,这将完全像Facebook的新闻供稿一样运作,您可以点击某人的墙贴的个人资料图片,并且它将像您点击整个行一样运作(在FB的情况下是墙贴的文本)。
6个回答

23

找到解决方法了,分享一下我的方案,以便其他人也可以使用:

由于OnClick和OnFocus不起作用,我必须使用OnTouchListener。我扩展了一个可重复使用的类:

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));

我尝试过这个,但它对我没用。谢谢任何其他的想法。 - Raj
这个功能正常工作!谢谢!在一些实际情况下,您可以使用set和get标签来使用它。 - superUser

7

我使用以下方法使其正常工作:

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

你可以使用这个类或者在标准的WebView上设置这些属性。

6

我已经按照与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;
    }
}

谢谢。在尝试了所有上述解决方案后,它对我起作用了。 - Raj
2
这个解决方案很好,而其他的解决方案似乎要更费力一些。请注意,在“现代”Android Studio技术中,实现这一点的最简单方法是添加一个新的类文件,并使用此代码在XML布局文件中创建一个常规的WebView,然后编辑XML,将WebView替换为com.myapp.NonClickableWebview。之后,您的代码就像(NonClickableWebview) myView = (NonClickableWebview) findViewById( R.id.myView );但您仍然可以像标准的WebView一样处理它。 - Chris Ostmo

2

设置每个 WebView 的父布局:

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

2

2
目前访问此链接时出现404错误。 - treejanitor

1
我之前在ListView中使用了以下布局,它完美地工作,即点击、滚动等。
TextView1 
ImageView1 TextView2 ImageView2
TextView3

然后我用以下方式更改了布局,即在最左侧的ImageView1位置添加了WebView控件。

TextView1 
WebView TextView2 ImageView2
TextView3

在这之后,我的点击功能无法正常工作。

我通过将以下内容添加到Webview中解决了这个问题:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接