Domanda

Voglio le mie DatePicker e il pulsante per essere invisibile all'inizio. E quando premo il mio pulsante magico voglio setVisibilità (View.Visible);

Il problema qui è quando io setVisibility(View.GONE) o setVisibility(View.INVISIBLE) Nulla cambia 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());
    }
});
È stato utile?

Soluzione

Vedo alcune cose sbagliate. Per cominciare, non hai definito il tuo pulsante magico e non c'è un gestore di eventi per questo.

Inoltre non dovresti usare:

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

Usa solo uno dei due. Da Documentazione Android:

View.gone Questa vista è invisibile e non impiega spazio a scopi di layout.

Visualizza. Invisibile questa vista è invisibile, ma occupa ancora spazio per scopi di layout.

Nel tuo esempio, stai preparando al View.GONE assegnazione con il View.INVISIBLE uno.


Prova a sostituire:

final DatePicker dp2 = new DatePicker(this)

insieme a:

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

Altri suggerimenti

Puoi pensarlo come visibilità e display in stile 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>

Prima vedi il tuo codice:

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

Qui hai impostato entrambi la visibilità nello stesso campo in modo che questo sia il problema. Do un campione per questo DEMO campione

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

myViewGroup.setVisibility(View.GONE);

Proprio sul frame successivo stavo eseguendo un if Controlla da qualche altra parte per lo stato di visibilità di quella visione. E indovina cosa? La seguente condizione era il passaggio:

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

Posizionando i punti di interruzione che vedi, a cui cambia la visibilità GONE, ma proprio sulla cornice successiva diventa magicamente VISIBLE. Stavo cercando di capire come diavolo potesse accadere.

Si scopre che c'è stata un'animazione applicata a questa visione, che ha fatto cambiare la visione internamente la sua visibilità VISIBLE fino a quando non si termina l'animazione:

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

    myViewGroup.setVisibility(View.GONE);
}

Se il debug, lo vedrai myViewGroup in effetti cambia la sua visibilità a GONE, ma proprio sulla cornice successiva sarebbe diventato di nuovo visibile per eseguire l'animazione.

Quindi, se ti imbatti con una situazione del genere, assicurati di non eseguire un if Controllare in mezzo all'animazione della vista.

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

View.gone Questa vista è invisibile e non impiega spazio a scopi di layout.

Visualizza. Invisibile 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);

View.gone rende la vista invisibile senza la vista occupare spazio nel layout. View.Invisible rende la vista invisibile ancora occupare spazio.

Stai prima usando Gone e poi invisibile sulla stessa vista. Dal punto di vista, il codice viene eseguito in sequenza, prima la vista diventa sparita quindi viene annullata dal tipo invisibile che ancora occupano spazio.

È necessario aggiungere un 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 sia di aiuto.

Nel mio caso ho scoperto che semplicemente cancellando l'animazione sulla vista prima di impostare la visibilità GONE lavori.

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

Ho avuto un problema simile in cui ho attivato tra due visualizzazioni, una delle quali deve sempre iniziare come GONE - ma quando ho mostrato di nuovo le viste, stava visualizzando sopra la prima vista anche se setVisibility(GONE) è stato chiamato. Cancellare l'animazione prima di impostare la vista su GONE lavorato.

setvisibilità non funzionano anche per me

fabCamera.setVisibility(View.GONE);

quell'errore è:

VisibilityAwareImageButton.setVisibility can only be called from within the same library group (groupId=com.google.android.material)

Sono in Androidx e ho provato a importare com.google.android.material ma non ha funzionato

Perché imposti visibilità vera o falsa. prova questosetVisible(0) a visibile vero.and setVisible(4) a visibile falso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top