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()
to this
将收到错误。
谁能给我解释一下,拜托了。
-
getApplicationContext ()
返回整个应用程序生命周期的应用程序上下文,当应用程序销毁时它也会销毁。
-
this
上下文返回活动的当前上下文,属于该活动,该活动被销毁,那么它也会销毁。但在您的情况下,它将引用Spinner
实例,因为我们正在使用它onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3)
方法来自于Spinner
类和Spinner
继承这个方法AdapterView.OnItemSelectedListener
界面
-
getBaseContext()
的方法是ContextWrapper
. And ContextWrapper
is, "Context 的代理实现,只需将其所有调用委托给另一个 Context。可以进行子类化以修改行为而不更改原始上下文。“(根据 javadocs)..
在你的情况下:Spinner
类不是 的子类Context
or ContextWrapper
class*
Toast.makeText(getBaseContext(),"SELECTED", Toast.LENGTH_SHORT).show();
means getBaseContext()
是方法ContextWrapper
and ContextWrapper
是代理实现Context
所以我们间接地传递了一个 Context 类对象。
或者我们也可以传递 'Activity.this' 因为Activity
类是子类ContextWrapper
class .
如果你去安卓文档 http://developer.android.com/reference/android/widget/Toast.html那么这个方法需要一个 Context 类对象:
public static Toast makeText (Context context, int resId, int duration)
所以我们无法传递活动或类上下文手段this
to Toast.makeText
没有任何一个子类Context
or ContextWrapper
class.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)