【问题标题】:Android how to call Activity data type from another class in Main Activity?Android 如何从 Main Activity 中的另一个类调用 Activity 数据类型?
【发布时间】:2021-01-14 05:39:14
【问题描述】:

我有这个代码单独的类,它使 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();
}
}

这是我当前在主要活动中的实现,我已经像这样初始化了小吃栏类:

SnackBarUtils snackBarUtils;

然后这样称呼它:

snackBarUtils.showProblemSnackBar(MainActivity.this, mPlainTextResponse);

我做错了什么?或者这样做的正确方法是什么?

【问题讨论】:

    标签: java android android-activity snackbar


    【解决方案1】:

    首先,您将共享 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 的样式,你可以看到这个相关的问题: Style SnackBar in theme app.

    请记住从“支持设计”到 MDC(材料设计组件)的迁移,这有助于使用主题属性对快餐栏进行全局样式设置。

    【讨论】:

    • 感谢您的回答,但我如何在主活动中调用它以显示小吃店?
    • @Reaper .... 因为你有一个 SnackBarUtils 类,你可以像以前一样调用它......在你的活动中它会是这样的: /* 在你的活动中 / SnackBarUtils. getInstance().showProblemSnackbar(rootView, R.string.snack_message, new onProblemSnackbarClickedListener { (at)Override public void onActionClicked(View v){/ 这里的回调逻辑。*/ } })
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多