8
votes

RXJAVA - Comment invoquer l'abonné sur 4 clic événements dans Android

dans Android J'ai une vue de texte définie comme ceci:

RxView.clicks(tv).flatMap(tv -> { 
        // another observable which can throw onError. 
        return Observable.error(null); 
    }).subscribe(object -> { 
        Log.d("CLICK", "textview clicked", start activity);
    }, error -> { 
        Log.d("CLICK", "ERROR");
    });


2 commentaires

Vous essayez d'obtenir un clic quadruple ou seulement 4 clics avec une quantité de temps non spécifiée entre eux?


Quadruple Cliquez, mais je peux me contenter de 4 clics avec une limite de temps entre. cela fonctionne aussi bien.


6 Réponses :


4
votes

Vous pouvez créer un observable pour émettre chaque fois que vous cliquez sur le bouton, puis comptez les temps totaux qu'il a émis et utilisez un filtre afin que votre abonné ne le verra qu'une fois qu'il a émis quatre fois.

Observable<View> buttonObservable = ViewObservable.clicks(initiateButton, false);
buttonObservable.count()
        .filter(count -> (count >= 4))
        .subscribe(object -> {
            //Your code here
        });


2 commentaires

La méthode observable.count renvoie simplement le nombre de fois que le observable a émis un élément. Ça fait partie de rxjava


Compte ne peut pas être utilisé ici car il n'aura qu'un article après ses émits observables remplis ( rxmarbles.com/#count < / a>) le clic observable d'autre part est infini



5
votes

Vous pouvez réaliser avec quelque chose comme ceci: xxx

  • tampon () - Recueillir des clics pour la fenêtre 1S
  • filtre () - Filtrer tous les éléments tamponnés émis, où est le nombre d'éléments dans la mémoire tampon non égaux 4 (Désactiver double, triple, quintuple clics)

    La partie la plus difficile est de spécifier le temps de tampon "fenêtre". Une seconde n'est parfois pas assez, mais dans d'autres cas, l'utilisateur doit attendre peu de millisecondes.


4 commentaires

Qu'est-ce que "CREATE ((Observable.SuCRIDE "? Je suis en train d'utiliser rxjava2


@Pablocegarra C'est l'exemple est basé sur rxjava1. Méthode Créer () est utilisé lorsque vous avez besoin d'une création d'observable à partir d'un fournisseur ( onclicklistener dans ce cas). Observable.Sublique est simplement défini Définition de l'abonné. Dans RXJAVA2, vous devez utiliser flowable .


Pouvez-vous mettre à jour votre message à rxjava2 s'il vous plaît? Je vous voterai si cela fonctionne, maintenant im en utilisant rxbinding juste pour cela


@Pablocegarra s'il vous plaît, créez une nouvelle question et spécifiez-y vos exigences. Quelqu'un jette un coup d'oeil.



1
votes

2 commentaires

Cela dépend si vous avez besoin de 4 clics exactement et non plus. La question a été indiquée exactement comme quadruple clic.


La question requise 4, bien sûr, elle peut être modifiée si vous le souhaitez, si vous voulez seulement un événement, vous pouvez également utiliser d'abord () ou prendre (1) après.



0
votes

Si vous souhaitez démarrer une activité après un certain nombre de clics dans une fenêtre de temps, essayez ceci:

RxView.clicks(tv)
    .map(e -> SystemClock.elapsedRealtime())
    .buffer(NUM_CLICKS, 1) //Grab every sub-sequence of however many clicks
    .filter(times -> times.size() == NUM_CLICKS) //Last values will be truncated
    .filter(times -> times.get(NUM_CLICKS - 1) - times.get(0) < ALLOWED_TIME) //check times
    .subscribe(ignore -> startActivity());


0 commentaires

1
votes

Utilisez le tampon et l'opérateur de débutage.

val clickStream = RxView.clicks(view)
    clickStream.buffer(clickStream.debounce(250, TimeUnit.MILLISECONDS))
            .map { it.size }
            .filter { it == 4 }
            .subscribe({
            })


1 commentaires

Rxview.clicks (vue) .share () - Rxbinding ne fonctionne que avec le dernier auditeur, plus ici Github. COM / Jakewharton / Rxbinding / Problèmes / 146



2
votes

Pour détecter plusieurs clics avec un délai imparti (par exemple, 4 clics à moins de 1000 ms), le suivant fonctionne bien: xxx

dans cet exemple, le tampon Émettez 4 événements émettant 4 événements, ou émettant moins de 4 événements tous les 1000 ms, qui seront ignorés à cause du filtre


4 commentaires

C'est plutôt bien, merci, mais n'est-ce pas identique à Zygi?


J'ai essayé celui-là d'être initialement et je ne pouvais pas le faire travailler. Même si cela fonctionnait, cette réponse a eu quelques avantages pour moi: 1. Vous pouvez le faire en une ligne; 2. La version de tampon qui inclut le délai d'attente ainsi que les numclicks fonctionne parfaitement pour le scénario "Plusieurs clic"


@Peter Cela attendra une seconde à compléter avant de donner le résultat. Et si je veux obtenir le résultat dès que 4 clics sont effectués dans les 1 seconde période?


@Rishabhjain êtes-vous certain? Selon la documentation de tampon , les éléments seront émis lorsque tispan (délai d'attente dans l'exemple ci-dessus) est atteint ou compte (NumClicks ci-dessus ) est atteint - donc lorsque 4 clics sont reçus dans l'exemple ci-dessus, l'observateur doit être appelé quel que soit le temps écoulé: REACTIVEX.IO/Documentation/OPERATORS/Buffer.html