Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 当snackbar出现时,使ScrollView变小_Android_Android Design Library_Android Snackbar - Fatal编程技术网

Android 当snackbar出现时,使ScrollView变小

Android 当snackbar出现时,使ScrollView变小,android,android-design-library,android-snackbar,Android,Android Design Library,Android Snackbar,我刚开始在我的android应用程序中使用Snackbar,但我无法将ScrollView缩小到不能覆盖ScrollView内部任何内容的程度 这是我的活动的xml布局: <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout android:id="@+id/container" xmlns:android="http://schemas.andro

我刚开始在我的android应用程序中使用Snackbar,但我无法将ScrollView缩小到不能覆盖ScrollView内部任何内容的程度

这是我的活动的xml布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    android:id="@+id/container"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorBackground"
    tools:context="com.example.MainActivity">

    <ScrollView
        android:id="@+id/scrollview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:layout_marginLeft="8dp"
            android:layout_marginRight="8dp"
            android:layout_marginTop="16dp"
            android:orientation="vertical">

            [LOT OF ELEMENTS IN HERE]

        </LinearLayout>
    </ScrollView>
</android.support.constraint.ConstraintLayout>

[这里有很多元素]

我在StackOverflow上尝试了很多解决方案,但都没有效果。

我猜对您来说最好的解决方案是按照本文中的规定实现一个
协调布局
,如果您在链接中看到GIF格式,您可以看到触发SnackBar时浮动Botton如何升高的动画,试着用ScrollView元素代替教程中的浮动按钮,我想这是可行的(ScrollView应该位于其他属性之上..)

如果不起作用
可能您想要扩展ScrollView并覆盖google文档中解释的所需方法,这应该始终有效,但是你需要做更多的工作。这两种解决方案中的一种可能会奏效。

我猜,对你来说,最好的解决方案是实现一个
协调布局
,如本文所述,如果你在链接中看到GIF格式,你可以看到触发SnackBar时浮动Botton如何升高的动画,试着用ScrollView元素代替教程中的浮动按钮,我想这是可行的(ScrollView应该位于其他属性之上..)

如果不起作用
可能您想扩展ScrollView并覆盖您需要的方法,正如google文档中所解释的,这应该总是可行的,但您需要做更多的工作。两种解决方案中的一种可能会奏效。

因此,我找到了解决问题的方法,这就是解决方案。 在我的活动的布局xml文件中,我已将
ConstraintLayout
替换为
android.support.design.widget.CoordinatorLayout

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.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:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorBackground"
    tools:context="com.example.MainActivity">

    <ScrollView
        android:id="@+id/scrollview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="com.example.DecreaseHeightBehavior">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:layout_marginLeft="8dp"
            android:layout_marginRight="8dp"
            android:layout_marginTop="16dp"
            android:orientation="vertical">

            [ELEMENTS HERE]

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

[这里的元素]
我创建了一个类DecreaseHeightBehavior,如下所示:

package com.example;

import android.content.Context;
import android.support.annotation.Keep;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;

@Keep
public class DecreaseHeightBehavior extends CoordinatorLayout.Behavior<View>{
    public DecreaseHeightBehavior(){
        super();
    }

    public DecreaseHeightBehavior(Context context, AttributeSet attrs){
        super(context, attrs);
    }

    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency){
        return dependency instanceof Snackbar.SnackbarLayout;
    }

    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency){
        ViewGroup.LayoutParams layoutParams = child.getLayoutParams();
        layoutParams.height = parent.getHeight() - dependency.getHeight();
        child.setLayoutParams(layoutParams);

        return true;
    }

    @Override
    public void onDependentViewRemoved(CoordinatorLayout parent, View child, View dependency){
        ViewGroup.LayoutParams layoutParams = child.getLayoutParams();
        layoutParams.height = MATCH_PARENT;
        child.setLayoutParams(layoutParams);
    }
}
package.com.example;
导入android.content.Context;
导入android.support.annotation.Keep;
导入android.support.design.widget.CoordinatorLayout;
导入android.support.design.widget.Snackbar;
导入android.util.AttributeSet;
导入android.view.view;
导入android.view.ViewGroup;
导入静态android.view.ViewGroup.LayoutParams.MATCH_父项;
@保持
公共类降低高度行为扩展协调布局。行为{
公众降低高度行为(){
超级();
}
public DecreaseHeightBehavior(上下文、属性集属性){
超级(上下文,attrs);
}
@凌驾
公共布尔布局依赖项(协调布局父项、视图子项、视图依赖项){
返回Snackbar.Snackbar布局的依赖实例;
}
@凌驾
公共布尔onDependentViewChanged(协调布局父项、视图子项、视图依赖项){
ViewGroup.LayoutParams LayoutParams=child.getLayoutParams();
layoutParams.height=parent.getHeight()-dependency.getHeight();
setLayoutParams(layoutParams);
返回true;
}
@凌驾
删除了OnDependentViewPublic void(协调布局父项、视图子项、视图依赖项){
ViewGroup.LayoutParams LayoutParams=child.getLayoutParams();
layoutParams.height=匹配父项;
setLayoutParams(layoutParams);
}
}

