ListView onclick事件中的Android WebView问题

Nel*_*oso 9 android android-webview android-listview

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

我已经尝试过设置setFocusable(false)和setFocusableInTouchMode(false),但那些没有帮助.

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

Nel*_*oso 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

WebView image = (WebView) findViewById(R.id.myImage);
image.setOnTouchListener(new WebViewClickListener(image, parent, position));
Run Code Online (Sandbox Code Playgroud)


bjd*_*son 7

我设法使用以下内容:

class NoClickWebView extends WebView {
    public NoClickWebView(Context context) {
        super(context);
        setClickable(false);
        setLongClickable(false);
        setFocusable(false);
        setFocusableInTouchMode(false);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用此类,也可以只在标准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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案效果很好,而其他解决方案似乎相当多.请注意,在"现代"Android Studio-ish技术中,最简单的方法是使用此代码添加新的类文件,在XML布局文件中创建常规的`WebView`,然后编辑XML,替换`WebView`使用`com.myapp.NonClickableWebview`之后,你的代码类似于`(NonClickableWebview)myView =(NonClickableWebview)findViewById(R.id.myView);`但你可以将其作为标准`WebView查询 (2认同)