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());
    }
});
44
demandé sur azizbekian 2011-09-08 16:39:27

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);
}
93
répondu con_9 2017-01-28 17:28:04

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>
8
répondu az3 2013-03-04 11:10:35

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

6
répondu Parag Chauhan 2013-05-06 20:57:02

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);
1
répondu Pankaj Talaviya 2016-08-30 11:50:10

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 ().

1
répondu azizbekian 2017-01-03 23:16:52

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.

0
répondu Trishant Sharma 2018-02-28 11:22:00

parce que vous définissez la visibilité soit vrai soit faux. essayer setVisible(0) visible vrai . and setVisible(4) visible à false.

-23
répondu ali 2012-04-05 13:01:39