无法使用 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;
}
}
我试图为我的操作添加 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;
}
}