Android: ZoomPicker ломается на TouchListener - PullRequest
9 голосов
/ 25 декабря 2010

У меня есть веб-просмотр, в котором используются встроенные элементы управления масштабированием:

wv = new WebView(this);
wv.getSettings().setBuiltInZoomControls(true);

Примечание: активируются две основные функции - pinch-to-zoom и invokeZoomPicker () (последняя вызывается только тогда, когда на представлении выполняется действие смахивания, простое касание не активирует его)


и я также хочу, чтобы что-то происходило, когда происходят события касания, используя следующее

wv.setOnTouchListener(new View.OnTouchListener() {  
    public boolean onTouch(View v, MotionEvent event) {
        Log.i("touch", "touched!");
        return false;
    }
});

Когда WebView загружается, и я нажимаю на экран, состояния журнала «соприкасаются» каждый раз, когда я взаимодействую с экраном, как и ожидалось. Тем не менее, если я сделаю что-то, что отключит invokeZoomPicker () (кажется, что увеличение масштаба не вызывает этой проблемы, пока виджет масштабирования не появляется), onTouchListener перестает отвечать на мои нажатия (даже через несколько секунд , когда виджет исчезает из поля зрения).

Чтобы убедиться, что это был invokeZoomPicker (), я отредактировал второй сегмент моего кода следующим образом:

wv.setOnTouchListener(new View.OnTouchListener() {  
    public boolean onTouch(View v, MotionEvent event) {
        wv.invokeZoomPicker();
        Log.i("touch", "touched!");
        return false;
    }
});

Этот новый метод onTouch теперь срабатывает только один раз (в результате чего zoomwidget появляется в представлении - и исчезает через несколько секунд), а затем метод onTouch не вызывается снова, пока представление не будет перезагружено, поэтому это определенно проблема с виджетом invokeZoomPicker () / Zoom

Я пропустил какой-то жизненно важный кусок кода, который позволяет им сосуществовать, или мне просто нужно выбрать, без чего я могу жить?

Ответы [ 11 ]

0 голосов
/ 11 января 2011

Это самое близкое, что я мог прийти к решению этой проблемы.Мне нужно было установить фокус ввода на WebView всякий раз, когда он был затронут.Единственный способ сделать это - расширить WebView и переопределить функцию onTouchEvent.Эта функция вызывается даже после использования масштабирования в WebView.

public class NewWebView extends WebView {

public NewWebView(Context context) {
    super(context);
}

public NewWebView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

public NewWebView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    boolean consumed = super.onTouchEvent(ev);

    if (isClickable())
        if (ev.getAction() == MotionEvent.ACTION_DOWN)
        {
            if (!hasFocus())
                requestFocus();
        }
    return consumed;
}

Не забывайте, что если вы используете XML для создания макета, вам нужно изменить «WebView» на полностью определенное имя пакета.NewWebView (в противном случае вы получите запутанное ClassCastException, если попытаетесь сделать что-то вроде:

      webView = (NewWebView) findViewById(R.id.new_web_view);
...