阻止滚动以及 Expand/Collapse 可折叠工具栏
Block scroll along with Expand/Collapse Collapsible Toolbar
我在我的应用程序中使用 Collapsible Toolbar
。在 activity 启动时 Collapsible Toolbar 处于展开状态,启用了滚动功能并且正常工作。但现在我需要显示全屏错误布局,以防我的 API 失败。在那种情况下,我必须折叠工具栏并阻止滚动效果。
错误布局显示重试按钮。在重试时,我再次调用 API,如果 API 成功,我必须再次展开工具栏并启用滚动效果。
我能够使用 setExpanded
(标志,动画)折叠工具栏,但在那种情况下,我无法在显示错误布局时阻止可折叠工具栏的滚动效果。
我需要提供一种方法来阻止和取消阻止滚动效果 + Expand/Collapse 工具栏。任何帮助将非常感激.. !!!
如果您使用 AlertDialog to communicate the error and a ProgressDialog(微调器)来显示您正在做某事,您可以在您的应用正在做这件事时阻止用户输入。
制作错误布局,使其与可折叠工具栏重叠。同时将 android:clickable="true"
设置为您的错误布局。
设置错误布局的可见性时,相应地设置工具栏滚动。
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f3f3f3"
android:orientation="vertical"
>
<!-- Add your other layout including Collapsible Toolbar here.-->
<RelativeLayout
android:id="@+id/errorLayout"
android:clickable="true"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
您可以应用的一个简单解决方案就是使用 属性
android:能见度="gone"
对于您不想显示的内容,只需使用 属性 android:visibility=[= 使您的 错误布局 可见25=]
将错误布局放在父布局的底部
一旦内容在屏幕上不可见,而错误布局恰好可见,您将获得想要的结果。希望对你有帮助。
根据我之前的回答,我创建了一个库 AppBarrr 以在展开模式下锁定屏幕。
正如我所说,Toolbar
的高度是关键:CollapsingToolbarLayout
会收缩到 Toolbar
的高度,并会扩展到 AppBarLayout
的身高。
使用这个库,你必须设置两个布局作为 Toolbar
和你的扩展布局(用于锁定屏幕和滚动),它会创建一个 CollapsingToolbarLayout
并在里面膨胀这些布局.
您可以声明动画持续时间、内部 CollapsingToolbarLayout
的颜色、collapsed/expanded 标题的样式,甚至是锁定布局的高度...您还可以隐藏扩展布局,如果你点击它外面。它可以在扩展布局中支持 NestedScrollView
和 ScrollView
。 The documentation 和示例应用程序可在 Github 上找到。
对于那些不想使用库的人,my previous answer 展示了使用方法。这是上一个答案的输出:
基本上,这是相同的概念,但无需编写完整的 class,使用库,您只需要在 xml 中有一个简单的小部件即可!
随意使用、分叉或测试。希望它有用 ;)
您可以在启用或禁用折叠效果时实现接口并调用其方法。
public interface AppbarRequestListener {
void unlockAppBarOpen();
void lockAppBarClosed();
}
@Override
public void unlockAppBarOpen() {
appBarLayout.setExpanded(true, false);
appBarLayout.setActivated(true);
setAppBarDragging(false);
}
@Override
public void lockAppBarClosed() {
appBarLayout.setExpanded(false, false);
appBarLayout.setActivated(false);
setAppBarDragging(false);
}
private void setAppBarDragging(final boolean isEnabled) {
CoordinatorLayout.LayoutParams params =
(CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
AppBarLayout.Behavior behavior = new AppBarLayout.Behavior();
behavior.setDragCallback(new AppBarLayout.Behavior.DragCallback() {
@Override
public boolean canDrag(AppBarLayout appBarLayout) {
return isEnabled;
}
});
params.setBehavior(behavior);
}
我在我的应用程序中使用 Collapsible Toolbar
。在 activity 启动时 Collapsible Toolbar 处于展开状态,启用了滚动功能并且正常工作。但现在我需要显示全屏错误布局,以防我的 API 失败。在那种情况下,我必须折叠工具栏并阻止滚动效果。
错误布局显示重试按钮。在重试时,我再次调用 API,如果 API 成功,我必须再次展开工具栏并启用滚动效果。
我能够使用 setExpanded
(标志,动画)折叠工具栏,但在那种情况下,我无法在显示错误布局时阻止可折叠工具栏的滚动效果。
我需要提供一种方法来阻止和取消阻止滚动效果 + Expand/Collapse 工具栏。任何帮助将非常感激.. !!!
如果您使用 AlertDialog to communicate the error and a ProgressDialog(微调器)来显示您正在做某事,您可以在您的应用正在做这件事时阻止用户输入。
制作错误布局,使其与可折叠工具栏重叠。同时将 android:clickable="true"
设置为您的错误布局。
设置错误布局的可见性时,相应地设置工具栏滚动。
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f3f3f3"
android:orientation="vertical"
>
<!-- Add your other layout including Collapsible Toolbar here.-->
<RelativeLayout
android:id="@+id/errorLayout"
android:clickable="true"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
您可以应用的一个简单解决方案就是使用 属性
android:能见度="gone" 对于您不想显示的内容,只需使用 属性 android:visibility=[= 使您的 错误布局 可见25=]
将错误布局放在父布局的底部
一旦内容在屏幕上不可见,而错误布局恰好可见,您将获得想要的结果。希望对你有帮助。
根据我之前的回答,我创建了一个库 AppBarrr 以在展开模式下锁定屏幕。
正如我所说,Toolbar
的高度是关键:CollapsingToolbarLayout
会收缩到 Toolbar
的高度,并会扩展到 AppBarLayout
的身高。
使用这个库,你必须设置两个布局作为 Toolbar
和你的扩展布局(用于锁定屏幕和滚动),它会创建一个 CollapsingToolbarLayout
并在里面膨胀这些布局.
您可以声明动画持续时间、内部 CollapsingToolbarLayout
的颜色、collapsed/expanded 标题的样式,甚至是锁定布局的高度...您还可以隐藏扩展布局,如果你点击它外面。它可以在扩展布局中支持 NestedScrollView
和 ScrollView
。 The documentation 和示例应用程序可在 Github 上找到。
对于那些不想使用库的人,my previous answer 展示了使用方法。这是上一个答案的输出:
基本上,这是相同的概念,但无需编写完整的 class,使用库,您只需要在 xml 中有一个简单的小部件即可!
随意使用、分叉或测试。希望它有用 ;)
您可以在启用或禁用折叠效果时实现接口并调用其方法。
public interface AppbarRequestListener {
void unlockAppBarOpen();
void lockAppBarClosed();
}
@Override
public void unlockAppBarOpen() {
appBarLayout.setExpanded(true, false);
appBarLayout.setActivated(true);
setAppBarDragging(false);
}
@Override
public void lockAppBarClosed() {
appBarLayout.setExpanded(false, false);
appBarLayout.setActivated(false);
setAppBarDragging(false);
}
private void setAppBarDragging(final boolean isEnabled) {
CoordinatorLayout.LayoutParams params =
(CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
AppBarLayout.Behavior behavior = new AppBarLayout.Behavior();
behavior.setDragCallback(new AppBarLayout.Behavior.DragCallback() {
@Override
public boolean canDrag(AppBarLayout appBarLayout) {
return isEnabled;
}
});
params.setBehavior(behavior);
}