使用应用程序 class 通过应用程序共享对象
Sharing objects through the app using the Application class
我正在尝试使用应用程序 class 定义全局对象。
因此,我定义了以下 class.
public class MyApplication extends Application {
private MyObject myObject=new MyObject();
public MyObject getMyObject(){
return this.myObject;
}
}
然后,我在 activity 中使用它,但出现错误(无法解析方法 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();
}
});
}
}
我不知道为什么会出现此错误,因为它在另一个 activity.
中调用 getApplication() 时有效
我对Android和Java还很陌生,所以请原谅这个问题的独创性。
更新
然后我执行 MyObject myObject=myApplication.getMyObject();
并且我没有遇到任何编译问题但是应用程序在我进入 activity.
后立即死亡
据我了解,不建议将应用程序 class 用于此类用途,什么是更好的选择?
除非您有特定理由在 Android 中扩展应用程序 class,否则您可能不应该这样做。作为参考,请查看文档中的说明: https://developer.android.com/reference/android/app/Application.html 。
如果您尝试创建一个可以在 Android 应用中使用的对象,只需像在 Java 中那样做即可:
public class MyObject {
//Your stuff here
}
如果您出于某种原因特别想扩展应用程序 class,那么如果您解释您正在尝试做什么,人们可能会为您提供更多帮助。根据您的示例,我只是不一定认为需要经历所有这些复杂性:)
将 this
更改为 AnActivity.this
。
在下面的代码中,this
的含义从 AnActivity
变为 View.onClickListener
,因为它是另一个对象,并且在这些大括号内,您处于点击侦听器 class[= 的范围内18=]
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
您收到此错误是因为您在 View.OnClickListener
中调用了 this.getApplication()
。因此,this
现在引用侦听器而不是 activity。
要执行您需要的操作,只需在 activity 的 onCreate
方法中的侦听器外部创建一个 Context
对象,然后将 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();
}
});
}
}
问题更新后编辑:-
不使用应用程序class,而是使用static
对象实现全局变量。 static
对象独立于对象,可以使用它们所属的class 来引用。例如,如果您在 MainActivity.class
中定义了一个 static
变量并将其命名为 testObject
,那么无论您当前的 activity 是什么,都可以使用以下代码访问它:-
YourObject object = MainActivity.testObject;
我正在尝试使用应用程序 class 定义全局对象。 因此,我定义了以下 class.
public class MyApplication extends Application {
private MyObject myObject=new MyObject();
public MyObject getMyObject(){
return this.myObject;
}
}
然后,我在 activity 中使用它,但出现错误(无法解析方法 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();
}
});
}
}
我不知道为什么会出现此错误,因为它在另一个 activity.
中调用 getApplication() 时有效我对Android和Java还很陌生,所以请原谅这个问题的独创性。
更新
然后我执行 MyObject myObject=myApplication.getMyObject();
并且我没有遇到任何编译问题但是应用程序在我进入 activity.
据我了解,不建议将应用程序 class 用于此类用途,什么是更好的选择?
除非您有特定理由在 Android 中扩展应用程序 class,否则您可能不应该这样做。作为参考,请查看文档中的说明: https://developer.android.com/reference/android/app/Application.html 。
如果您尝试创建一个可以在 Android 应用中使用的对象,只需像在 Java 中那样做即可:
public class MyObject {
//Your stuff here
}
如果您出于某种原因特别想扩展应用程序 class,那么如果您解释您正在尝试做什么,人们可能会为您提供更多帮助。根据您的示例,我只是不一定认为需要经历所有这些复杂性:)
将 this
更改为 AnActivity.this
。
在下面的代码中,this
的含义从 AnActivity
变为 View.onClickListener
,因为它是另一个对象,并且在这些大括号内,您处于点击侦听器 class[= 的范围内18=]
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
您收到此错误是因为您在 View.OnClickListener
中调用了 this.getApplication()
。因此,this
现在引用侦听器而不是 activity。
要执行您需要的操作,只需在 activity 的 onCreate
方法中的侦听器外部创建一个 Context
对象,然后将 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();
}
});
}
}
问题更新后编辑:-
不使用应用程序class,而是使用static
对象实现全局变量。 static
对象独立于对象,可以使用它们所属的class 来引用。例如,如果您在 MainActivity.class
中定义了一个 static
变量并将其命名为 testObject
,那么无论您当前的 activity 是什么,都可以使用以下代码访问它:-
YourObject object = MainActivity.testObject;