如何在具有NestedScrollView的片段中禁用AppBarLayout中的"expand"?

Otu*_*uyh 4 android android-layout android-support-library android-design-library android-coordinatorlayout

我有两个问题:

1)当我的片段中没有NestedScrollView时,我能够阻止"扩展"功能,但是当我这样做时,它会不断扩展,即使使用:

appBarLayout.setExpanded(false);
appBarLayout.setActivated(false);
Run Code Online (Sandbox Code Playgroud)

当片段中有NestedScrollView时,有什么方法可以阻止工具栏的扩展?

2)即使我没有NestedScrollView,当我在工具栏中触摸我的手指时,我仍然能够展开它,并向下和向上滚动."扩张和崩溃"仍然有效.

当我触摸手指并向下和向上滚动时,如何禁用折叠操作并展开工具栏?

谢谢.

Edit1(更多信息):

这是我的片段的代码,在FrameLayout内部.

<android.support.v4.widget.NestedScrollView>

    <LinearLayout>

        <TextView />

        <android.support.v7.widget.RecyclerView />

    </LinearLayout>

</android.support.v4.widget.NestedScrollView>
Run Code Online (Sandbox Code Playgroud)

这是我的活动结构:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <android.support.design.widget.CoordinatorLayout>

        <android.support.design.widget.AppBarLayout>

            <android.support.design.widget.CollapsingToolbarLayout>

                <android.support.v7.widget.Toolbar />

            </android.support.design.widget.CollapsingToolbarLayout>

        </android.support.design.widget.AppBarLayout>

        <FrameLayout
            android:id="@+id/frame_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    </android.support.design.widget.CoordinatorLayout>

    ...

</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)

编辑2:现在唯一的问题是: 当我在片段中有NestedScrollView时,有什么方法可以阻止工具栏的扩展?

rom*_*4ek 10

我到目前为止还遇到过这个问题,当我需要它可折叠或可扩展时,通过改变AppBarLayout 高度来重新解决它.因此,首先,您需要在默认dimens.xml文件中定义下两个项目:

<dimen name="toolbar_height">56dp</dimen>
<dimen name="toolbar_expanded_height">256dp</dimen> // this can be whatever you need
Run Code Online (Sandbox Code Playgroud)

然后,防止AppBarLayoutToolbar扩展/折叠的完整方法是:

public void disableCollapse() {
    appbar.setActivated(false);
    //you will need to hide also all content inside CollapsingToolbarLayout
    //plus you will need to hide title of it
    backdrop.setVisibility(View.GONE);
    shadow.setVisibility(View.GONE);
    collapsingToolbar.setTitleEnabled(false);

    AppBarLayout.LayoutParams p = (AppBarLayout.LayoutParams) collapsingToolbar.getLayoutParams();
    p.setScrollFlags(0);
    collapsingToolbar.setLayoutParams(p);
    collapsingToolbar.setActivated(false);

    CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) appbar.getLayoutParams();
    lp.height = getResources().getDimensionPixelSize(R.dimen.toolbar_height);
    appbar.requestLayout();

    //you also have to setTitle for toolbar
    toolbar.setTitle(title); // or getSupportActionBar().setTitle(title);
}
Run Code Online (Sandbox Code Playgroud)

您可能还需要将状态栏高度添加到工具栏的高度(例如,如果您使用)fitsSystemWindows=true,那么您需要更改

lp.height = getResources().getDimensionPixelSize(R.dimen.toolbar_height);
Run Code Online (Sandbox Code Playgroud)

lp.height = getResources().getDimensionPixelSize(R.dimen.toolbar_height) + (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? getStatusBarHeight() : 0);
Run Code Online (Sandbox Code Playgroud)

getStatusBarHeight()方法实现:

protected int getStatusBarHeight() {
    int result = 0;
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

而且,最后,如果你想使你AppBarLayoutToolbar可折叠/再次扩张,你必须使用下一个方法:

public void enableCollapse() {
    appbar.setActivated(true);
    collapsingToolbar.setActivated(true);

    //you will need to show now all content inside CollapsingToolbarLayout
    //plus you will need to show title of it
    backdrop.setVisibility(View.VISIBLE);
    shadow.setVisibility(View.VISIBLE);
    collapsingToolbar.setTitleEnabled(true);

    AppBarLayout.LayoutParams p = (AppBarLayout.LayoutParams) collapsingToolbar.getLayoutParams();
    p.setScrollFlags(AppBarLayout.LayoutParams.SCROLL_FLAG_SCROLL | AppBarLayout.LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED);
    collapsingToolbar.setLayoutParams(p);

    CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) appbar.getLayoutParams();
    lp.height = getResources().getDimensionPixelSize(R.dimen.toolbar_expanded_height);
    appbar.requestLayout();

    //you also have to setTitle for toolbar
    toolbar.setTitle(title); // or getSupportActionBar().setTitle(title);
}
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!


nat*_*rio 5

要使用手指阻止滚动,您AppBarLayout必须使用DragCallback界面:

AppBarLayout layout = ...;
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) layout.getLayoutParams();
AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
behavior.setDragCallback(new AppBarLayout.Behavior.DragCallback() {
    @Override
    public boolean canDrag(@NonNull AppBarLayout appBarLayout) {
        return false;
    }
});
Run Code Online (Sandbox Code Playgroud)

为了防止AppBarLayout由于滚动而NestedScrollView滚动,必须从以下行为中删除该行为NestedScrollView

NestedScrollView nestedScrollView = ...;
CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) nestedScrollView.getLayoutParams();
params.setBehavior(null);
Run Code Online (Sandbox Code Playgroud)

您可以尝试的另一件事是从AppBarLayout子项中删除滚动标志:

AppBarLayout layout = ...;
View child = layout.getChildAt(0);
AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) child.getLayoutParams();
params.setScrollFlags(0);
Run Code Online (Sandbox Code Playgroud)