Intereting Posts
Невозможно получить неявные намерения работать Как удалить приложение из adb, не зная, что это имя пакета Android ICS Launcher 4.0.x не может поддерживать ориентацию экрана Просмотр фрагмента ViewPager's, потерянный при отображении родительского фрагмента ViewPager, затем отображается Как заблокировать камеру в Google Maps API V2 Android: сбрасывание отскакивания панели инструментов при прокрутке вверх Android.support.v7.widget.CardView не удалось найти (Android Studio 1.1 Preview) Эффект Android L не работает Как рисовать и масштабировать растровое изображение на холсте с использованием бикубической интерполяции в Android? Отступы, потерянные с помощью тега <merge> с пользовательским составным компонентом Android listSelector все еще частично отображается, когда элемент прокручивается Карты Google не отображаются на Android в режиме выпуска Android: Fill Spinner Из кода Java Programmatically Как реализовать слайд, чтобы показывать действия в recyclerview? Обновление программного обеспечения Android-приложения Phonegap программно

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 Он будет работать так, как вы хотите 🙂

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