66 votes

Android: pourquoi setVisibility (View.GONE); ou setVisibility (View.INVISIBLE); ne fonctionnent pas

Je veux que mon DatePicker et le bouton soient invisibles au début. Et quand je presse mon bouton magique, je veux faire setVisibility(View.VISIBLE);

`Le problème ici est quand je faissetVisibility(View.GONE)ousetVisibility(View.INVISIBLE)` rien ne change et le composant reste visible.

final DatePicker dp2 = (DatePicker) findViewById(R.id.datePick2);
final Button btn2 = (Button) findViewById(R.id.btnDate2);

dp2.setVisibility(View.GONE);
dp2.setVisibility(View.INVISIBLE);
btn2.setVisibility(View.GONE);
btn2.setVisibility(View.INVISIBLE);

btn2.setOnClickListener(new View.OnClickListener() {
    public void onClick(View arg0) {
        TextView txt2 = (TextView) findViewById(R.id.txt2);
        txt2.setText("Vous avez sélectionné " + dp2.getDayOfMonth()
            + "/" + (dp2.getMonth() + 1) + "/" + dp2.getYear());
    }
});``

1voto

Pankaj Talaviya Points 1218

View.GONE Cette vue est invisible et ne prend pas de place pour des raisons de mise en page.

View.INVISIBLE Cette vue est invisible, mais elle prend toujours de la place pour des raisons de mise en page.

dp2.setVisibility(View.GONE);
dp2.setVisibility(View.INVISIBLE);
btn2.setVisibility(View.GONE);
btn2.setVisibility(View.INVISIBLE);

1voto

Trishant Sharma Points 105

View.GONE rend la vue invisible sans que la vue occupe de l'espace dans la mise en page. View.INVISIBLE rend la vue simplement invisible en occupant toujours de l'espace.

Vous utilisez d'abord GONE puis INVISIBLE sur la même vue. Comme le code est exécuté de manière séquentielle, la vue devient d'abord GONE puis est remplacée par le type INVISIBLE tout en occupant de l'espace.

Vous devriez ajouter un écouteur de bouton sur le bouton et à l'intérieur de la méthode onClick() rendre les vues visibles. Cela devrait être la logique selon moi dans votre méthode onCreate().

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_setting);

    final DatePicker dp2 = (DatePicker) findViewById(R.id.datePick2);
    final Button btn2 = (Button) findViewById(R.id.btnDate2);
    final Button btn3 = (Button) findViewById(R.id.btnVisibility);

    dp2.setVisibility(View.INVISIBLE);
    btn2.setVisibility(View.INVISIBLE);

    bt3.setOnClickListener(new View.OnCLickListener(){ 
    @Override
    public void onClick(View view)
    {
        dp2.setVisibility(View.VISIBLE);
        bt2.setVisibility(View.VISIBLE);
    }
  });
}

Je pense que cela devrait fonctionner facilement. J'espère que cela vous aidera.

1voto

Ceci est pour quelqu'un qui a essayé toutes les réponses et a quand même échoué. En prolongeant la réponse de pierre. Si vous utilisez une animation, définir la visibilité sur GONE ou INVISIBLE ou invalidate() ne fonctionnera jamais. Essayez la solution ci-dessous.

btn2.getAnimation().setAnimationListener(new Animation.AnimationListener() {
     @Override
     public void onAnimationStart(Animation animation) {
     }
     @Override
     public void onAnimationEnd(Animation animation) {
         btn2.setVisibility(View.GONE);
         btn2.clearAnimation();
     }
     @Override
     public void onAnimationRepeat(Animation animation) {
     }
});

`

0voto

Sai Teja Points 1

J'étais également confronté au même problème, si ce fragment particulier est gonflé sur plusieurs écrans, il y a une chance que les modes de visibilité définis à l'intérieur des déclarations if ne fonctionnent pas selon nos besoins car la condition peut avoir été réinitialisée lorsqu'il est gonflé un certain nombre de fois dans notre application.

Dans mon cas, je dois changer le mode de visibilité dans un fragment (fragment enfant) en fonction d'un bouton cliqué dans un autre fragment (fragment parent). J'ai donc stocké la valeur booléenne buttonClicked dans une variable du fragment parent et je l'ai passée en paramètre à une fonction dans le fragment enfant. Ainsi, les modes de visibilité dans les fragments enfants sont modifiés en fonction de cette valeur booléenne reçue via le paramètre. Mais comme ce fragment enfant est gonflé sur plusieurs écrans, les modes de visibilité continuent de se réinitialiser même si je le rends caché en utilisant View.GONE.

Pour éviter ce conflit, j'ai déclaré une variable booléenne statique dans le fragment enfant et chaque fois que cette valeur booléenne est reçue du fragment parent, je l'ai stockée dans la variable statique et j'ai ensuite modifié les modes de visibilité en fonction de cette variable statique dans le fragment enfant.

Cela a résolu le problème pour moi.

0voto

tanaijing Points 1

J'ai eu le même problème une fois. Appeler "invalidate" après avoir changé la visibilité fonctionne presque toujours, mais dans certains cas, cela ne fonctionne pas. J'ai dû tricher et définir l'arrière-plan sur une image transparente et mettre le texte à "".

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