2017-07-13 1 views
0

Mon activité a SearchView, qui devrait avoir une requête filtrée. Je le filtre via onQueryTextListener. L'idée est que le typage désactiver pas autorisé caractères, comme point, virgule, barre oblique et etc - que [AZ] est autorisé Voici le code (j'utilise Kotlin, mais il est lisible pour Java):SearchView ne pas appeler onQueryTextChange sur le second point

var shouldQueryChangeBeInvoked = true 

override fun onCreate(savedInstanceState: Bundle?) { 
    ... 
    searchField.setOnQueryTextListener(this) 
} 

override fun setSearchQuery(query: String) { 
    shouldQueryChangeBeInvoked = false 
    searchField.setQuery(query, false) 
    shouldQueryChangeBeInvoked = true 
} 

override fun onQueryTextChange(newText: String?): Boolean { 
    if (!shouldQueryChangeBeInvoked) { 
     return false 
    } 
    val validQuery = validateQuery(newText) 
    validQuery?.let { setSearchQuery(it) } 
    return false 
} 

Lorsque Je tape, par exemple, "ABC". il se convertit en "ABC". Donc, ça fonctionne bien. Mais quand je tape dot (".") La deuxième fois, onQueryTextChange ne m'appelle pas du tout - J'ai défini le point d'arrêt sur la première ligne de la méthode. Il a été testé sur deux téléphones différents, il ne s'agit donc pas de paramètres de clavier ou de ce type. Pourquoi l'écouteur n'invoque pas?

EDIT

Validation de la requête que je fait avec Regex comme ça:

fun validateQuery(query: String?): String? { 
    val regex = Regex("^([A-Z]+)") 
    // Return first match or null 
    return query?.let { regex.find(it.toUpperCase()) }?.value 
} 

ne se soucient pas de la création Regex - Je fournis via DI, donc, il crée une seule fois par activité . Peut-être que cela peut poser problème?

+0

je tape tout et "tout" est passé à 'onQueryTextChange' - y compris des points – pskink

+0

@pskink donc si vous tapez "tout .." il deviendra "whatever"? – DefaultXYZ

+0

oui, ceci est la sortie logcat: 'onQueryTextChange quelquechose ......' – pskink

Répondre

0

j'ai trouvé problème: il est mauvais de changer le texte d'une requête dans des onQueryTextChange - si nous regardons à l'intérieur de la classe SearchView, il y a un tel code:

void onTextChanged(CharSequence newText) { 
    ... 
    if (mOnQueryChangeListener != null && !TextUtils.equals(newText, mOldQueryText)) { 
     mOnQueryChangeListener.onQueryTextChange(newText.toString()); 
    } 
    mOldQueryText = newText.toString(); 
} 

Ainsi, l'ancien texte de la requête sera mis à jour deux fois - première fois avec la bonne requête "ABC", et la deuxième fois avec un mauvais "ABC ..", comme je le comprends bien.

Je vais demander autre question séparément sur la modification de la requête après onQueryTextChange

0

Merci beaucoup à @pskink!

J'ai implémenté SearchView personnalisé avec une requête d'entrée de filtre et la possibilité de désactiver le déclenchement onQueryTextChange sur setQuery. C'est Kotlin, passons à cette belle langue :) J'espère que ça va être utile pour quelqu'un.

est ici Code on Gist

+0

il ya une faute de frappe: 'CustomNumberKeyLister' ->' CustomNumberKeyListener', aussi qu'est-ce que vous avez besoin de 'shouldChangeListenerBeInvoked' pour? – pskink

+0

si vous souhaitez désactiver 'onQueryTextChange' juste une fois lors de la définition de l'écouteur de désactivation du texte de requête avant d'appeler' super.setQuery (query, submit) 'et l'activer juste après - donc pas besoin de' CustomQueryTextListener' et 'shouldChangeListenerBeInvoked' amd 'mOnQueryChangeListener' – pskink

+0

Merci pour vos remarques!Pour désactiver cet écouteur où? Dans votre activité? Je pense qu'il vaut mieux implémenter une classe personnalisée et sans aucun changement dans votre activité. Quoi qu'il en soit, je décide juste de montrer la résolution possible, je ne prétends pas sur le meilleur :) – DefaultXYZ