BottomSheet随着能见度的变化飞走了

时间:2016-07-12 11:38:38

标签: android bottom-sheet android-nestedscrollview

我有一个带有NestedScrollView的底页(见下文)。当我按下FAB按钮时,我想让这个NestedScrollView中的某些部分不可见。但是当我将一些线性布局的可见性改为GONE时,底片会从顶部飞走。见这里:

enter image description here

您可以从https://github.com/Tanrikut/BottomSheetExample

获取整个代码

我的变更可见性方法:

private void changeVisibility() {
    subtitleLayout.setVisibility(View.GONE);

    coordinateLayout.setVisibility(View.GONE);
    timeLayout.setVisibility(View.GONE);

}

My NestedScrollView xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView 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="wrap_content"
    app:behavior_peekHeight="120dp"
    app:layout_behavior="android.support.design.widget.BottomSheetBehavior"
    android:id="@+id/bottom_sheet_main">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="28dp"
            android:background="@android:color/white"
            android:animateLayoutChanges="true"
            android:orientation="vertical"
            >

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:paddingLeft="10dp"
                android:paddingStart="10dp"
                android:paddingTop="@dimen/activity_horizontal_margin">

                <TextView
                    style="@style/TextAppearance.AppCompat.Headline"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="Dandelion Chocolate"
                    android:id="@+id/title" />
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginBottom="@dimen/activity_horizontal_margin"
                    android:layout_marginTop="16dp"
                    android:orientation="horizontal"
                    android:id="@+id/subtitleLayout">

                    <TextView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:id="@+id/subtitle"
                        android:text="Subtitle" />

                </LinearLayout>


            </LinearLayout>


            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:padding="@dimen/activity_horizontal_margin"
                android:id="@+id/coordinateLayout">

                <ImageButton
                    android:layout_width="24dp"
                    android:layout_height="24dp"
                    android:alpha="0.36"
                    android:src="@drawable/ic_room_24dp"
                    android:background="@null" />

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="@dimen/activity_horizontal_margin"
                    android:layout_marginStart="@dimen/activity_horizontal_margin"
                    android:text="740, Valencia St, San Francisco, CA"
                    android:textColor="@android:color/primary_text_light"
                    android:id="@+id/bottom_sheet_coordinate" />

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:padding="@dimen/activity_horizontal_margin"
                android:id="@+id/timeLayout">

                <ImageButton
                    android:layout_width="24dp"
                    android:layout_height="24dp"
                    android:alpha="0.36"
                    android:src="@drawable/ic_query_builder_24dp"
                    android:background="@null" />

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="@dimen/activity_horizontal_margin"
                    android:layout_marginStart="@dimen/activity_horizontal_margin"
                    android:text="Wed, 10 AM - 9 PM"
                    android:textColor="@android:color/primary_text_light"
                    android:id="@+id/bottom_sheet_time" />

            </LinearLayout>


        </LinearLayout>

    </FrameLayout>
</android.support.v4.widget.NestedScrollView>

7 个答案:

答案 0 :(得分:19)

我遇到了这个问题,花了一些时间才弄明白是什么原因。

这是因为您正在使用android:animateLayoutChanges,它会在BottomSheetBehavior或CoordinatorLayout中出现错误。

删除它,BottomSheet将不会自动停止动画。不是解决方案,而是至少解决方法。

-

更新

事实证明,如果通过设置要使用的LayoutTransition实例以编程方式启用“animateLayoutChanges”,则可以在其上设置一个标志,以防止它与您正在使用的安卓程序的视图混乱:animateLayoutChanges on (又名:你的BottomSheet容器):

LayoutTransition transition = new LayoutTransition();
transition.setAnimateParentHierarchy(false);
yourLinearLayoutThatNeedsLayoutAnimation.setLayoutTransition(transition);

答案 1 :(得分:4)

从我的根目录布局中删除以下行即可解决此问题:

android:animateLayoutChanges="true"

答案 2 :(得分:2)

View.GONE更改为View.INVISIBLE。由于View.GONE没有大小,因此底页无法计算要更新的子项的高度。

答案 3 :(得分:1)

作为一种解决方法,您需要从父协调器布局中删除 android:animateLayoutChanges="true"

答案 4 :(得分:0)

可能这可以帮到你!我无法发表评论,因此将其作为答案发布

Here

for slide layout something same as bottom sheet but good

答案 5 :(得分:0)

BottomSheetBehavior有自己的行为,通过它您可以获得相应的结果。以下是底片的行为。

STATE_DRAGGINGSTATE_SETTLINGSTATE_EXPANDEDSTATE_COLLAPSEDSTATE_HIDDEN

不要使用任何布局的可见性。

在您的代码中使用此行为,如:

fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int behaviorState = bottomSheetBehavior.getState();
                if (behaviorState == BottomSheetBehavior.STATE_EXPANDED) {
                    bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
                } else {
                    bottomSheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
                }
            }
});

答案 6 :(得分:0)

尝试使 import { Component, OnInit } from '@angular/core'; import { FormGroup } from "@angular/forms" import { RxFormBuilder, RxwebValidators } from '@rxweb/reactive-form-validators'; import { HttpClient } from '@angular/common/http'; @Component({ selector: 'app-allOf-add-validator', templateUrl: './all-of-add.component.html' }) export class AllOfAddValidatorComponent implements OnInit { employeeInfoFormGroup: FormGroup projectDomains: string[] = []; projectDomainsArray: string[] = ["ECommerce", "Banking", "Educational", "Gaming"]; constructor( private formBuilder: RxFormBuilder, private http: HttpClient) { } ngOnInit() { this.employeeInfoFormGroup = this.formBuilder.group({ department: [''], projectDomains: ['', RxwebValidators.allOf({ matchValues: ["ECommerce", "Banking", "Educational", "Gaming"] })], }); } addProjectDomain(element: any, index: number) { var indexOf = this.projectDomains.indexOf(element.value); element.checked ? this.projectDomains.push(element.value) : this.projectDomains.splice(indexOf, 1); this.employeeInfoFormGroup.controls.projectDomains.setValue(this.projectDomains); } } 的父级成为独立的bottomSheet,而没有其他子级CoordinatorLayout。例如:

Views