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());
    }
});``

127voto

con_9 Points 1082

Je vois quelques problèmes. Pour commencer, vous n'avez pas défini votre bouton magique et il n'y a pas de gestionnaire d'événements pour cela.

De plus, vous ne devriez pas utiliser:

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

Utilisez seulement un des deux. Du documentation Android:

View.GONE Cette vue est invisible et ne prend pas de place pour le layout.

View.INVISIBLE Cette vue est invisible, mais elle prend toujours de la place pour le layout.

Dans votre exemple, vous écrasez l'affectation de View.GONE avec celle de View.INVISIBLE.


Essayez de remplacer:

final DatePicker dp2 = new DatePicker(this)

avec:

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

De même pour d'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);
}

17voto

Aujourd'hui, j'ai eu un scénario, où j'ai effectué ce qui suit :

myViewGroup.setVisibility(View.GONE);

Juste dans le frame suivant, j'ai effectué une vérification if ailleurs pour l'état de visibilité de cette vue. Devine quoi ? La condition suivante passait :

if(myViewGroup.getVisibility() == View.VISIBLE) {
    // cette condition `if` était étonnamment remplie
}

En plaçant des points d'arrêt, vous pouvez voir que la visibilité change en GONE, mais juste dans le frame suivant, elle devient mystérieusement VISIBLE. J'essayais de comprendre comment diable cela pouvait se produire.

Il s'avère qu'une animation était appliquée à cette vue, ce qui a provoqué un changement interne de la visibilité de la vue 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 juste dans le frame suivant, elle redeviendra visible pour exécuter l'animation.

Donc, si vous vous retrouvez dans une telle situation, assurez-vous de ne pas effectuer de vérification if au milieu de l'animation de la vue.

Vous pouvez supprimer toutes les animations sur la vue via [View.clearAnimation()](https://developer.android.com/reference/android/view/View.html#clearAnimation()).

12voto

azur Points 229

Vous pouvez le considérer comme une visibilité de style CSS & afficher.

    C'est View.VISIBLE : Le contenu est affiché normalement.

    C'est View.INVISIBLE : Le contenu n'est pas affiché, mais le div occupe quand même de la place, mais vide.

    C'est View.GONE : Le div conteneur n'est pas affiché, vous pouvez dire que le contenu n'est pas affiché.

6voto

Parag Chauhan Points 11830

Tout d'abord, voir votre code:

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

Ici, vous définissez la visibilité des deux champs de la même manière, c'est pourquoi il y a un problème. Je donne un exemple pour cela exemple de démo

0 votes

ArrayAdapter adapter7 = new ArrayAdapter(Application.getContext(), android.R.layout.simple_spinner_item, options()); Spinner spinnerEnd = (Spinner) findViewById(R.id.spinnerEnd); adapter7.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerEnd.setAdapter(adapter7); spinnerEnd.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { public void onItemSelected(AdapterView adapterView, View view, int i, long l) { dp2.setVisibility(View.VISIBLE); btn2.setVisibility(View.VISIBLE);

0 votes

Le problème vient d'ici. Parce que ça entre à l'intérieur de onItemSelect

0 votes

Essayez ceci Button btn1,btn2; Spinner spin; btn1=(Button)findViewById(R.id.button1); spin=(Spinner)findViewById(R.id.spinner1); String[] sample11={"Exemple","Salut"}; spin=(Spinner)findViewById(R.id.spinner1); ArrayAdapter adapter = new ArrayAdapter (this, android.R.layout.simple_spinner_item,sample11); spin.setAdapter(adapter); btn1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub spin.setVisibility(View.GONE); } });

4voto

Pierre Points 659

Dans mon cas, j'ai constaté que simplement effacer l'animation sur la vue avant de définir la visibilité sur GONE fonctionne.

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

J'ai eu un problème similaire où je bascule entre deux vues, dont l'une doit toujours commencer par être GONE - Mais quand j'affichais à nouveau les vues, elle s'affichait par-dessus la première vue même si setVisibility(GONE) était appelée. Effacer l'animation avant de définir la vue sur GONE a fonctionné.

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