问题描述
我有这个单独的代码类,该类使Snackbar显示在我的应用程序中,但是在我当前的实现中,我得到了“ java.lang.NullPointerException”。如何在主类中正确实现它?
这是我的小吃店课:
public class SnackBarUtils
{
private static SnackBarUtils mInstance = null;
private Snackbar mSnackBar;
private SnackBarUtils()
{
}
public static SnackBarUtils getInstance()
{
if (mInstance == null)
{
mInstance = new SnackBarUtils();
}
return mInstance;
}
public void hideSnackBar()
{
if (mSnackBar != null)
{
mSnackBar.dismiss();
}
}
public void showProblemSnackBar(final Activity activity,final String message)
{
mSnackBar = Snackbar.make(activity.findViewById(android.R.id.content),message,Snackbar.LENGTH_INDEFINITE);
// Changing action button text color
View sbView = mSnackBar.getView();
TextView textView = sbView.findViewById(com.google.android.material.R.id.snackbar_text);
mSnackBar.setAction("x",new View.OnClickListener()
{
@Override
public void onClick(View v)
{
//Call your action method here
mSnackBar.dismiss();
}
});
textView.setTextColor(Color.WHITE);
sbView.setBackgroundColor(Color.RED);
textView.setMaxLines(3);
mSnackBar.show();
}
}
这是我目前在主要活动中的实现,我已经像这样初始化了Snackbar类:
SnackBarUtils snackBarUtils;
然后这样称呼它:
snackBarUtils.showProblemSnackBar(MainActivity.this,mPlainTextResponse);
我在做什么错?或者正确的方法是什么?
解决方法
首先,您将共享NPE的堆栈跟踪以获取更多上下文。
对于快餐栏实用程序:
如果您使用的是回调,则可以使用该实用工具显示以该回调为参数的小吃店:
interface onProblemSnackbarClickedListener {
void onActionClicked(View view);
}
...
/* inside SnackBarUtils.java */
...
public static void showProblemSnackbar(View view,@StringRes int message,onProblemSnackbarClickedListener listener){
Snackbar mSnackBar = Snackbar.make(view,message,Snackbar.LENGTH_INDEFINITE)
.setAction("x",new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onActionClicked(v);
mSnackBar.dismiss();
}
})
mSnackbar.show();
}
回调可以满足在活动/片段中监听它的需要。
有关Snackbar的样式,您可以看到以下相关问题: docs。
请牢记从“支持设计”到MDC(材料设计组件)的迁移,这有助于对带有主题属性的小吃店进行全局样式设计。