ListView onclick事件中的Android WebView问题

时间:2011-02-11 19:34:26

标签: android android-webview android-listview

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

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

理想情况下,这可以像Facebook的新闻源一样操作,在那里你可以点击某人墙贴的个人资料图片,就好像你已经点击了整个行(在FB案例中,墙贴的文字)

6 个答案:

答案 0 :(得分:22)

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

我不得不使用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));

答案 1 :(得分:7)

我设法使用以下内容:

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

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

答案 2 :(得分: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;
    }
}

答案 3 :(得分:3)

设置到每个WebView的父布局:

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

答案 4 :(得分:2)

我刚试过这篇文章WebView inside the Custom ListView: Click Listener is not Working中的建议,我不知道为什么,但如果你在XML中设置这些功能,它们似乎不起作用。动态执行此操作可以让您单击listview项目=)

答案 5 :(得分:1)

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

TextView1 
ImageView1 TextView2 ImageView2
TextView3

然后我用以下方法更改了布局,即我在最左边的角落添加了WebView控件来代替ImageView1

TextView1 
WebView TextView2 ImageView2
TextView3

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

我通过将此问题添加到Webview来解决此问题:

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