Android 如何从 Main Activity 中的另一个类调用 Activity 数据类型?

Posted

技术标签:

【中文标题】Android 如何从 Main Activity 中的另一个类调用 Activity 数据类型?【英文标题】:Android how to call Activity data type from another class in Main 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);

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

【问题讨论】:

【参考方案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)/ 这里的回调逻辑。*/ )

以上是关于Android 如何从 Main Activity 中的另一个类调用 Activity 数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Android 4.3 中的类(此类扩展 LinearLayout)启动 Activity?

如何杀掉 android 如何跳转到 main activity

如何将数据从Activity返回到Fragment

如何从 Main Activity 到 Fragment,并从同一个 Fragment 返回到 Main Activity?

Android ADT:没有 fragment_main.xml,只有 activity_main.xml

Android 从Activity中往ViewPager里的fragment传递数据