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.
7 answers
getApplicationContext ()
zwraca kontekst aplikacji całego cyklu życia aplikacji,kiedy aplikacja zniszczy, to zniszczy również.-
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 instancjiSpinner
, ponieważ używamy tej metody w metodzieonItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3)
, która pochodzi z klasySpinner
iSpinner
dziedziczy tę metodę zAdapterView.OnItemSelectedListener
interfejs 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
.
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)
}
}
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.
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.
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ść.
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
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 ()
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