Android: dlaczego trzeba używać getBaseContext () zamiast tego

this często odwołując się do aktualnego kontekstu. Ale w pewnym przypadku, dlaczego musimy używać getBaseContext() zamiast this. (Oznacza to, kiedy użycie this zauważy błąd).

Oto mój przykład:

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
    }

W powyższym kodzie, gdy zmienię getBaseContext() na this otrzyma błąd.

Kto mi to wyjaśni?
Author: Brian Tompsett - 汤莱恩, 2012-03-07

7 answers

  1. getApplicationContext () zwraca kontekst aplikacji całego cyklu życia aplikacji,kiedy aplikacja zniszczy, to zniszczy również.

  2. this kontekst zwraca bieżący kontekst aktywności, należy do aktywności, aktywność jest niszczona, a następnie zniszczy również.ale w Twoim przypadku będzie to odnosić się do instancji Spinner, ponieważ używamy tej metody w metodzie onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3), która pochodzi z klasy Spinner i Spinner dziedziczy tę metodę z AdapterView.OnItemSelectedListener interfejs

  3. getBaseContext() jest metodą ContextWrapper. IContextWrapper jest, "Proxy implementacja kontekstu, który po prostu deleguje wszystkie swoje wywołania do innego kontekstu. Może być podklasowany, aby modyfikować zachowanie bez zmiany pierwotnego kontekstu. " (wg javadocs)..

A w Twoim przypadku: Spinner klasa nie jest podklasą Context lub ContextWrapper klasa*

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

Oznacza getBaseContext() jest metodą ContextWrapper i ContextWrapper jest implementacją Proxy Context więc pośrednio mijamy obiekt klasy Context.

Lub możemy również przejść ' aktywność.this ' because Activity class is subclass of ContextWrapper class .

Jeśli używasz Android documentation wtedy ta metoda wymaga obiektu klasy Context:
public static Toast makeText (Context context, int resId, int duration)

Więc nie jesteśmy w stanie przekazać aktywności lub kontekstu klasy this do Toast.makeText, które nie mają podklasy klasy Context lub ContextWrapper.

 44
Author: ρяσѕρєя K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-07 21:04:29

W twoim przykładzie this odnosi się do nowo utworzonego OnItemSelectedListener, a nie do żadnego obiektu kontekstowego. Jeśli ten kod jest w aktywności, możesz napisać YourActivity.this zamiast getBaseContext().

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)
    }
}
 13
Author: Sergey Glotov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-07 16:44:39

Jeśli ten kod znajduje się w aktywności MyActivity, Możesz również zastąpić getBaseContext() przez MyActivity.this.

Dzieje się tak, ponieważ this odnosi się do instancji OnItemSelectedListener, a nie do działania. getBaseContext() odnosi się do kontekstu aktywności.

 8
Author: louiscoquio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-07 16:42:52

OnItemSelected metoda ta odnosi się do nowej instancji OnItemSelectedListener, której użyłeś. getBaseContext to twoja klasa zewnętrzna.

 4
Author: Raz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-25 04:24:06

GetBaseContext() odnosi się do aktywności.this

Tak jak chcemy pokazywać Toast po kliknięciu przycisku, nigdy nie używamy tego używamy Activty.to. Tak, że nasze tosty wyświetlania aż jesteśmy na tej samej działalności. Ale jeśli użyjemy getApplicationContext () niż nasz Toast wyświetli nawet możemy przełączać aktywność.

 4
Author: sharma_kunal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-25 17:26:28

Jeśli używasz this refers OnItemSelectedListener .I jego Interface not Class. więc to daje błąd ,,, Zawsze używaj, jeśli jesteś w aktywności YourActivityName.this

 3
Author: Samir Mangroliya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-07 16:42:56

GetBaseContext() czasami myli nowych użytkowników Androida, zamiast tego można również użyć nazwy ActivityName, która jest bieżącą aktywnością, w której pracujesz. / align = "left" / to zastąpi getBaseContext ()

 3
Author: EdemOne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-06 18:51:16