【问题标题】:How to display toast in static method of a Util class?如何在 Util 类的静态方法中显示 toast?
【发布时间】:2016-11-02 00:18:30
【问题描述】:

我有以下 Utils 类,我想在 catch 块中为我的用户写一个友好的祝酒词,如下所示:

catch (JSONException e){
  Log.e(LOG_TAG, "String to JSON failed: " + e);
  showToast(getActivity, "Test toast");
}

但问题是如何获取我的活动或应用程序上下文? 我试过这个https://stackoverflow.com/a/23423970 但它对我不起作用,因为我不确定从哪里获得我的上下文?如果我必须创建 Util 类的构造函数,那么它就违背了 Util 类的目的,因为我不想实例化这个类。

这是我的课:

public class Utils {
  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 (JSONException e){
      Log.e(LOG_TAG, "String to JSON failed: " + e);
      showToast(getActivity, "Test toast");
    }
    return batchOperations;
  }

  public static void showToast(Context context, String text) {
    Toast.makeText(context, text, Toast.LENGTH_LONG).show();
}
  .....

【问题讨论】:

  • 您需要一个有效的上下文来显示Toast

标签: android android-fragments toast


【解决方案1】:

试试这个。

    public static ArrayList quoteJsonToContentVals(Activity activity, 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 (JSONException e){
          Log.e(LOG_TAG, "String to JSON failed: " + e);
          showToast(activity, "Test toast");
        }
        return batchOperations;
      }
public static void showToast(Activity activity, String text) {
    Toast.makeText(activity, text, Toast.LENGTH_LONG).show();

【讨论】:

  • 感谢我现在不在我的 Android Studio 面前。以后试试
  • 这不起作用,因为调用此方法的类是 GcmTaskService 并且我不知道如何传递我的活动:Utils.quoteJsonToContentVals(getResponse, What do I put here);跨度>
  • 服务本身是一个上下文,所以只需将 GcmTaskService.this 作为上下文而不是 Activity 传递
【解决方案2】:

要执行与UI 相关的任何操作,您需要拥有context,这样您就无法在没有它的情况下显示Toast

因此,解决方案是您可以创建一个 Application 类并添加一个 static 上下文并在需要时使用它。

步骤:

1.) 创建一个类并扩展 Application 类

 class App extends Application{
  }

2.) 在清单应用程序标签中注册您的类

   <application android:name="com.yourpackage.App">

3.) 创建一个静态上下文持有者和静态函数

   private static Context context;
   public static Context getAppContext() {
        return context;
   }

4.) 使用静态函数获取上下文

Follow this link to see the coding example

所以最终你的 toast 函数会是这样的

 public static void showToast(String text) {
    Toast.makeText(App.getAppContext(), text, Toast.LENGTH_LONG).show();
}

或者

另一个选项是将您的 Activity 上下文传递给这个 quoteJsonToContentVals 函数(如果可以的话)并在您的类中创建一个上下文持有者并使用它。

【讨论】:

    【解决方案3】:

    只需将上下文(不是活动,因为上下文就足够了)传递给您的 quoteJsonToContentVals() 方法。

    public static ArrayList quoteJsonToContentVals(Context context, String JSON){
    
       ...
    
          showToast(context, "Test toast");
    
       ...
    
    }
    
    public static void showToast(Context context, String text) {
       Toast.makeText(context, text, Toast.LENGTH_LONG).show();
    }
    

    顺便说一句。为什么不使用 gson (https://github.com/google/gson) 进行 json 映射?

    【讨论】:

      猜你喜欢
      • 2013-07-23
      • 2023-03-13
      • 2021-01-28
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      • 1970-01-01
      相关资源
      最近更新 更多