studio setvisibility ocultar mostrar hacer gone botones animar java android android-layout android-view android-datepicker

java - setvisibility - ocultar y mostrar botones android studio



Android: por qué setVisibility(View.GONE); o setVisibility(View.INVISIBLE); No funcionan (7)

Quiero que mi DatePicker y el botón sean invisibles al principio. Y cuando presiono mi botón mágico, quiero establecer la visibilidad (View.Visible);

El problema aquí es cuando setVisibility(View.GONE) o setVisibility(View.INVISIBLE) nada cambia y el componente sigue siendo 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()); } });


Hoy tuve un escenario donde estaba realizando la siguiente acción:

myViewGroup.setVisibility(View.GONE);

Justo en el siguiente fotograma estaba realizando una comprobación en otro lugar para ver el estado de visibilidad de esa vista. ¿Y adivina qué? La siguiente condición estaba pasando:

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

Al colocar los puntos de interrupción que ve, esa visibilidad cambia a GONE , pero justo en el siguiente cuadro mágicamente se vuelve VISIBLE . Intentaba entender cómo demonios podría pasar esto.

Resulta que hubo una animación aplicada a esta vista, que internamente hizo que la vista cambiara su visibilidad a VISIBLE hasta que terminara la animación:

public void someFunction() { ... TransitionManager.beginDelayedTransition(myViewGroup); ... myViewGroup.setVisibility(View.GONE); }

Si depura, verá que myViewGroup cambia su visibilidad a GONE , pero en el siguiente cuadro volverá a estar visible para que la animación se ejecute.

Por lo tanto, si te encuentras con una situación así, asegúrate de que no estés realizando un control if en la animación de la vista.

Puede eliminar todas las animaciones en la vista a través de View.clearAnimation() .


Porque establece la visibilidad ya sea verdadera o falsa. intenta ese setVisible(0) a verdadero visible. and setVisible(4) a falso visible.


Primero, mira tu código:

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

Aquí establece ambas visibilidad en el mismo campo, así que ese es el problema. Doy una muestra para esa demostración de muestra


Puedes pensarlo como una visualización y visibilidad de estilo 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>


Veo bastantes cosas mal. Para empezar, no tiene definido su botón mágico y no hay un controlador de eventos para él.

Además, no deberías usar:

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

Usa solo uno de los dos. De la documentación de Android :

View.GONE Esta vista es invisible y no ocupa espacio para fines de diseño.

View.INVISIBLE Esta vista es invisible, pero aún ocupa espacio para propósitos de diseño.

En su ejemplo, está anulando la asignación de View.GONE con View.INVISIBLE .

Intenta reemplazar:

final DatePicker dp2 = new DatePicker(this)

con:

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

Del mismo modo para otros 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); }


View.GONE Esta vista es invisible y no ocupa espacio para fines de diseño.

View.INVISIBLE Esta vista es invisible, pero aún ocupa espacio para propósitos de diseño.

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


View.GONE hace que la vista sea invisible sin que la vista ocupe espacio en el diseño. View.INVISIBLE hace que la vista sea invisible y ocupa espacio.

Primero está usando GONE y luego INVISIBLE en la misma vista. Dado que el código se ejecuta de forma secuencial, primero la vista se convierte en GONE y luego se reemplaza por el tipo INVISIBLE que aún ocupa espacio.

Debe agregar oyente de botón en el botón y dentro del método onClick () hacer visibles las vistas. Esta debería ser la lógica de acuerdo a mí en su método 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); } }); }

Creo que esto debería funcionar fácilmente. Espero que esto ayude.