Intereting Posts
Триггер медиансканера по определенному пути (папке), как? Fit ImageSpan для высоты строки TextView Android: избегайте сбоев приложения из-за необработанных ошибок Как получить установленные приложения в Android и без системных приложений? Сведения об уничтожении и отдыхе компонентов приложений Android Редактировать прослушиватель текстовых клавиш Как инициализировать firebase после входа в android google? Экран предпочтения Пользовательский макет работает только со вторым щелчком Почему моя относительная компоновка занимает всю ширину экрана Android Studio 2.0 Не обнаружено устройств USB Импортировать проект Android Studio с другого ПК с различными версиями Gradle? Ошибка: не удалось найти цель с хэш-строкой 'android-14' в: Открыть Android SDK Manager Создание интервального таймера в Java-андроиде Android Gradle Project обновляет инструменты сборки до 21.0.1: aapt throws Exception Как получить данные об авариях из моего приложения Android?

Android – вызов GONE, а затем VISIBLE позволяет отобразить представление не в том месте

У меня есть два вида: A и B, а представление A находится над представлением B (оба являются линейными макетами).

Когда я программным образом устанавливаю представление A в GONE, оно исчезает, и вид, который находится прямо под ним (B), переходит к месту представления A (как и ожидалось).

Однако, когда я снова устанавливаю тот же вид (A) в VISIBLE, он отображается над представлением B. Я не хочу этого. Я хочу, чтобы представление B вернулось в исходное положение (ниже вида A), что я и думал, что это произойдет (но это не так). Как я могу это сделать?

Заранее спасибо!

EDIT – код

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

}

И здесь идет 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> 

Solutions Collecting From Web of "Android – вызов GONE, а затем VISIBLE позволяет отобразить представление не в том месте"

Вы можете попробовать поставить оба представления внутри RelativeLayout и установить их положение относительно друг друга.

Попробуйте поместить оба макета A и B в другой линейный макет, скажем C, который имеет следующее свойство: – height wrap_content, Orientation Vertical Он будет работать так, как вы хотите 🙂

Вы должны вызвать меру (ширина, высота) после того, как вид изменен, чтобы быть видимым. В противном случае просмотр будет отображаться по-разному.