web-dev-qa-db-ja.com

AppBarLayoutを非表示にし、残りのビューにそのスペースを与える

新しいデザインライブラリを使用したかなり標準的なレイアウトがあります。

_<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がまだ存在しているかのように、画面の下半分に限定されたままです(存在しません)。どうすれば修正できますか?

非表示にする前に:

Before

非表示にした後(AppBarが一番上に翻訳されます):

After

ご覧のとおり、上部のスペースは空で到達できません。スクロールビューは、可視性の変化がCoordinatorLayoutによって測定されなかったかのように、以前の余白の内側をスクロールします。

  • coordinator.requestLayout()を呼び出そうとしましたが、成功しませんでした。

  • また、NestedScrollViewのAppBarLayoutを_app:anchor_として設定しようとしましたが、それは問題を引き起こします-スクロールビューは、非表示になる前でも画面全体を占めることになります。

  • これに入るときにスクロールビューにカスタムBehaviorを設定することを考えていましたhidden-AppBar modeですが、それを始めることができません。

18
natario

はい、これはバグのようです。アプリケーションでこの問題を解決し、アプリバーの高さを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);
19
Alberto Polo

以下も同様に機能します

appBarLayout.setExpanded(false, false);
appBarLayout.setVisibility(View.GONE);
0
Desmond Lua

これは私にとってはうまくいきます。アプリバーのオン/オフを切り替えるだけです。

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>
0
hullabaloon