11
votes

Android: ZoomPicker Breaks Ontouchlistener

J'ai un webview qui utilise les commandes de zoom intégrées, comme suit: XXX PRE>

Remarque: Ceci active deux fonctions principales - Pinch-à-zoom et InvokezoomPicker () (Ce dernier n'est appelé que lorsqu'une action de balayage est effectuée à la vue, une simple touche ne l'active pas) p>


Et je veux aussi que les choses se produisent lorsque des événements touchés se produisent, en utilisant ce qui suit. P>

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


2 commentaires

J'ai le même problème. Avez-vous déjà trouvé une solution pour cela?


Malheureusement je ne l'ai pas encore compris


11 Réponses :


0
votes

C'est le plus proche que je puisse arriver à une solution à ce problème. Je devais définir la mise au point d'entrée sur le Webview chaque fois que cela a été touché. La seule façon dont je puisse le faire était d'étendre webview et de remplacer la fonction d'Ontouchevent. Cette fonction est appelée même après que le zoom est utilisé dans le Webview.

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


1 commentaires

Désolé de ne pas me débrouiller plus tôt, mais j'ai enfin eu la chance de tester ce code, malheureusement cette méthode ne reçoit pas encore ONTTOUCH



2
votes

J'ai eu le même problème, mais j'ai réussi à le résoudre en définissant à nouveau l'auditeur dans ma classe webview étendue: xxx

Malheureusement, j'ai le problème opposé à ce que le zoom contrôle ( Le widget Plus / Minus) ne reçoit plus d'événements tactiles. Il semble y avoir une certaine exclusivité entre la présentation d'un Ontouchlistener et d'un zoom, au moins dans Android SDK Niveau 8 (Froyo 2.2).

Cela ressemble à un bug pour moi, mais aimerais trouver une solution de contournement.


0 commentaires

0
votes

Je pense qu'il y a une certaine exclusivité, par exemple, pour une vue Web 500x500 et vous l'avez effectuée sur 1000x1000, puis vous l'avez touchée, maintenant quelle position doit-elle signaler?

Mais j'ai vraiment besoin de les faire travailler ensemble.


0 commentaires

1
votes

Une solution sale consiste à couvrir une vue invisible sur la vue de votre Web et à détecter des touches. Vous devez distinguer si le toucher est consommé ou renvoyez FALSE pour passer des touches sur la vue Web sous-jacente.


1 commentaires

Cela a très bien fonctionné pour moi. Je viens de faire un et l'a placé en haut de la à l'intérieur d'un . Ensuite, j'ai défini le 'S ecouchlistener et le rendit renvoyé false .



2
votes

La solution de contournement est assez simple. Vous devez créer une classe personnalisée qui étend l'une des sous-classes de groupe de vie comme linearlayout. Puis remplacez-vous sur Onterceptouchevent - il sera appelé avant le groupe d'observation de l'enfant d'enfant. Il n'est pas très élégant de mettre un contrôle WebView dans votre sous-classe de groupe de vie personnalisé, puis de l'insérer dans la hiérarchie de la vue de l'activité - où elle est souhaitée, mais ça marche. xxx


0 commentaires

0
votes

J'ai eu un problème similaire où Onchouch code> ne serait pas appelé après avoir utilisé pinch pour zoomer em>. Inspiré par JPESKIN STRUT> 'S Réponse, ce code a fonctionné pour moi (Ajoutez-le dans la classe qui étendvist Webview): xxx pré>

mise à jour: p>

@Override
public boolean onTouch(View v, MotionEvent event) {
    return touchListener.onTouch(v, event);
}


2 commentaires

Votre code ne compile pas pour moi dans une classe webview webview - il est indiqué que la méthode AOUTTOUCH est indéfinie. Avez-vous mis en place une méthode d'AOULISONTU dans la sous-classe WebView vous-même? Si votre exemple serait donc plus clair avec un commentaire à la place de l'appel AOUTTOUCH ().


Je l'ai vérifié et j'ai en effet une méthode aschoue () dans la classe extension webview, de sorte que la classe implémente Ontouchlistener .



0
votes

J'ai eu le même problème de zoom que Stijn.v. J'ai utilisé le code dans sa réponse, mais j'avais toujours un problème avec le touchlistener parfois réglé sur NULL. Voici ma classe WebView complète, testée sur Android 4.0 - 4.3

bookWebview.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return mGestureDetector.onTouchEvent(event);
        }
    });


0 commentaires

2
votes

Essayez

youWebView.getSettings().setBuiltInZoomControls(false);


0 commentaires

0
votes

J'ai rencontré le même problème, et j'ai étendu webview et créer mon propre ONTouchlistener pour éviter ce bogue. Par exemple: Classe publique BookknowBevage étend webview { xxx

}


0 commentaires

4
votes

Donc, après avoir rencontré le même problème moi-même, j'ai essayé de donner un sens à certaines de ces réponses à rien en vain. Le problème à portée de main est qu'une fois que l'utilisateur invoque le défilement (non pinch-zoom) (au moins pour moi ...), l'instance WebView perd sa référence d'Ontchlistener. Comment ai-je compris cela? Eh bien ...

Webview hérite de Dispatchtouchevent () à partir de la vue. Dispatchtouchevent appelle aschououch () (quelle est la fonction qui ne tire pas qui devrait) P>

La raison pour laquelle Aoudouch () n'était pas appelée, comme je l'ai déjà dit que l'Ontouchlistener d'instance WebView était devenu NULL pour certaines raisons. Cela peut être vu en mettant un point d'arrêt dans la méthode DispatchTouchevent () de la vue P>

afin de résoudre ce problème, nous étendons webview comme: p> xxx pré>

et nous Implémentez Notre ONTOUCHLISTENER: P>

import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.webkit.WebView;

public class WebTouchListener implements OnTouchListener {

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        WebView.HitTestResult hr = ((TouchWebView)v).getHitTestResult();
        //Log.i(TAG, "getExtra = "+ hr.getExtra() + "\t\t Type=" + hr.getType());

        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            System.out.println(hr.getExtra() + " " + hr.getType());
        }

        // TODO Auto-generated method stub
        return false;
    }


}


0 commentaires

0
votes

fonctionne parfaitement bien pour moi. Il suffit d'utiliser Ontouchevent (événement MotionEvent) au lieu d'AOUTTOUCH (View V, événement MotionEvent). Fonctionne même si SetBuiltInzoomControls est défini sur True.


0 commentaires