2016-08-07 5 views
0

私は、抽象的な基底クラスを作成して1か所にナビゲーション引出しコードを作成し、起動アクティビティを開始するために私のアプリケーションタイトルにonClickListenerを実装したいと考えています。抽象基底クラスのアクティビティコンテキストを取得する

@Override 
public void onClick(View view) { 
    switch (view.getId()){ 
     case R.id.toolbar_title: 
      Intent intent = new Intent(getApplicationContext(), MainActivity.class); 
      startActivity(intent); 
      return; 
    } 
} 

アプリが正常に動作しますが、私は1つが新たな活動を開始するためにアプリケーション・コンテキストを使用してはならないことをどこかで読ん:

私は、次のコードを使用しています。しかし、アンドロイド・スタジオでは、getApplicationContextgetBaseContext以外の文脈を使用することはできません。

どのコンテキストを使用する必要がありますか?

答えて

2

Context.getApplicationContext()およびContextWrapper.getBaseContext()。両者は共通してコンテキストインスタンス上に定義されています。あなたのケースではそれはさらにActivityです。

MainActivityを開始するコンテキストとしてthisを使用することもできます。他のコンテキストタイプでは、新しいアクティビティを開始するためにフラグFLAG_ACTIVITY_NEW_TASKを含める必要があるため、これはさらに優れています。

thisをコンテキストに使用してエラーが発生した場合は、OnClickListenerを匿名の内部クラスとして定義しているためです。これはもちろんコンテキストではありません。そのためにはMyBaseActivity.thisとしてください。これは外部クラスインスタンスを参照します。

+0

ねえ、1つの質問:基本クラスの 'this'は、現在実行中のアクティビティのコンテキストを参照しますか? 'this'や' MyBaseActivity.this'の出力と同様に、(derived)アクティビティでgetContextを呼び出すのと同じでしょうか? – sudshekhar

+0

@sudshekhar 'getContext()'のようなものは何もありません。しかし、「これは常にオブジェクトのインスタンスを指します。これはちょうどあなたの実行中の活動です。 – tynn

2

まあ、のいずれかの方法が可能:あなたのBaseActivityクラスで抽象メソッドを定義することができます。

abstract void launchMainActivity(); 

そして、あなたのクリックのリスナーに、このメソッドを呼び出します。

@Override 
public void onClick(View view) { 
    switch (view.getId()){ 
     case R.id.toolbar_title: 
      launchMainActivity(); 
      return; 
    } 
} 

サブクラスは次のようにこのメソッドを実装できます:

@Override 
void launchMainActivity() { 
    Intent intent = new Intent(this, MainActivity.class); 
    startActivity(intent); 
} 
+0

ありがとう私はあなたのアプローチも好きですが、私はこのアプローチが依然としてすべての派生クラスで実装を必要とするため(これはDRYに違反します)、他の答えを選択しました。 – sudshekhar

+0

@sudshekhar大丈夫ですが、まずはあなたが最初にやったことではありませんか? – Shaishav

関連する問題