Spoiler:由于习惯于C和Java编程新手,这篇文章可能包含一些愚蠢的内容
有一个活动MainActivity和一个包含许多方法的公共非活动类。我需要为其中一些人显示吐司警报
当前的尝试是这样的,它失败了“无法从静态上下文引用非静态方法”for getApplicationContext():
void errorWarn (String warning) {
Context context = android.content.ContextWrapper.getApplicationContext();
Toast.makeText(context, "Something's wrong in " + warning, Toast.LENGTH_SHORT).show();
}
那么,如何从非活动类调用toast?
UPD :将从类中的方法调用errorWarn。因此,如果类的方法中出现错误,则应该有警报
我们在MainActivity中有一个editText字段。该类应该从中获取并解析字符串。如果在某个步骤处理失败时,它会在MainActivity中显示Toast
UPD2 :完整结构。
MainActivity:
public class MainActivity extends ActionBarActivity {
<...>
public void ButtonClick (View view) {
Class.testfunc("");
}
}
类别:
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);
}
}
答案 0 :(得分:4)
定义您的方法,以便在参数中使用Activity
并将public class YourOtherClass {
public void showToast(Context context, String message){
Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
}
}
传递给它。
在YourOtherClass 中
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();
}
}
:
new YourOtherClass().showToast(this, message);
MainActivity中的
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.
,那么您可以
Context context = com.example.ex3.MainActivity;
对于您提供的代码中出现的错误:
MainActivity.errorWarn("here");
此操作失败,因为您尝试将类型分配给实例。
YourOtherClass
这会失败,因为您正在调用非静态方法(该方法在其签名中没有静态修饰符),就好像它是静态方法一样。有关静态和非静态方法的更多详细信息,请查看this question。
在不知道Context
做什么或者它的生命周期如何与Activity关联的情况下,很难说,但是必须从不与UI相关的类中触摸UI并且没有任何对{{}的引用1}}你可以使用,这感觉很奇怪。将Context
作为YourOtherClass
的构造函数的参数可能是您需要的,但要注意泄漏Context
和Activity
生命周期。
答案 1 :(得分:1)
传递上下文参数
void errorWarn (Context context,String warning) {
Toast.makeText(context, "Something's in wrong " + warning, Toast.LENGTH_SHORT).show();
}