Android: pourquoi définir la visibilité(View.GONE); ou setVisibility(View.INVISIBLE); ne fonctionne pas
je veux que mon DatePicker
et le bouton pour être invisible au début. Et quand j'appuie sur mon bouton magique je veux régler la visibilité(vue.Visible);
le problème ici est quand je setVisibility(View.GONE)
ou setVisibility(View.INVISIBLE)
rien ne change et 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());
}
});
7 réponses
je vois pas mal de choses qui ne vont pas. Pour commencer, vous n'avez pas de bouton magique défini et il n'y a pas de gestionnaire d'événements.
vous ne devriez pas non plus utiliser:
dp2.setVisibility(View.GONE);
dp2.setVisibility(View.INVISIBLE);
N'utilisez qu'un des deux. À partir de documentation Android:
vue.Partie cette vue est invisible, et il ne faut pas de place pour la disposition.
vue.INVISIBLE cette vue est invisible, mais elle prend de la place pour la mise en but.
Dans votre exemple, vous écrasez la View.GONE
affectation 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);
}
on peut le considérer comme une visibilité et un affichage de style CSS.
<div style="visibility:visible; display:block">
This is View.VISIBLE : Content is displayed normally.
</div>
<div style="visibility:hidden; display:block">
This is View.INVISIBLE : Content is not displayed, but div still takes up place, but empty.
</div>
<div style="display:none">
This is View.GONE : Container div is not shown, you can say the content is not displayed.
</div>
voir d'Abord votre code:
dp2.setVisibility(View.GONE);
dp2.setVisibility(View.INVISIBLE);
btn2.setVisibility(View.GONE);
btn2.setVisibility(View.INVISIBLE);
ici vous mettez les deux visibilités sur le même champ donc c'est le problème. Je donne un exemple pour que exemple de démo
vue.Partie cette vue est invisible, et il ne faut pas d'espace pour les besoins de la disposition.
vue.INVISIBLE cette vue est invisible, mais elle occupe tout de même de l'espace à des fins de 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ù j'effectuais l'action suivante:
myViewGroup.setVisibility(View.GONE);
Droit sur l'image suivante, j'ai été l'exécution d'une if
Vérifiez ailleurs l'état de visibilité de cette vue. Et devinez quoi? La condition suivante passait:
if(myViewGroup.getVisibility() == View.VISIBLE) {
// this if check was fulfilled magically
}
placer les points de rupture que vous voyez, que la visibilité change à GONE
, mais à droite sur le prochain cadre il devient comme par magie VISIBLE
. J'essayais de comprendre comment diable cela pouvait arriver.
il S'avère Qu'il y avait une animation appliquée à cette vue, ce qui à l'interne a fait changer la vue de visibilité à VISIBLE
jusqu'à la fin de l'animation:
public void someFunction() {
...
TransitionManager.beginDelayedTransition(myViewGroup);
...
myViewGroup.setVisibility(View.GONE);
}
Si vous débogage, vous verrez que myViewGroup
en effet change sa visibilité à GONE
, mais à droite sur la prochaine image il redeviendrait visible dans l'ordre d'exécution de l'animation.
donc, si vous rencontrez une telle situation, assurez-vous de ne pas effectuer un if
vérifier dans milieu de l'animation de la vue.
vous pouvez supprimer toutes les animations sur la vue via vue.clearAnimation ().
vue.GONE rend la vue invisible sans que la vue occupe de la place dans la disposition. Vue.INVISIBLE rend la vue invisible en prenant encore de l'espace.
vous utilisez D'abord GONE puis INVISIBLE sur la même vue.Depuis, le code est exécuté séquentiellement, d'abord la vue disparaît, puis elle est écrasée par le type INVISIBLE qui prend encore de l'espace.
vous devez ajouter le bouton Écouter sur le bouton et à l'intérieur de la méthode onClick() rendre les vues visibles. Ce 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 ça devrait marcher facilement. Espérons que cette aide.
parce que vous définissez la visibilité soit vrai soit faux.
essayer
setVisible(0)
visible vrai .
and setVisible(4)
visible à false.