Android – Llamando GONE y VISIBLE hace que la vista se muestre en el lugar equivocado

Tengo dos vistas, A y B, y la vista A está por encima de la vista B (ambas son disposiciones lineales).

Cuando yo, programáticamente, fijar la vista A a GONE, desaparece y la vista que estaba justo debajo de ella (B) va al lugar de la vista A (como se esperaba).

Sin embargo, cuando establezco la misma vista (A) a VISIBLE de nuevo, se muestra sobre la vista B. No quiero eso. Quiero que la vista B vuelva a su posición original (debajo de la vista A), que es lo que pensé que iba a pasar (pero no lo hace). ¿Cómo puedo hacer eso?

¡Gracias de antemano!

EDITAR – Código

package com.test; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.animation.ScaleAnimation; import android.view.animation.Transformation; import android.widget.LinearLayout.LayoutParams; public class ViewGoneEffectActivity extends Activity implements OnClickListener { private View viewComEfeito = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViewById(R.id.outroLinear).setOnClickListener(this); findViewById(R.id.segundo).setOnClickListener(this); viewComEfeito = findViewById(R.id.outroLinear); } @Override public void onClick(View view) { if (view.getId() == R.id.outroLinear) { view.startAnimation(new MyScaler(1.0f, 1.0f, 1.0f, 0.0f, 500, view, true)); }else if(view.getId() == R.id.segundo){ viewComEfeito.setVisibility(View.VISIBLE); } } public class MyScaler extends ScaleAnimation { private LayoutParams mLayoutParams; private int mMarginBottomFromY, mMarginBottomToY; private boolean mVanishAfter = false; public MyScaler(float fromX, float toX, float fromY, float toY, int duration, View view, boolean vanishAfter) { super(fromX, toX, fromY, toY); setDuration(duration); mVanishAfter = vanishAfter; mLayoutParams = (LayoutParams) view.getLayoutParams(); //int height = mView.getHeight(); int height = viewComEfeito.getHeight(); mMarginBottomFromY = (int) (height * fromY) + mLayoutParams.bottomMargin - height; mMarginBottomToY = (int) (0 - ((height * toY) + mLayoutParams.bottomMargin)) - height; } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { super.applyTransformation(interpolatedTime, t); if (interpolatedTime < 1.0f) { int newMarginBottom = mMarginBottomFromY + (int) ((mMarginBottomToY - mMarginBottomFromY) * interpolatedTime); mLayoutParams.setMargins(mLayoutParams.leftMargin, mLayoutParams.topMargin, mLayoutParams.rightMargin, newMarginBottom); viewComEfeito.getParent().requestLayout(); } else if (mVanishAfter) { viewComEfeito.setVisibility(View.GONE); } } } 

}

Y aquí va el XML:

  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:id="@+id/outroLinear" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Welcome to the real world" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="No" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Wow! =P" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Free your mind!" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="In Tylor we trust" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="First rule of fight club is" /> </LinearLayout> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" android:id="@+id/segundo" /> </LinearLayout> 

3 Solutions collect form web for “Android – Llamando GONE y VISIBLE hace que la vista se muestre en el lugar equivocado”

Puede intentar poner ambas vistas dentro de un RelativeLayout y establecer su posición relativa entre sí.

Trate de poner el diseño A y B en otro diseño lineal, digamos C, que tiene la siguiente propiedad: – height wrap_content, Orientation Vertical Funcionará como quiera 🙂

Tienes que llamar medida (anchura, altura) después de que la vista cambió para ser visible. De lo contrario, la vista se mostrará de forma diferente.

  • ¿Se puede compartir de forma segura el ID de Android View en varias actividades?
  • Android: ¿Cómo hacer una vista previa de cámara en forma de círculo?
  • Android: ¿por qué no hay maxHeight para una vista?
  • ¿Cómo hacer un SurfaceView siempre horizontal?
  • ¿Existen bibliotecas de terceros para Android?
  • Android - Cómo dibujar en vista
  • Vista de carrusel de imagen de Android (sentido como)
  • La vista personalizada de Android solo recibe onDraw una vez
  • Configurar la tipografía de la sugerencia en TextEdit
  • Lista de posición de los puntos repetidos en getview
  • Reproducción de vídeo en un GLSurfaceView en lugar de SurfaceView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.