2017-07-02 65 views
0

我正在尝试使用应用程序类定义全局对象。 因此,我定义了以下类。使用应用程序类通过应用程序共享对象

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很新,所以请原谅这个问题的巧妙。

UPDATE

然后我做的MyObject myObject=myApplication.getMyObject();,我没有得到任何编译问题,但应用程序,只要我在这一活动得到死亡。

据我所知,不建议使用应用程序类的这种用途,什么是一个很好的选择?

+0

检查我更新的答案。 –

回答

5

你,因为你叫this.getApplication() insid收到此错误e View.OnClickListener。因此,this现在引用了侦听器而不是活动。

要做到你需要什么,只需创建您的活动的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(); 
     } 
    }); 

    } 

} 

编辑问题更新后: -

使用的应用类,而不是使用static对象来实现全局变量。对象是独立于对象的,可以使用它们所属的类来引用。例如,如果你在你的MainActivity.class和名称定义一个变量statictestObject,那么它可以访问使用下面的代码,无论你目前的活动: -

YourObject object = MainActivity.testObject; 
1

除非你有在Android中扩展应用程序类的特定原因,否则你可能不应该这样做。作为参考,请查看文档中有关此的注释:https://developer.android.com/reference/android/app/Application.html

如果你想创建一个对象,你可以在你的Android应用程序使用,只需做到这一点,你会在Java中:

public class MyObject { 
    //Your stuff here 
} 

如果有,你想专门延长的理由应用程序类可能还有更多的人可以做,如果你解释你想要做什么来帮助你。我只是没有必要看到需要根据你的例子去经历所有的复杂性:)

+0

我的观点是有一个全局对象,在各种活动之间共享。我在主要活动中定义了我的对象,然后执行'MyObject myObject = myApplication.getMyObject();'并对我的对象执行操作。但是这实际上杀死了应用程序,这一行使得应用程序的bug。 – Robin

1

更改thisAnActivity.this。 从AnActivityView.onClickListenerthis变化的意义下面的代码里面,因为它是另一个对象和那些大括号内你在点击监听器类

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

相关问题