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

时间:2018-10-18 06:43:29

标签: android lambda onclicklistener snackbar

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

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

但这会导致错误

  

无法解析方法'make()'

在谷歌上搜索并检查之后,我发现它可以正常使用setOnclicklistener,我也尝试了它,并且在片段的setOnclicklistener中也很好用,但是我将lambda表达式与setOnclicklistener一起使用,这就是为什么我很困惑使用点心栏,因为默认方法会出错。

这就是我正在做的

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();
    }
}

我希望我正确地使用了快餐栏,如果不正确,请告诉我,并在这里说明为什么会出错无法解析make()

有什么建议或想法吗?

2 个答案:

答案 0 :(得分:1)

您可以在“活动”范围内调用SnackBar.make()。因此this是“活动不是视图”。您应该像这样SnackBar.make(loginButton,...)更改代码。


更新

与Toast相比,Activity中包含SnackBar。 因此,如果按“主页”按钮,仍会显示Toast,但该活动会隐藏SnackBar。 因为,快餐栏用于向用户显示消息并与用户进行交互。

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

答案 1 :(得分:1)

您可以看到SnakeBar声明。当您传递当前类对象时,第一个参数是View。也许您的课程是活动。

Activity

通过findViewById(android.R.id.content)都可以给出当前活动的根视图。或通过其他视图。

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;
    }
}