удалить выбор по умолчанию, не отключая гиперссылки и кнопки веб-представления

Я использую btwebview, чтобы получить выделение текста и обработать его. Проблема в том, что когда я использую longPress с жестовым детектором, также запускается выбор по умолчанию, если я переопределяю onTouchEvent и возвращаю true, проблема решена, но я не могу нажать ни одну кнопку или выделенную ссылку в веб-просмотре, поэтому я не могу получить доступ к сноскам или видео вставлен в веб-просмотр, и вызов shouldOverrideUrlLoading перестает вызываться.

  public void init(Context context) {
    System.out.println("BTWebview init");
    this.context = context;
    this.getSettings().setJavaScriptEnabled(true);
    gestureScanner = new GestureDetector(this);
    this.setOnTouchListener(new View.OnTouchListener() {

        public boolean onTouch(View v, MotionEvent event) {
            System.out.println("event "+event.toString() );
            return gestureScanner.onTouchEvent(event);
        }
    });

    setInitialScale(100);
    addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT");

}

@Override
public boolean onTouchEvent(MotionEvent event) {
    System.out.print("on touch event "+ event.toString());
    return true;
}

@Override
public void onLongPress(MotionEvent e) {
    // TODO Auto-generated method stub
    // TODO Auto-generated method stub
            System.out.println("gesture listener onLongPress");

            mSelection = true;
            if(!this.isInSelectionMode()){
                System.out.println("onLongClick in selection mode");
                mSelection = true;
            }

            this.loadUrl("javascript:android.selection.longTouch();");
                mScrolling = true;
                System.out.println("onLongClick");

}

person coder    schedule 06.01.2015    source источник


Ответы (1)


Причина, по которой веб-представление перестало реагировать на прикосновения, заключается в том, что эта функциональность реализована в суперклассе onTouchEvent.

Поэтому, чтобы заставить его снова работать, вам нужно будет вызвать super.onTouchEvent(event) где-нибудь в вашем onTouchEvent. Очевидно, что если вы будете постоянно звонить, вы вернетесь к тому, с чего начали.

Чтобы достичь того, что вы хотите сделать, вам нужно будет вызывать super.onTouchEvent только тогда, когда вы еще не обнаружили, что событие является событием длительного нажатия. Самый простой способ сделать это — сохранить идентификатор указателя из MotionEvent, который передается в onLongPress (вы должны быть в состоянии предположить, что это будет указатель с индексом 0, потому что долгое нажатие по определению является событием одиночного касания).

Если у вас есть это, ваш onTouchEvent может выглядеть примерно так

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getPointerId(0) != self.lastLongPressPointerId) {
        return super.onTouchEvent(event);
    }
    return true;
}

Вам также может понадобиться следить за событиями ACTION_UP и ACTION_CANCEL, относящимися к указателю, и прекращать его поиск после этого только в том случае, если система решит повторно использовать идентификатор указателя.

person Tristan Burnside    schedule 09.01.2015
comment
Извините за поздний ответ, я попробовал ваше предложение, но оно не сработало. проблема, когда onTouchEvent переопределяется, как тот, который вы разместили, ссылки в сносках и кнопка в веб-просмотре перестают работать. любое другое предложение, которое я могу попробовать - person coder; 14.01.2015
comment
ваша логика верна, но, возможно, я сделал какую-то ошибку, я еще раз пересмотрю ее, но спасибо за вашу идею. - person coder; 14.01.2015
comment
event.getPointerId(0) всегда дает ноль для всех жестов, я думаю, что это проблема. любой другой способ обнаружить определенное событие? - person coder; 14.01.2015
comment
хорошо, я нашел решение, установив счетчик, который отсчитывает действия, если их больше 2, то это длинный щелчок, и я возвращаю true, иначе возвращаю super.onTouchEvent (событие). - person coder; 14.01.2015