无法使用 lambda 解析 setOnclicklistener 中的 Snackbar.make()

Cannot resolve Snackbar.make() in setOnclicklistener with lambda

我试图为我的操作添加 Snackbar 类型的消息,当我使用 Snackbar 时它给出错误无法解析 make()。

Snackbar.make(this,"Field should not be empty ",Snackbar.LENGTH_SHORT).show();

但这给出了错误

cannot resolve method 'make()'

在谷歌搜索和检查 SO 之后,我发现它以某种方式与普通的 setOnclicklistener 一起工作得很好我也尝试过它并且它在片段的 setOnclicklistener 中工作得很好,但是我使用带有 lambda 表达式的 setOnclicklistener 这就是为什么我在这里很漂亮对如何使用 snackbar 感到困惑,因为默认方法给出错误。

这就是我在做的事情

loginButton.setOnClickListener(view -> login());

这是我的登录函数

private void login() {

    setError();

    String email = loginUserName.getText().toString();
    String password = loginPassword.getText().toString();

    int err = 0;

    if (!validateEmail(email)) {

        err++;
        Snackbar.make(this,"Enter Valid fields",Snackbar.LENGTH_SHORT).show(); //here is the problem
        mTiEmail.setError("Email should be valid !");
    }

    if (!validateFields(password)) {

        err++;
        mTiPassword.setError("Password should not be empty !");
    }

    if (err == 0) {

        loginProcess(email,password);


    } else {

        Toast.makeText(this, "Enter valid details", Toast.LENGTH_SHORT).show();
    }
}

我希望我能正确使用 snackbar 如果没有请让我告诉我为什么它在这里给出错误 无法解析 make()

有什么建议或想法吗?

您可以在 Activity 范围内调用 SnackBar.make()。所以 this 是 Activity 而不是视图。您应该像这样更改代码 SnackBar.make(loginButton,...).


更新

与Toast相比,SnackBar包含在Activity中。 因此,如果您按下 Home 按钮,Toast 仍会显示,但 snackBar 会被 activity 隐藏。 因为,snackbar 是用来给用户显示信息,和用户交互的。

在Android源代码的SnackBar代码中,它使用视图参数找到父视图组。并且 Snackbar 布局包含在视图组中。

可以看到SnakeBar声明。第一个参数是视图,而你正在传递当前 class 对象。也许你的 class 是 activity.

Activity

要么传递 findViewById(android.R.id.content),它给出当前 activity 的根视图。或通过其他视图。

Fragment

Snackbar.make(getActivity().findViewById(android.R.id.content),"Sample", Snackbar.LENGTH_LONG).show();

这是 Snackbar 声明。

@NonNull
public static Snackbar make(@NonNull View view, @NonNull CharSequence text, int duration) {
    ViewGroup parent = findSuitableParent(view);
    if (parent == null) {
        throw new IllegalArgumentException("No suitable parent found from the given view. Please provide a valid view.");
    } else {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        SnackbarContentLayout content = (SnackbarContentLayout)inflater.inflate(hasSnackbarButtonStyleAttr(parent.getContext()) ? layout.mtrl_layout_snackbar_include : layout.design_layout_snackbar_include, parent, false);
        Snackbar snackbar = new Snackbar(parent, content, content);
        snackbar.setText(text);
        snackbar.setDuration(duration);
        return snackbar;
    }
}