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 j’appuie sur mon bouton magique, je veux régler la visibilité (View.Visible);

Le problème ici est que je ne setVisibility(View.GONE) ou setVisibility(View.INVISIBLE) et que le composant est toujours 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("You selected " + dp2.getDayOfMonth() + "/" + (dp2.getMonth() + 1) + "/" + dp2.getYear()); } }); 

Je vois pas mal de choses mal. Pour les débutants, votre bouton magique n’est pas défini et il n’y a pas de gestionnaire d’événement correspondant.

Aussi, vous ne devriez pas utiliser:

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

Utilisez seulement l’un des deux. De la documentation Android :

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

View.INVISIBLE Cette vue est invisible, mais elle occupe tout de même de la place pour la mise en page.

Dans votre exemple, vous View.GONE affectation View.GONE par celle View.INVISIBLE .


Essayez de remplacer:

 final DatePicker dp2 = new DatePicker(this) 

avec:

 DatePicker dp2 = (DatePicker) findViewById(R.id.datePick2); 

De même pour les autres widgets:

  public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout ll = new LinearLayout(this); ll.setOrientation(LinearLayout.VERTICAL); final DatePicker dp2 = new DatePicker(this); final Button btn2 = new Button(this); final Button magicButton = new Button(this); final TextView txt2 = new TextView(TestActivity.this); dp2.setVisibility(View.GONE); btn2.setVisibility(View.GONE); btn2.setText("set Date"); btn2.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) { txt2.setText("You selected " + dp2.getDayOfMonth() + "/" + (dp2.getMonth() + 1) + "/" + dp2.getYear()); } }); magicButton.setText("Magic Button"); magicButton.setOnClickListener(new View.OnClickListener() public void onClick(View arg0) { dp2.setVisibility(View.VISIBLE); btn2.setVisibility(View.VISIBLE); } }); ll.addView(dp2); ll.addView(btn2); ll.addView(magicButton); ll.addView(txt2); setContentView(ll); } 

Vous pouvez le considérer comme une visibilité et un affichage de style CSS.

 
This is View.VISIBLE : Content is displayed normally.
This is View.INVISIBLE : Content is not displayed, but div still takes up place, but empty.
This is View.GONE : Container div is not shown, you can say the content is not displayed.

Commencez par voir votre code:

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

Ici, vous définissez les deux visibilité sur le même champ, donc c’est le problème. Je donne un échantillon pour cette démo échantillon

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

View.INVISIBLE Cette vue est invisible, mais elle occupe tout de même de la place pour la mise en page.

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

Aujourd’hui, j’ai eu un scénario où je faisais les actions suivantes:

 myViewGroup.setVisibility(View.GONE); 

Juste sur l’image suivante, j’effectuais un contrôle if quelque part ailleurs pour l’état de visibilité de cette vue. Et devine quoi? La condition suivante passait:

 if(myViewGroup.getVisibility() == View.VISIBLE) { // this if check was fulfilled magically } 

En plaçant des points d’arrêt, vous voyez que la visibilité change en GONE , mais l’image suivante devient VISIBLE . J’essayais de comprendre comment ça pouvait arriver.

Il se trouve qu’une animation a été appliquée à cette vue, ce qui a provoqué en interne une modification de la visibilité de VISIBLE jusqu’à la fin de l’animation:

 public void someFunction() { ... TransitionManager.beginDelayedTransition(myViewGroup); ... myViewGroup.setVisibility(View.GONE); } 

Si vous déboguez, vous verrez que myViewGroup change effectivement sa visibilité en GONE , mais à la prochaine image, il redevient visible pour que l’animation s’exécute.

Donc, si vous rencontrez une telle situation, assurez-vous que vous n’effectuez pas de vérification de l’animation de la vue.

Vous pouvez supprimer toutes les animations de la vue via View.clearAnimation () .

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 tout en prenant de la place.

Vous utilisez d’abord GONE, puis INVISIBLE sur la même vue. Depuis que le code est exécuté séquentiellement, la vue devient d’abord GONE, puis elle est remplacée par le type INVISIBLE qui occupe toujours de l’espace.

Vous devez append 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); dp2.setVisibility(View.INVISIBLE); btn2.setVisibility(View.INVISIBLE); bt2.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 t’aides.

Parce que vous définissez la visibilité sur true ou false. essayez que setVisible(0) visible vrai. and setVisible(4) à visible false.