从Utility类显示Snackbar

时间:2016-05-23 06:54:26

标签: java android android-snackbar

我试图在我的实用程序类中抛出异常时显示SnackBar

Utils.class

    public class Utils {

  private static String LOG_TAG = Utils.class.getSimpleName();

  public static boolean showPercent = true;

  public static ArrayList quoteJsonToContentVals(String JSON){
    ArrayList<ContentProviderOperation> batchOperations = new ArrayList<>();
    JSONObject jsonObject = null;
    JSONArray resultsArray = null;
    try{
      jsonObject = new JSONObject(JSON);
      if (jsonObject != null && jsonObject.length() != 0){
        jsonObject = jsonObject.getJSONObject("query");
        int count = Integer.parseInt(jsonObject.getString("count"));
        if (count == 1){
          jsonObject = jsonObject.getJSONObject("results")
              .getJSONObject("quote");
          batchOperations.add(buildBatchOperation(jsonObject));
        } else{
          resultsArray = jsonObject.getJSONObject("results").getJSONArray("quote");

          if (resultsArray != null && resultsArray.length() != 0){
            for (int i = 0; i < resultsArray.length(); i++){
              jsonObject = resultsArray.getJSONObject(i);
              batchOperations.add(buildBatchOperation(jsonObject));
            }
          }
        }
      }
    } catch (Exception e)
    {
      runError();  // <-- The method that displays the Snackbar
    }
    return batchOperations;
  }

而且,现在这里是尝试显示SnackBar

的方法
  private static void runError()
  {

    Snackbar.make(this.findViewById(android.R.id.content), "OOPS that's an error :/", Snackbar.LENGTH_LONG).show();
  }

现在,问题是:我无法context致电SnackBar。我尝试将this替换为:

  • getContext()
  • getActivity()
  • getApplicationContext()

由于这一切都没有奏效,我尝试创建一个Application类来全局获取上下文。

    public class StockMain extends Application
{
    private static StockMain instance;

    public static StockMain getInstance() {
        return instance;
    }

    public static Context getContext(){
        return instance;
        // or return instance.getApplicationContext();
    }

    @Override
    public void onCreate() {
        instance = this;
        super.onCreate();
    }
}

并尝试将方法runError()更改为:

     private static void runError()
  {

    Snackbar.make(StockMain.getContext().findViewById(android.R.id.content), "OOPS that's an error :/", Snackbar.LENGTH_LONG).show();
  }

不幸的是,这不起作用! 那么,如何解决这个问题呢?

2 个答案:

答案 0 :(得分:0)

您可以在Util类中创建构造函数,并将Activity / Fragment的上下文传递给Util类。像这样:

public class Utils {   上下文mContext;

//创建构造函数

public Utils(Context context)
{
mContext = context;
}

//其余的代码  }

和你的 runError()

private void runError()
  {
  Snackbar.make(mContext.findViewById(android.R.id.content), "OOPS that's an error :/", Snackbar.LENGTH_LONG).show();
  }

答案 1 :(得分:0)

  1. 尝试将view参数传递给您的方法,如下所示 -

    quoteJsonToContentVals(View view, String JSON)
    
  2. 其中view可以是Activity中引用的任何视图。

    1. 然后致电runError(view);
    2. 更改方法如下 -

      private static void runError(View view) {
          Snackbar.make(view, "OOPS that's an error :/", Snackbar.LENGTH_LONG).show();
      }