SwipeRefreshLayout,当visibility == View.GONE时,不会隐藏子视图

时间:2016-10-27 15:55:05

标签: android

我使用SwipeRefreshLayout.setVisibility(View.GONE)获得了不一致的行为。有时,我的刷卡刷新布局会隐藏子视图,但有时候他们不会。由于SwipeRefreshLayout是ViewGroup的子类,因此我希望它始终隐藏子视图,只要它的可见性是.GONE,但这不会发生。

任何见解都表示赞赏。

<android.support.v4.widget.SwipeRefreshLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/mySwipeRefreshLayout">

    <View
        android:background="#FF0000"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</android.support.v4.widget.SwipeRefreshLayout>

更新:下午花了一些时间从片段中删除所有内容后,我确认我们的设置导致了问题。即便如此,将子视图设置为VIEW.Gone仍然很奇怪,但刷卡刷新布局不会隐藏孩子。

3 个答案:

答案 0 :(得分:1)

如果您确认这不是由您的设置引起的,则应将此报告为错误,请参阅https://source.android.com/source/report-bugs.html

作为一种解决方法,我建议将您的布局包装到FrameLayout并在其上设置可见性,而不是SwipeRefreshLayout

答案 1 :(得分:1)

在您的xml文件中,为SwipeRefreshLayout提供ID并查看

<android.support.v4.widget.SwipeRefreshLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/mySwipeRefreshLayout">

    <View
        android:background="#FF0000"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</android.support.v4.widget.SwipeRefreshLayout>

然后在.java文件中使用id并使用它们的对象。

 if(swipeRefreshLayout.isRefreshing()){
       view.setVisibility(View.VISIBLE);        
 }else{
       view.setVisibility(View.INVISIBLE);    
 }

答案 2 :(得分:1)

我觉得愚蠢,但我的问题最终是这样的:SwipeRefreshLayout在动画刷新徽标时不会隐藏。除了setRefreshing(false)之外,您还必须setVisibility(View.GONE)。即使在setRefreshing(false)之后,也会在使用这两种方法后发生退出动画。

这是我用来解决这个问题的解决方案。它不仅可以在您想要隐藏它时处理调用setRefreshing(false),还可以将alpha设置为零,因此它可以立即隐藏,而无需等待刷新动画结束。

public class HideableSwipeRefreshLayout extends SwipeRefreshLayout {

    public HideableSwipeRefreshLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void setVisibility(int visibility) {

        if ((visibility == View.INVISIBLE) || (visibility == View.GONE)) {
            setAlpha(0);
            setRefreshing(false);
        } else {
            setAlpha(1);
        }

        super.setVisibility(visibility);
    }
}