显示来自非 activity class 的祝酒词。将上下文设置为 toast 的问题

Showing toasts from a non-activity class. Ploblem setting the context to the toast

剧透:这个 post 可能包含一些愚蠢的东西,因为习惯于 C 和 Java 编程

有一个 activity MainActivity 和一个 public 非 activity class 包含许多方法。我需要为其中一些人显示 toast 警报

当前的尝试是这样的,失败了 "Non-static method can not be referenced from a static context" for getApplicationContext():

void errorWarn (String warning) {
    Context context = android.content.ContextWrapper.getApplicationContext();
    Toast.makeText(context, "Something's wrong in " + warning, Toast.LENGTH_SHORT).show();
}

那么,如何从非activityclass调用toasts?

UPD:错误警告将从 class 中的方法 调用。所以,如果 class 的方法发生错误,应该有一个警报

我们在 MainActivity 中有一个 editText 字段。 class 应该从中获取并解析字符串。如果在某些步骤处理失败,它会在 MainActivity

中显示祝酒词

UPD2:完整结构。

主要活动:

public class MainActivity extends ActionBarActivity {
    <...>
    public void ButtonClick (View view) {
        Class.testfunc("");
    }
}

Class:

public class Class {
    void errorWarn (Context context, String warning) {
        Toast.makeText(context, "Something must be wrong. " + warning, Toast.LENGTH_SHORT).show();
    }
    void testfunc (String string) {
        errorWarn(string);
    }
}

传递上下文参数

 void errorWarn (Context context,String warning) {
        Toast.makeText(context, "Something's in wrong " + warning, Toast.LENGTH_SHORT).show();
    }

定义您的方法,使其在参数中使用 Context 并将您的 Activity 传递给它。

in YourOtherClass

public class YourOtherClass {

    public void showToast(Context context, String message){
        Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
    }
}

或者如果你想在你的构造函数中获取上下文并仅在 YourOtherClass 中使用 showToast :

public class YourOtherClass {

    private Context context;

    public YourOtherClass(Context context){
        this.context = context;
    }

    private void showToast(String message){
        Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
    }
}

in MainActivity

new YourOtherClass().showToast(this, message);

或者如果你有一个YourOtherClass的成员变量Context并且你想在YourOtherClass的构造函数中传递Context,你会做

new YourOtherClass(this).showToast(message);
// showToast doesn't have to take a Context as argument, it could just take one as constructor parameter and hold that. 
// But then you have to make sure YourOtherClass is not used anymore if the Activity is closed.

对于您提供的代码中出现的错误:

Context context = com.example.ex3.MainActivity;

这失败了,因为您正在尝试将类型分配给实例。

MainActivity.errorWarn("here");

这失败了,因为您正在调用一个非静态方法(该方法的签名中没有静态修饰符),就好像它是一个静态方法一样。查看 this question 了解有关静态方法与非静态方法的更多详细信息。

在不知道 YourOtherClass 做什么或它的生命周期如何与 Activity 相关联的情况下,很难说,但必须从 [=48= 触摸 UI ] 与 UI 无关,也没有提及 Context 您可以使用,感觉很奇怪。将 Context 作为 YourOtherClass 的构造函数的参数可能是您所需要的,但要小心泄漏 ContextActivity 生命周期。