Android WebView внутри проблем с событием ListView onclick

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

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

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


person Nelson Monterroso    schedule 11.02.2011    source источник


Ответы (6)


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

Мне пришлось использовать 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));
person Nelson Monterroso    schedule 11.02.2011
comment
Я пробовал это. Это не сработало для меня. спасибо за любую другую идею. - person Raj; 04.12.2014
comment
Это работает как надо! Спасибо!. Вы можете использовать его с set и get Tag в некоторых реальных случаях. - person superUser; 27.09.2015

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

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

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

person bjdodson    schedule 04.03.2012

Он работает в 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;
    }
}
person ylamaki    schedule 23.11.2014
comment
Благодарю. у меня это сработало после того, как я попробовал все вышеперечисленные решения. - person Raj; 04.12.2014
comment
Это решение работает хорошо, тогда как другие кажутся немного более трудоемкими. Обратите внимание, что в современных методах Android Studio самый простой способ добиться этого — добавить новый файл класса с этим кодом, создать обычный WebView в файле макета XML, затем отредактировать XML, заменив WebView на com.myapp.NonClickableWebview. После этого ваш код похож на (NonClickableWebview) myView = (NonClickableWebview) findViewById( R.id.myView );, но в противном случае вы можете обратиться к нему как к стандартному WebView - person Chris Ostmo; 17.12.2014

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

android:descendantFocusability="blocksDescendants" 
android:layout_width="match_parent"
android:layout_height="wrap_content"
person Yuriy    schedule 13.06.2013

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

person Paulina D.    schedule 14.06.2011
comment
В настоящее время получаю 404 для этой ссылки. - person treejanitor; 13.09.2013

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

TextView1 
ImageView1 TextView2 ImageView2
TextView3

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

TextView1 
WebView TextView2 ImageView2
TextView3

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

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

webView.setFocusable(false);
webView.setClickable(false);
person Osman    schedule 10.01.2013