Android WebView внутри ListView onclick проблемы с событиями - PullRequest
9 голосов
/ 11 февраля 2011

У меня есть ListView, где каждая строка имеет два веб-просмотра рядом, занимая всю строку.Я настроил onListItemClick () в своей ListActivity, но они не запускаются, когда я нажимаю на одну из строк (если только место, куда я случайно нажал, находится за пределами границы веб-просмотра - но это вряд ли поведение, пользователи чаще всегоскорее всего, вы хотите нажать на изображение внутри веб-просмотра).

Я пытался установить setFocusable (false) и setFocusableInTouchMode (false), но это не помогает.

В идеале это будет работать точно так же, как новостная лента Facebook, где вы можете нажать на изображение профиля чьей-то записи на стене и действовать так, как будто вы нажали всю строку (в случае FBs текст для записи на стене)

Ответы [ 6 ]

22 голосов
/ 11 февраля 2011

Разобрался, опубликовав свое решение на тот случай, если кто-то захочет сделать что-то подобное:

Мне пришлось использовать 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));
7 голосов
/ 04 марта 2012

Мне удалось заставить это работать со следующим:

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

Вы можете использовать этот класс или просто установить эти свойства в стандартном WebView.

6 голосов
/ 23 ноября 2014

Работает в Android 4.4, используя тот же подход, что и bjdodson выше, но также переопределяет 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 голосов
/ 13 июня 2013

Настройка родительского макета каждого WebView:

android:descendantFocusability="blocksDescendants" 
android:layout_width="match_parent"
android:layout_height="wrap_content"
2 голосов
/ 15 июня 2011

Я только что попробовал то, что предлагается в этом посте WebView внутри Custom ListView: Click Listener не работает , я не знаю почему, но если вы установите эти функции в XML, они, похоже, не будут работать.Делая это динамически, вы можете нажать на элемент списка =)

1 голос
/ 10 января 2013

Я использовал следующий макет в ListView, и он работал отлично, то есть его нажатие, прокрутка и т. Д.

TextView1 
ImageView1 TextView2 ImageView2
TextView3

Затем я изменил макет следующим образом, т.е. добавил элемент управления WebView в крайнем левом углу вместо ImageView1

.
TextView1 
WebView TextView2 ImageView2
TextView3

После этого щелчок не работал для меня.

Я решаю эту проблему, добавив ее в Webview:

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