web-dev-qa-db-fra.com

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

Je veux que ma DatePicker et le bouton soient invisibles au début. Et quand j'appuie sur mon bouton magique, je veux définir la visibilité (View.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());
    }
});
47
nayden

Je vois pas mal de choses. Pour commencer, votre bouton magique n’est pas défini et il n’existe aucun gestionnaire d’événements.

Aussi, vous ne devriez pas utiliser:

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

Utilisez seulement l'un des deux. De documentation Android :

View.GONE Cette vue est invisible et ne nécessite aucun espace pour des fins de mise en page. 

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

Dans votre exemple, vous remplacez l'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);
}
94
con_9

Vous pouvez le penser 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
az3

Tout d'abord voir votre code: 

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

Ici, vous réglez la visibilité sur le même champ, donc c’est le problème ..__Je donne un exemple pour cette exemple de démonstration

6
Parag Chauhan

Aujourd'hui, j'ai eu un scénario dans lequel je réalisais les actions suivantes:

myViewGroup.setVisibility(View.GONE);

À droite de l'image suivante, j'effectuais une vérification if afin de vérifier 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 visibles, la visibilité devient GONE, mais elle devient comme suit VISIBLE. J'essayais de comprendre comment diable cela pouvait arriver. 

Il s'est avéré qu'une animation avait été appliquée à cette vue, ce qui a amené la vue à changer sa visibilité en 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 il sera de nouveau visible sur l'image suivante pour que l'animation s'exécute.

Donc, si vous rencontrez une telle situation, assurez-vous de ne pas effectuer une vérification if en cours d'animation de la vue.

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

3
azizbekian

View.GONE Cette vue est invisible et ne nécessite aucun espace pour la mise en page.

View.INVISIBLE Cette vue est invisible mais elle occupe toujours de la place pour la mise en page.

dp2.setVisibility(View.GONE);
dp2.setVisibility(View.INVISIBLE);
btn2.setVisibility(View.GONE);
btn2.setVisibility(View.INVISIBLE);
1
Pankaj Talaviya

View.GONE rend la vue invisible sans que la vue ne prenne de la place dans la mise en page . View.INVISIBLE rend la vue invisible, mais occupe encore de la place.

Vous utilisez d'abord GONE puis INVISIBLE sur la même vue. Depuis, le code est exécuté de manière séquentielle. D'abord, la vue devient GONE puis elle est remplacée par le type INVISIBLE qui occupe toujours de la place. 

Vous devez ajouter un écouteur de bouton sur le bouton et dans la méthode onClick () pour 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.

0
Trishant Sharma