我使用新的设计库有一个非常标准的布局:
AppBarLayout
我尝试做的是以编程方式完全隐藏整个Toolbar
,暂时摆脱private void disableCollapsing() {
AppBarLayout.LayoutParams p = (AppBarLayout.LayoutParams) collapsingToolbarLayout.getLayoutParams();
p.setScrollFlags(0);
collapsingToolbarLayout.setLayoutParams(p);
}
及其崩溃功能。
所以我称之为:
@Override
public void hide() {
final AppBarLayout layout = (AppBarLayout) findViewById(R.id.appbar);
layout.animate().translationY(-layout.getHeight())
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
layout.setVisibility(View.GONE);
}
}).start();
}
禁用折叠行为(效果很好),最后是:
View.GONE
我将AppBarLayout翻译为顶部(工作顺利),并在动画集的末尾显示AppBarLayout
的可见性。
在动画结束时,无论我是否也将可见性设置为GONE,我都无法获得之前被CoordinatorLayout
占用的空间。我的NestedScrollView仍然局限在屏幕的下半部分,好像AppBarLayout仍在那里(不是)。我该如何解决?
隐藏之前:
隐藏后(AppBar翻译到顶部):
正如您所看到的,顶部空间是空的,无法访问。滚动视图在其前面的边距内滚动,就好像coordinator.requestLayout()
未测量可见性变化一样。
我尝试过调用app:anchor
,但没有成功。
我也尝试将AppBarLayout设置为我的NestedScrollView的Behavior
,但这会搞砸 - 滚动视图最终会在隐藏之前占据整个屏幕。
我在考虑在输入 hidden-AppBar模式时在滚动视图上设置自定义{{1}},但我无法开始使用
答案 0 :(得分:18)
是的,这看起来像一个bug,我为我的应用程序解决了这个问题,将appbar height设置为0:
android.support.design.widget.AppBarLayout appbar = (android.support.design.widget.AppBarLayout) findViewById(R.id.appbar);
CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appbar.getLayoutParams();
lp.height = 0;
appbar.setLayoutParams(lp);
答案 1 :(得分:1)
以下作品
appBarLayout.setExpanded(false, false);
appBarLayout.setVisibility(View.GONE);
答案 2 :(得分:0)
这对我有用。只需打开/关闭应用栏即可。
private boolean hide = true;
public void toggleAppBar() {
// Calculate ActionBar height
TypedValue tv = new TypedValue();
int actionBarHeight = 0;
if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
}
CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appBarLayout.getLayoutParams();
lp.height = hide ? 0 : actionBarHeight;
appBarLayout.setLayoutParams(lp);
appBarLayout.setExpanded(!hide, true);
hide = !hide;
appbar_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay" />
</com.google.android.material.appbar.AppBarLayout>
<include layout="@layout/content_main" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>
答案 3 :(得分:0)
感谢@Caleb Kleveter,这是我的 Kotlin 代码
val appBarLayout = activity?.findViewById<AppBarLayout>(R.id.app_bar_layout)
val lp = appBarLayout?.layoutParams
lp?.height = 0;
appBarLayout?.layoutParams = lp