显示非活动类的敬酒。设置环境为吐司的问题

Ale*_*lex 2 java android android-toast

剧透:这篇文章可能由于使用C和Java编程新手而有些愚蠢

有一个活动MainActivity和一个包含许多方法的公共非活动类。我需要为其中一些显示烤面包警报

当前的尝试是这样的,但对于getApplicationContext()失败,并显示“无法从静态上下文引用非静态方法”:

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

那么,如何从非活动类中调用吐司呢?

UPD:将从类中的方法调用errorWarn 。因此,如果在类的方法中发生错误,则应该发出警报

我们在MainActivity中有一个editText字段。该类应从中获取并解析字符串。如果在某些步骤上处理失败,则在MainActivity中显示吐司

UPD2:完整结构。

主要活动:

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

类:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

2De*_*Dee 5

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

在YourOtherClass中

public class YourOtherClass {

    public void showToast(Context context, String message){
        Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者如果您想在构造函数中使用Context并showToast仅在中使用YourOtherClass

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在MainActivity中

new YourOtherClass().showToast(this, message);
Run Code Online (Sandbox Code Playgroud)

或者,如果您具有的Context成员变量,YourOtherClass并且想要Context在的构造函数中传递,则YourOtherClass可以执行

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.
Run Code Online (Sandbox Code Playgroud)

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

Context context = com.example.ex3.MainActivity;
Run Code Online (Sandbox Code Playgroud)

之所以失败,是因为您试图为实例分配类型。

MainActivity.errorWarn("here");
Run Code Online (Sandbox Code Playgroud)

失败是因为您正在调用非静态方法(该方法的签名中没有静态修饰符),就好像它是静态方法一样。请查看此问题,以获取有关静态方法和非静态方法的更多详细信息。

不知道做什么YourOtherClass和它的生命周期如何链接到Activity的行为,很难说,但是不得不从与UI不相关且没有任何Context可使用引用的类中触摸UI ,这很奇怪。您可能需要使用Contextas的构造函数作为参数YourOtherClass,但是要警惕泄漏ContextActivity生命周期。