我正在尝试使用应用程序类定义全局对象。 因此,我定义了以下类。
public class MyApplication extends Application {
private MyObject myObject=new MyObject();
public MyObject getMyObject(){
return this.myObject;
}
}
然后,我在一个活动中使用它,但是我收到一个错误(无法解析方法getApplication()):
public class AnActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mood);
Button buttonMusic=(Button) findViewById(R.id.button5);
buttonMusic.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
MyApplication myApplication = ((MyApplication)this.getApplication());
Toast.makeText(MoodActivity.this, "playing music", Toast.LENGTH_SHORT).show();
}
});
}
}
我不知道为什么会出现此错误,因为例如在另一个活动中调用getApplication()时会有效。
我对Android和Java都很陌生,所以请原谅这个问题的独创性。
更新
然后我执行MyObject myObject=myApplication.getMyObject();
并且我没有收到任何编译问题,但是一旦我参与该活动,该应用程序就会死亡。
据我所知,不建议将Application类用于此类用途,那么什么是一个好的选择呢?
答案 0 :(得分:5)
您因为在this.getApplication()
内拨打View.OnClickListener
而收到此错误。因此,this
现在引用了侦听器而不是活动。
要执行您需要的操作,只需在您的活动的Context
方法中在聆听者之外创建一个onCreate
对象,然后为其指定this
。而且,在听众中,使用context
代替this
。这样的事情: -
public class AnActivity extends Activity {
Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mood);
context = this;
Button buttonMusic=(Button) findViewById(R.id.button5);
buttonMusic.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
MyApplication myApplication = ((MyApplication)context.getApplication());//Changed "the" to "context"
Toast.makeText(MoodActivity.this, "playing music", Toast.LENGTH_SHORT).show();
}
});
}
}
问题更新后修改:
使用static
对象来实现全局变量,而不是使用应用程序类。 static
个对象独立于对象,可以使用它们所属的类进行引用。例如,如果您在static
中定义MainActivity.class
变量并将其命名为testObject
,则无论您当前的活动如何,都可以使用以下代码访问该变量: -
YourObject object = MainActivity.testObject;
答案 1 :(得分:1)
除非您有特定的理由在Android中扩展Application类,否则您可能不应该这样做。作为参考,请查看文档中的注释:https://developer.android.com/reference/android/app/Application.html。
如果您正在尝试创建可在Android应用中使用的对象,只需像在Java中那样执行此操作:
public class MyObject {
//Your stuff here
}
如果您有特别想要扩展应用程序类的原因,那么如果您解释了您尝试做的事情,那么人们可以做更多的事情来帮助您。我根本不需要根据你的例子看到所有这些复杂性。
答案 2 :(得分:1)
将this
更改为AnActivity.this
。
在下面的代码中,this
的含义从AnActivity
更改为View.onClickListener
,因为它是另一个对象,并且在这些大括号内,您位于Click侦听器类的范围内
new View.OnClickListener() {
public void onClick(View v) {
MyApplication myApplication = ((MyApplication)this.getApplication());
Toast.makeText(MoodActivity.this, "playing music", Toast.LENGTH_SHORT).show();
}
}
所以上面的代码应该变成
new View.OnClickListener() {
public void onClick(View v) {
MyApplication myApplication = ((MyApplication)AnActivity.this.getApplication());
Toast.makeText(MoodActivity.this, "playing music", Toast.LENGTH_SHORT).show();
}
}
您可以阅读更多相关信息here