this
は、しばしば現在のコンテキストを参照します。しかし、場合によっては、なぜthis
の代わりにgetBaseContext()
を使用しなければならないのか。 (つまり、this
を使用するとエラーが発生することになります)。
これが私の例です:
_Spinner spinner = (Spinner) findViewById(R.id.spinner);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3){
Toast.makeText(getBaseContext(),"SELECTED", Toast.LENGTH_SHORT).show(); //this line
}
_
上記のコードで、getBaseContext()
をthis
に変更するとエラーが発生します。
誰が説明してくれますか?.
getApplicationContext ()
は、アプリケーションのライフサイクル全体のアプリケーションコンテキストを返します。アプリケーションが破棄されると、アプリケーションも破棄されます。
this
コンテキストは、アクティビティの現在のコンテキストを返し、アクティビティに属します。アクティビティは破棄され、その後破棄されます。しかし、あなたの場合は、Spinner
インスタンスを参照しますSpinner
クラスからのonItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3)
メソッドとSpinner
内でこのメソッドを_AdapterView.OnItemSelectedListener
_インターフェイスから継承します
getBaseContext()
はContextWrapper
のメソッドです。 ContextWrapper
は、「すべての呼び出しを別のコンテキストに単純に委任するコンテキストのプロキシ実装です。サブクラス化して、元のコンテキストを変更せずに動作を変更できます。」( javadocsに従って).
そしてあなたの場合:Spinner
クラスはContext
またはContextWrapper
class *のサブクラスではありません
_Toast.makeText(getBaseContext(),"SELECTED", Toast.LENGTH_SHORT).show();
_
は、getBaseContext()
がContextWrapper
のメソッドであり、ContextWrapper
がContext
のプロキシ実装であるため、間接的にコンテキストクラスオブジェクトを渡すことを意味します。
Activity
クラスはContextWrapper
classのサブクラスであるため、 'Activity.this'を渡すこともできます。
Android documention を使用する場合、このメソッドにはContextクラスオブジェクトが必要です。public static Toast makeText (Context context, int resId, int duration)
したがって、アクティビティを渡すことはできません。クラスコンテキストは、this
またはContext
クラスのサブクラスを持たない_Toast.makeText
_にContextWrapper
を意味します。
あなたの例では、this
は、コンテキストオブジェクトではなく、新しく作成されたOnItemSelectedListener
を指します。このコードが動作中の場合、getBaseContext()
の代わりにYourActivity.this
を記述できます。
OnItemSelectedListener listener = new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3){
// this.equals(listener) == true;
// getBaseContext() here means YourActivity.this.getBaseContext()
// getBaseContext() called from outer context object (activity, application, service)
}
}
このコードがアクティビティMyActivity
にある場合、getBaseContext()
を_MyActivity.this
_に置き換えることもできます。
これは、this
がアクティビティではなくOnItemSelectedListenerインスタンスを参照するためです。 getBaseContext()
は、アクティビティコンテキストを指します。
getBaseContext()はActivity.thisを参照します
ボタンのクリックでToastを表示したいように、Activty.thisを使用することはありません。トーストは、同じアクティビティが始まるまで表示されます。ただし、getApplicationContext()を使用すると、アクティビティを切り替えてもToastが表示されます。
OnItemSelected
メソッド。これは、使用した新しいOnItemSelectedListener
インスタンスを指します。 getBaseContext
は外部クラスです。
this
を使用する場合、OnItemSelectedListener
を参照します。そして、そのInterface not Class
.soエラーが発生します,アクティビティ中は常に使用YourActivityName.this
GetBaseContext()は、Androidの新しいユーザーを混乱させることがありますが、代わりに、現在作業中のActivityNameを使用することもできます。そのため、ActivityName.thisはgetBaseContext()を置き換えます