【发布时间】:2014-11-12 00:56:24
【问题描述】:
我正在尝试将 FrameLayout 设置为 View.GONE 以及许多其他视图,以响应屏幕倾斜到横向。
到目前为止,它似乎适用于除 ONE FrameLayout 之外的所有视图。它只是不会去!
我以与所有其他视图相同的方式同时将其设置为 View.GONE,但它仍然存在:
List<View> viewsToHide = getAllNonFullscreenViews();
for (View v : viewsToHide) {
v.setVisibility(View.GONE);
}
我检查了该视图是否确实被找到并将其单独设置为 GONE。我之所以调用 clearAnimation(),是因为我确实在某一时刻对其进行了动画处理,并且我听说这可能是一个问题。
View dropdownContainer = getActivity().findViewById(R.id.dropdownContainerView);
dropdownContainer.clearAnimation();
dropdownContainer.setVisibility(View.GONE);
我尝试在 ui 线程上单独将其设置为 GONE。再次设置断点并确保实际找到视图并将其设置为 GONE。
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
View dropdownContainer = getActivity().findViewById(R.id.dropdownContainerView);
dropdownContainer.clearAnimation();
dropdownContainer.setVisibility(View.GONE);
}
});
我再次尝试了同样的事情,但延迟了
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
View dropdownContainer = getActivity().findViewById(R.id.dropdownContainerView);
dropdownContainer.clearAnimation();
dropdownContainer.setVisibility(View.GONE);
}
}, 3000);
特别奇怪的是,当我延迟查看视图时,它实际上设置为 GONE?!但我仍然可以在屏幕上看到它。它也绝对是正确的视图,因为如果我立即将其设置为 GONE 并且不对任何事情做出反应,则视图确实会按预期消失。
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//check the dropdown
View dropdown = getActivity().findViewById(R.id.dropdownContainerView);
int visibility = dropdown.getVisibility();
if (visibility == View.VISIBLE) {
Log.d("dropdown", "is visible");
} else if (visibility == View.INVISIBLE) {
Log.d("dropdown", "is invisible");
} else if (visibility == View.GONE) {
Log.d("dropdown", "is gone"); //Runs this
}
}
}, 4000);
编辑:xml
我以编程方式将这个 FrameLayout 插入到另一个视图中。
所以“父”视图。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/containerFrame">
<LinearLayout
android:id="@+id/detailBg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/detail_bg"
android:orientation="vertical" >
<LinearLayout
android:orientation="vertical"
android:id="@+id/dropdownContainer"
android:layout_width="fill_parent"
android:layout_height="48dp">
</LinearLayout>
<View
android:id="@+id/detailSpacer"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/light_gray" />
<LinearLayout
android:id="@+id/detailContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" />
</LinearLayout>
</FrameLayout>
我试图隐藏的视图:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dropdownContainerView"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<RelativeLayout
android:id="@+id/selectedView"
android:layout_width="fill_parent"
android:layout_height="48dp"
android:background="#ffffff">
<View
android:id="@+id/grayline1"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_alignParentTop="true"
android:background="@color/light_gray" />
<View
android:id="@+id/grayline2"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_alignParentBottom="true"
android:background="@color/light_gray" />
<TextView
android:id="@+id/selectedText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:paddingLeft="20dp"
android:layout_centerVertical="true"
android:gravity="center"
android:textSize="18sp"
android:textColor="#0081C8"/>
</RelativeLayout>
</FrameLayout>
我是这样添加的:
FrameLayout parentFrame = (FrameLayout) getActivity().findViewById(R.id.containerFrame);
dropdownView = new DropdownView(getActivity(), options, 0, this);
parentFrame.addView(dropdownView, 1);
编辑:动画
如前所述,我试图隐藏的视图可以响应点击进行动画处理。尽管即使动画从未开始运行,视图仍然不会消失。这是动画代码:
final Boolean shouldOpen = !isDropdownShowing;
RelativeLayout selectionView = (RelativeLayout) findViewById(R.id.selectedView);
final int listHeight = dropdownListView.getHeight();
final int heightOfSelectionView = selectionView.getHeight();
TranslateAnimation translateAnimation;
if (shouldOpen) {
translateAnimation = new TranslateAnimation (0.0f, 0.0f, heightOfSelectionView - listHeight, 0);
int y = heightOfSelectionView;
dropdownListView.setY(y);
} else {
translateAnimation = new TranslateAnimation (0.0f, 0.0f, 0, 0 - listHeight);
}
translateAnimation.setFillAfter(true);
translateAnimation.setFillEnabled(true);
translateAnimation.setDuration(300L);
translateAnimation.setRepeatCount(0);
translateAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
if (shouldOpen) {
isDropdownShowing = true;
dropdownListView.setY(heightOfSelectionView);
} else {
isDropdownShowing = false;
dropdownListView.setY(0 - listHeight);
}
dropdownListView.clearAnimation();
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
dropdownListView.startAnimation(translateAnimation);
【问题讨论】:
-
你对“它不会走”的定义是什么,你怎么知道它没有走?
-
因为视图仍然以全彩显示在屏幕上,所有子视图都在它之前的位置(减去它周围所有其他已成功设置为 GONE 的视图)。
-
你运行什么代码来启动框架布局上的动画?
-
@Alex 我用动画代码编辑了帖子。动画仅在点击结果时出现,因此在旋转之前可能不会动画。
标签: android