web-dev-qa-db-ja.com

Android:なぜこれの代わりにgetBaseContext()を使用する必要があるのか

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に変更するとエラーが発生します。

誰が説明してくれますか?.

31
hqt
  1. getApplicationContext ()は、アプリケーションのライフサイクル全体のアプリケーションコンテキストを返します。アプリケーションが破棄されると、アプリケーションも破棄されます。

  2. thisコンテキストは、アクティビティの現在のコンテキストを返し、アクティビティに属します。アクティビティは破棄され、その後破棄されます。しかし、あなたの場合は、Spinnerインスタンスを参照しますSpinnerクラスからのonItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3)メソッドとSpinner内でこのメソッドを_AdapterView.OnItemSelectedListener_インターフェイスから継承します

  3. getBaseContext()ContextWrapperのメソッドです。 ContextWrapperは、「すべての呼び出しを別のコンテキストに単純に委任するコンテキストのプロキシ実装です。サブクラス化して、元のコンテキストを変更せずに動作を変更できます。」( javadocsに従って).

そしてあなたの場合:SpinnerクラスはContextまたはContextWrapper class *のサブクラスではありません

_Toast.makeText(getBaseContext(),"SELECTED", Toast.LENGTH_SHORT).show();
_

は、getBaseContext()ContextWrapperのメソッドであり、ContextWrapperContextのプロキシ実装であるため、間接的にコンテキストクラスオブジェクトを渡すことを意味します。

ActivityクラスはContextWrapper classのサブクラスであるため、 'Activity.this'を渡すこともできます。

Android documention を使用する場合、このメソッドにはContextクラスオブジェクトが必要です。
public static Toast makeText (Context context, int resId, int duration)

したがって、アクティビティを渡すことはできません。クラスコンテキストは、thisまたはContextクラスのサブクラスを持たない_Toast.makeText_にContextWrapperを意味します。

48

あなたの例では、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)
    }
}
14
Sergey Glotov

このコードがアクティビティMyActivityにある場合、getBaseContext()を_MyActivity.this_に置き換えることもできます。

これは、thisがアクティビティではなくOnItemSelectedListenerインスタンスを参照するためです。 getBaseContext()は、アクティビティコンテキストを指します。

9
louiscoquio

getBaseContext()はActivity.thisを参照します

ボタンのクリックでToastを表示したいように、Activty.thisを使用することはありません。トーストは、同じアクティビティが始まるまで表示されます。ただし、getApplicationContext()を使用すると、アクティビティを切り替えてもToastが表示されます。

4
sharma_kunal

OnItemSelectedメソッド。これは、使用した新しいOnItemSelectedListenerインスタンスを指します。 getBaseContextは外部クラスです。

4
Raz

thisを使用する場合、OnItemSelectedListenerを参照します。そして、そのInterface not Class .soエラーが発生します,アクティビティ中は常に使用YourActivityName.this

3

GetBaseContext()は、Androidの新しいユーザーを混乱させることがありますが、代わりに、現在作業中のActivityNameを使用することもできます。そのため、ActivityName.thisはgetBaseContext()を置き換えます

3
EdemOne