SwipeRefreshLayout 需要冻结 UI

SwipeRefreshLayout need to freeze UI

我开始将 Asynctask 中的旧 ProgressDialog 转换为 SwipeRefreshLayoutProgressDialog 确保 UI 冻结,直到 Asynctask 完全完成。

在使用SwipeRefreshLayout时如何冻结UI如果有任何需要冻结它?

您可以使用变通方法。当你拉动刷新时显示一个对话框,并将视图的可见性更改为不可见,这样你就会使屏幕变暗,刷新完成后你可以关闭对话框。

当您实施 SwipeRefreshLayout.OnRefreshListener 时,有一个覆盖方法 onRefresh(),您可以在其中管理其他视图,例如使所有按钮可点击或不可点击。

您也可以放置一个透明层来轻松管理整个屏幕的可点击和不可点击。

您可以在 xml 中添加一个父布局,例如 frame,背景将变为透明。

现在你要做的是,当你想禁止点击你的屏幕时,将透明布局可见性设置为可见,并且不要为该布局附加点击监听器,这样子视图将自动不可点击,并使该视图消失当您想让用户单击视图时,就是这样。希望你明白了

您应该在具有透明或半透明背景的视图上使用布局。确保此背景覆盖您的所有视图。但提醒你应该为你的布局设置android:clickable="true"。然后无法点击此透明布局下的项目,因此您冻结了布局,无法再选择任何项目。例如,您可以使用这样的布局:

<RelativeLayout
            android:id="@+id/main_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clickable="true"
            android:background="@android/color:transparent"
            android:visibility="gone"/>

我知道这是一个老问题。但也许有一天有人会从我的回答中受益。所以我们开始吧!

在刷新开始时使用以下代码冻结UI。

getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);

以下代码刷新后,获取触摸事件

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE);