web-dev-qa-db-fra.com

android View avec View.GONE reçoit toujours onTouch et onClick

Cela me déroute:

Pour autant que j'ai lu, une vue avec setVisibility (View.GONE); ne doit plus recevoir d’événements tactiles ou de clic ..__ Ma mise en page se compose de deux parties visibles ou disparues, de sorte qu’une seule d’entre elles soit visible et utilisable à la fois, mais View.GONE ne fait pas l'affaire. Je ne peux pas voir la vue GONE, comme prévu, mais il réagit toujours à onClick (et consomme l’événement que l’autre vue devrait obtenir).

Pouvez-vous m'aider?

Peut-être d'intérêt: Lorsque je commence mon projet, une vue est GONE, l'autre visible. Cette fois, cela fonctionnera comme prévu (la vue GONE est fondamentalement ignorée), mais après avoir défini View.GONE via le code, elle ne fonctionnera plus.

70
ShadowMare

Utilisez-vous peut-être des animations pour afficher/masquer les vues? J'obtiens ce comportement lorsque j'utilise des animations sous Android: fillEnabled = "true" Android: fillAfter = "true" Je ne comprends pas et ressemble à un bogue - si j'utilise des animations sans fillEnabled/fillAfter, tout fonctionne comme prévu...

106
edovino

Si vous définissez setVisibility(View.GONE) après une animation (fondu, par exemple), essayez d'effacer l'animation avec clearAnimation(). C'est ce qui m'a aidé.

98
Pavel Alexeev

Essayez de définir false sur false pour la propriété clickable en utilisant setClickable (false) après setVisibility (View.GONE).

8
Anil

Oui, mview.clearAnimation() a quelques problèmes, mais amination.setFillAfter(false); et mview.setClickable(false); WORKS sont parfaits.

5
Hemant Shori

Ce à quoi je m'attends, c'est que vous rendiez une vue invisible, mais que les enfants de la vue répondent toujours aux clics (votre vue est un ViewGroup). Vous pouvez faire quelque chose comme:

private void hideTheChildren(View v){
    if(v instanceof ViewGroup) {
        int count = ((ViewGroup)v).getChildCount();
        for(int k = 0 ; k < count ; k++) {
            hideTheChildren(((ViewGroup)v).getChildAt(k));
        }
        v.setVisibility(View.GONE);
    }
    else {
        v.setClickable(false);
        v.setVisibility(View.GONE);
    }
}

bien sûr, alors vous devez aussi faire le contraire

private void showTheChildren(View v){
    if(v instanceof ViewGroup) {
        int count = ((ViewGroup)v).getChildCount();
        for(int k = 0 ; k < count ; k++) {
            showTheChildren(((ViewGroup)v).getChildAt(k));
        }
        v.setVisibility(View.VISIBLE);
    }
    else {
        v.setClickable(true);
        v.setVisibility(View.VISIBLE);
    }
}

Cela avait fonctionné pour moi, par le passé. Je ne connais pas actuellement un meilleur moyen de le faire.

2
Siebe

Pour ceux qui ont répondu aux questions ci-dessus et qui n'ont toujours pas résolu leurs problèmes, je recommande de supprimer la vue de la vue parent. Si vous avez besoin d'afficher à nouveau la vue, faites-en une copie et ajoutez-la à la vue parent. 

Cela peut sembler exagéré, mais je cachais/montrais des groupes de vues entiers; dans votre cas, il pourrait s’agir d’un bouton, d’un texte ou d’une image, cette solution fonctionnera toujours.

1
Kim Montano

J'aurais poster cela comme un commentaire, mais malheureusement je n'ai pas pu poster un commentaire. Comme cela pourrait être une solution possible pour vous, je le publie de cette façon:

En écrivant "onClick", je suppose que vous utilisez l'attribut onClick dans votre présentation XML. Essayez de définir OnClickListener avec setOnClickListener au lieu de l'attribut onClick. Peut-être que ça aide ... 

1
M.E.

si vous avez une animation dans la vue, vous devez appeler view.clearAnimation. 

0
LingYFH

essayez d’ajouter .clearAnimation () à la substitution onAnimationEnd.

0
doodlleus