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

をもう少し読むことができますe View.OnClickListener。このため、thisはリスナーを参照するようになりましたが、アクティビティは参照しません。

必要な処理を行うには、アクティビティのonCreateメソッドでContextオブジェクトをリスナの外に作成し、thisを割り当てます。リスナーの内部では、thisの代わりにcontextを使用します。このような何か: - 質問の更新後

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オブジェクトはオブジェクトから独立しており、オブジェクトが属するクラスを使用して参照できます。あなたはMainActivity.classと名前をtestObjectstatic変数を定義した場合、それは関係なく、あなたの現在の活動の次のコードを使用してアクセスすることができます: -

YourObject object = MainActivity.testObject; 
1

AndroidでApplicationクラスを拡張する特別な理由がない限り、おそらくそうではありません。参考のために、このドキュメントの注記を参照してください:https://developer.android.com/reference/android/app/Application.html

あなたは単にあなたは、Javaと同じようにそれを行う、あなたのAndroidアプリ内で使用できるオブジェクトを作成しようとしている場合:

public class MyObject { 
    //Your stuff here 
} 

あなたは特別延長を希望している理由がある場合アプリケーションクラスには、あなたが何をしようとしているのかを説明すれば、人々があなたを助けるためにできることがもっとあります。私はちょうどあなたの例に基づいてすべてのその複雑さを通過する必要性を必ずしも見ていません:)

+0

私の主張は、さまざまな活動の間で共有されるグローバルオブジェクトを持つことです。私は主なアクティビティで自分のオブジェクトを定義してから、 'MyObject myObject = myApplication.getMyObject();'を実行し、オブジェクトに対して操作を行います。しかし、これは実際にアプリを殺す、この行はアプリのバグを引き起こす。 – Robin

1

変更thisからAnActivity.thisを変更します。 View.onClickListenerAnActivityからthis変化の意味は以下のコード内 は、それが他の目的であるとして、それらの中括弧の内側に、あなたは、したがって、上記のコードはなるはずクリックリスナクラス

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(); 
     } 
    } 

あなたはthis.getApplication() insidを呼び出すため、このエラーを取得していることについてhere

関連する問題