当SnackBar出现在CoordinatorLayout中时将视图向上移动

12

我在CoordinatorLayout的底部有一个TextView

但是当我显示一个SnackBar时,它会覆盖TextView

我知道我必须自定义Behavior来重写layoutDependsOnonDependentViewChanged,但效果不太好。

如果您知道的话,能否给我一些建议?谢谢。


如果您在此处添加您的XML并稍微解释一下,那么您所说的内容会更清晰。您的要求是什么? - Charuක
我只想知道如何让TextView在SnackBar显示时保持在其上方,并在SnackBar消失时重置其位置。如果我什么也不做,SnackBar将覆盖myTextView。 - xiaoyuan
2个回答

66
如果TextView是CoordinatorLayout的直接子级,只需在TextView属性中添加app:layout_dodgeInsetEdges="bottom",神奇!

1
这种方法有点有效。但是它与 Solution with behavior 存在相同的情况。 不知何故,视图在显示 Snackbar 开始时跳转到开头。 - Vetalll

2

您需要为 LinearLayout 添加一个行为,并将其嵌入到 CoordinatorLayout 中。

以下是操作步骤:

MoveUpwardBehavior.class

import android.os.Build;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
import android.view.View;


public class MoveUpwardBehavior extends CoordinatorLayout.Behavior<View> {
    private static final boolean SNACKBAR_BEHAVIOR_ENABLED;

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

    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
        float translationY = Math.min(0, dependency.getTranslationY() - dependency.getHeight());
        child.setTranslationY(translationY);
        return true;
    }

    static {
        SNACKBAR_BEHAVIOR_ENABLED = Build.VERSION.SDK_INT >= 11;
    }
}

CustomLinearLayout.class

import android.content.Context;
import android.support.design.widget.CoordinatorLayout;
import android.util.AttributeSet;
import android.widget.LinearLayout;

@CoordinatorLayout.DefaultBehavior(MoveUpwardBehavior.class)
public class CustomLinearLayout extends LinearLayout {
    public CustomLinearLayout(Context context) {
        super(context);
    }

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

    public CustomLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
}

示例xml->activity_home

这里的 user.example.charu.its2017huree 是我的包名,请将其替换为您自己的包名!

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:fitsSystemWindows="true"
        android:layout_height="match_parent">
        <user.example.charu.its2017huree.CustomLinearLayout
            android:background="#098"
            android:gravity="bottom"
            android:id="@+id/linearLayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="Hello world" />
        </user.example.charu.its2017huree.CustomLinearLayout>

最后在我的名为HomeActivity的活动中

public class HomeActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        CustomLinearLayout customLinearLayout = (CustomLinearLayout) findViewById(R.id.linearLayout);
        Snackbar.make(customLinearLayout, "Text to display", Snackbar.LENGTH_LONG).show();

    }

}

Source is from this example.


非常感谢。onDependentViewChanged 这个块是我想要的。真的很感激。 - xiaoyuan
1
@Charu DefaultBehaviour已经被弃用了吗? - Savan Luffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接