这对我来说是可行的,但是这个解决方案并没有设置滚动视图的高度。

所以,我找到了解决问题的方法,这就是解决方案。 在我的活动的布局xml文件中,我已将
ConstraintLayout
替换为
android.support.design.widget.CoordinatorLayout

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.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:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorBackground"
    tools:context="com.example.MainActivity">

    <ScrollView
        android:id="@+id/scrollview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_behavior="com.example.DecreaseHeightBehavior">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="8dp"
            android:layout_marginLeft="8dp"
            android:layout_marginRight="8dp"
            android:layout_marginTop="16dp"
            android:orientation="vertical">

            [ELEMENTS HERE]

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

[这里的元素]
我创建了一个类DecreaseHeightBehavior,如下所示:

package com.example;

import android.content.Context;
import android.support.annotation.Keep;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;

@Keep
public class DecreaseHeightBehavior extends CoordinatorLayout.Behavior<View>{
    public DecreaseHeightBehavior(){
        super();
    }

    public DecreaseHeightBehavior(Context context, AttributeSet attrs){
        super(context, attrs);
    }

    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency){
        return dependency instanceof Snackbar.SnackbarLayout;
    }

    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency){
        ViewGroup.LayoutParams layoutParams = child.getLayoutParams();
        layoutParams.height = parent.getHeight() - dependency.getHeight();
        child.setLayoutParams(layoutParams);

        return true;
    }

    @Override
    public void onDependentViewRemoved(CoordinatorLayout parent, View child, View dependency){
        ViewGroup.LayoutParams layoutParams = child.getLayoutParams();
        layoutParams.height = MATCH_PARENT;
        child.setLayoutParams(layoutParams);
    }
}
package.com.example;
导入android.content.Context;
导入android.support.annotation.Keep;
导入android.support.design.widget.CoordinatorLayout;
导入android.support.design.widget.Snackbar;
导入android.util.AttributeSet;
导入android.view.view;
导入android.view.ViewGroup;
导入静态android.view.ViewGroup.LayoutParams.MATCH_父项;
@保持
公共类降低高度行为扩展协调布局。行为{
公众降低高度行为(){
超级();
}
public DecreaseHeightBehavior(上下文、属性集属性){
超级(上下文,attrs);
}
@凌驾
公共布尔布局依赖项(协调布局父项、视图子项、视图依赖项){
返回Snackbar.Snackbar布局的依赖实例;
}
@凌驾
公共布尔onDependentViewChanged(协调布局父项、视图子项、视图依赖项){
ViewGroup.LayoutParams LayoutParams=child.getLayoutParams();
layoutParams.height=parent.getHeight()-dependency.getHeight();
setLayoutParams(layoutParams);
返回true;
}
@凌驾
删除了OnDependentViewPublic void(协调布局父项、视图子项、视图依赖项){
ViewGroup.LayoutParams LayoutParams=child.getLayoutParams();
layoutParams.height=匹配父项;
setLayoutParams(layoutParams);
}
}

这对我来说是可行的,但这个解决方案并不能使ScrollView的高度动画化。

你想让ScrollView变小是什么意思?通常,它的高度设置为与父项匹配,但当snackbar出现时,我希望它比snackbar的高度小。你想让ScrollView变小是什么意思,正常情况下,它的高度设置为与父项匹配,但当snackbar出现时,我希望它比snackbar的高度小。遗憾的是,我没能做到这一点,我的应用程序现在总是在显示snackbar时崩溃。我已将我的
ConstraintLayout
替换为
android.support.design.widge