gpt4 book ai didi

android - FrameLayout setVisibility 不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:54:50 24 4
gpt4 key购买 nike

我正在尝试将 FrameLayout 设置为 View.GONE 以及许多其他 View 以响应屏幕倾斜到横向。

到目前为止,它似乎适用于除 ONE FrameLayout 之外的所有 View 。它只是不会去!

我以与所有其他 View 相同的方式同时将其设置为 View.GONE,但它仍然存在:

List<View> viewsToHide = getAllNonFullscreenViews();
for (View v : viewsToHide) {
v.setVisibility(View.GONE);
}

我已检查是否确实找到了 View 并将其单独设置为 GONE。我调用了 clearAnimation() 是因为我确实在某一时刻制作了它的动画,而且我听说这可能是一个问题。

View dropdownContainer = getActivity().findViewById(R.id.dropdownContainerView);
dropdownContainer.clearAnimation();
dropdownContainer.setVisibility(View.GONE);

我试图在 ui 线程上将其单独设置为 GONE。再次设置断点并确保实际找到 View 并将其设置为 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);

特别奇怪的是,当我延迟查看 View 时,它实际上设置为 GONE?!但我仍然可以在屏幕上看到它。它也绝对是正确的 View ,因为如果我立即将它设置为 GONE 并且不对任何内容使用react, View 确实会按预期消失。

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

我在另一个 View 中以编程方式插入此 FrameLayout。

因此是“父” View 。

<?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>

我试图隐藏的 View :

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

编辑:动画

如前所述,我试图隐藏的 View 可以响应点击而设置动画。尽管即使动画从未开始运行, View 仍然不会消失。这是动画代码:

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

最佳答案

我认为您只设置了 FrameLayout 的可见性,而不是在 subview 上导航并设置它的可见性。这就是为什么其他 View 仍然绘制在您的屏幕上并且只有 FrameLayout 被设置为消失。

要做到这一点,你需要像这样循环 parentView,在你的例子中是 FrameLayout:

for (int i = 0; i < frameLayout.getChildCount(); i++) {
View v = frameLayout.getChildAt(i);
v.setVisibility(View.GONE);
v.postInvalidate();
}

还使用 postInvalidate 刷新 View 。在循环内也做动画。希望这会有所帮助。

关于android - FrameLayout setVisibility 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26877423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com