73 votes

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

Je suis confus :

D'après ce que j'ai lu, une vue avec setVisibility(View.GONE) ; ne devrait plus recevoir d'événements de contact ou de clic. Ma mise en page comporte deux parties qui seront chacune visible ou disparue afin 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 elle réagit toujours à onClick (et consomme l'événement que l'autre vue devrait recevoir).

Pouvez-vous m'aider ?

Cela peut être intéressant : Lorsque je démarre mon projet, une vue disparaît, l'autre est visible. Cette fois, cela fonctionnera comme prévu (la vue GONE est fondamentalement ignorée), mais après avoir défini View.GONE dans le code, cela cessera de fonctionner.

109voto

edovino Points 1508

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

100voto

Pavel Alexeev Points 1680

Si vous définissez setVisibility(View.GONE) après une certaine animation (un fondu, par exemple), essayez d'effacer l'animation avec clearAnimation() - c'est ce qui m'aide.

8voto

Anil Points 26

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

2voto

Siebe Points 73

Ce que je pense, c'est que vous rendez une vue invisible, mais que les enfants de la vue répondent toujours aux clics (c'est-à-dire que votre vue est un ViewGroup). Vous pourriez faire quelque chose du genre :

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, il faut 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 a fonctionné pour moi dans le passé. Je ne connais pas actuellement de meilleure façon de procéder.

1voto

M.E. Points 218

J'aurais bien posté ce message en tant que commentaire, mais malheureusement je n'ai pas pu le faire. Comme cela pourrait être une solution possible pour vous, je le poste de cette façon :

Comme vous écrivez "onClick", je suppose que vous utilisez la fonction onClick dans votre mise en page XML. Essayez de définir un OnClickListener con setOnClickListener au lieu de la onClick attribut. Peut-être que cela vous aidera...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X