1. ホーム
  2. android

[解決済み] Android: なぜ、getBaseContext() を使わなければならないのか?

2022-02-04 20:13:23

質問

this は、しばしば現在のコンテキストを参照するために使用されます。しかし、ある場合、なぜ私たちは getBaseContext() の代わりに this . (これは 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 はエラーになります。

どなたか解説をお願いします。

どのように解決するのですか?

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

  2. this コンテキストはアクティビティの現在のコンテキストを返し、アクティビティに属し、アクティビティが破壊されると、それも破壊されます。 Spinner インスタンスの中で使用しているため onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3) メソッドから派生したものです。 Spinner クラスと Spinner からこのメソッドを継承しています。 AdapterView.OnItemSelectedListener インターフェース

  3. getBaseContext() のメソッドです。 ContextWrapper . そして ContextWrapper は、"。 Contextのプロキシ実装で、その呼び出しをすべて別のContextに単純に委譲する。サブクラス化することで、元のContextを変更することなく挙動を変更することができる。 javadocsによる)・・・。

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

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

というのは getBaseContext() のメソッドです。 ContextWrapperContextWrapper のプロキシ実装です。 Context ということで、間接的にContext Classオブジェクトを渡していることになります。

または、'Activity.this' を渡すこともできます。 Activity クラスは ContextWrapper クラスです。

であれば アンドロイド ドキュメント の場合、このメソッドは Context クラスオブジェクトを必要とします。
public static Toast makeText (Context context, int resId, int duration)

そのため、アクティビティやクラスのコンテキストを渡すことはできません。 this から Toast.makeText のどちらかのサブクラスを持たないものです。 Context または ContextWrapper クラスがあります。