2017-07-02 64 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

相關問題