it-swarm.it

Android: perché setVisibility (View.GONE); o setVisibility (View.INVISIBLE); non lavorare

Voglio che la mia DatePicker e il pulsante siano invisibili all'inizio. E quando premo il mio pulsante magico voglio impostareVisibility (View.Visible);

Il problema qui è quando I setVisibility(View.GONE) o setVisibility(View.INVISIBLE) non cambia nulla e il componente è ancora visibile.

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

Vedo diverse cose sbagliate Per i principianti, non hai il tuo pulsante magico definito e non c'è nessun gestore di eventi per questo.

Inoltre non dovresti usare:

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

Usa solo uno dei due. Da Documentazione di Android :

View.GONE Questa vista è invisibile e non richiede spazio per scopi di layout. 

View.INVISIBLE Questa vista è invisibile, ma comunque occupa spazio per scopi di layout.

Nel tuo esempio, stai annullando l'assegnazione View.GONE con View.INVISIBLE.


Prova a sostituire:

final DatePicker dp2 = new DatePicker(this)

con:

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

Allo stesso modo per altri widget:

    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

Per prima cosa vedi il tuo codice: 

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

Qui si imposta sia la visibilità allo stesso campo, quindi questo è il problema . Fornisco un campione per quella demo di esempio

6
Parag Chauhan

Oggi ho avuto uno scenario, in cui stavo eseguendo l'azione seguente:

myViewGroup.setVisibility(View.GONE);

Proprio sul fotogramma successivo stavo eseguendo un if controlla altrove per lo stato di visibilità di quella vista. E indovina cosa? La seguente condizione stava passando:

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

Mettendo i breakpoint che vedi, quella visibilità cambia in GONE, ma proprio sul fotogramma successivo diventa magicamente VISIBLE. Stavo cercando di capire come diavolo potrebbe succedere. 

Risulta che è stata applicata un'animazione a questa vista, che ha causato internamente alla vista di cambiare la sua visibilità a VISIBLE fino a quando l'animazione non è stata completata:

public void someFunction() {
    ...
    TransitionManager.beginDelayedTransition(myViewGroup);
    ...

    myViewGroup.setVisibility(View.GONE);
}

Se esegui il debug, vedrai che myViewGroup cambierà davvero la sua visibilità in GONE, ma proprio nel prossimo fotogramma sarebbe di nuovo visibile per l'esecuzione dell'animazione.

Quindi, se ti imbatti in una situazione del genere, assicurati di non eseguire un controllo if durante l'animazione della vista.

È possibile rimuovere tutte le animazioni sulla vista tramite View.clearAnimation () .

3
azizbekian

View.GONE Questa vista è invisibile e non occupa spazio ai fini del layout.

View.INVISIBLE Questa vista è invisibile, ma occupa ancora spazio per scopi di layout.

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

View.GONE rende invisibile la vista senza che la vista occupi spazio nel layout . View.INVISIBLE rende la vista appena invisibile ancora occupando spazio.

Stai usando prima GONE e poi INVISIBLE sulla stessa vista. Dal momento che il codice viene eseguito in sequenza, prima la vista diventa GONE, quindi viene sovrascritta dal tipo INVISIBILE che occupa ancora spazio. 

È necessario aggiungere listener di pulsanti sul pulsante e all'interno del metodo onClick () rendere visibili le viste. Questa dovrebbe essere la logica secondo me nel tuo metodo 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);
    }
  });
}

Penso che questo dovrebbe funzionare facilmente. Spero che questo ti aiuti.

0
Trishant Sharma