新しいデザインライブラリを使用したかなり標準的なレイアウトがあります。
_<AppBarLayout>
<CollapsingToolbarLayout>
<ImageView/>
<Toolbar/>
</CollapsingToolbarLayout>
</AppBarLayout>
<Android.support.v4.widget.NestedScrollView/> <!-- content here -->
_
私がやろうとしているのは、プログラムで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();
}
_
AppBarLayoutを一番上に変換し(スムーズに機能します)、アニメーションセットの最後に_View.GONE
_が表示されます。
アニメーションの最後で、可視性をGONEに設定しても、以前はAppBarLayout
で占められていたスペースを取得できません。 NestedScrollViewは、AppBarLayoutがまだ存在しているかのように、画面の下半分に限定されたままです(存在しません)。どうすれば修正できますか?
非表示にする前に:
非表示にした後(AppBarが一番上に翻訳されます):
ご覧のとおり、上部のスペースは空で到達できません。スクロールビューは、可視性の変化がCoordinatorLayout
によって測定されなかったかのように、以前の余白の内側をスクロールします。
coordinator.requestLayout()
を呼び出そうとしましたが、成功しませんでした。
また、NestedScrollViewのAppBarLayoutを_app:anchor
_として設定しようとしましたが、それは問題を引き起こします-スクロールビューは、非表示になる前でも画面全体を占めることになります。
これに入るときにスクロールビューにカスタムBehavior
を設定することを考えていましたhidden-AppBar modeですが、それを始めることができません。
はい、これはバグのようです。アプリケーションでこの問題を解決し、アプリバーの高さを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);
以下も同様に機能します
appBarLayout.setExpanded(false, false);
appBarLayout.setVisibility(View.GONE);
これは私にとってはうまくいきます。アプリバーのオン/オフを切り替えるだけです。
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>