FrameLayout的setVisibility方法无效。

5

我试图在屏幕被倾斜为横向时,将FrameLayout与许多其他视图一起设置为View.GONE。

到目前为止,所有的视图都似乎可以正常工作,除了一个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?!但我仍然可以在屏幕上看到它。这肯定是正确的View,因为如果我立即将其设置为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);

你对“它不会运行”的定义是什么?你怎么知道它没有运行? - Blundell
就像视图仍然以全彩色显示在屏幕上,所有子视图都在原来的位置(除了所有已成功设置为GONE的其他视图)。 - pbevis
你需要运行什么代码来启动帧布局上的动画? - Alex Lockwood
@Alex 我已经编辑了帖子并添加了动画代码。然而,该动画只会在点击结果后发生,因此在旋转之前可能不会有动画效果。 - pbevis
1个回答

3
我认为您只设置了FrameLayout的可见性,而没有浏览子视图并设置其可见性。这就是为什么其他视图仍然显示在屏幕上,只有FrameLayout被设置为消失。
要做到这一点,您需要循环遍历父视图,也就是在您的情况下的FrameLayout,如下所示:
for (int i = 0; i < frameLayout.getChildCount(); i++) {
    View v = frameLayout.getChildAt(i);
    v.setVisibility(View.GONE);
    v.postInvalidate();
}

此外,使用postInvalidate来刷新视图。同时在循环中进行动画。希望这可以帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接