gpt4 book ai didi

Android:为什么必须使用 getBaseContext() 而不是这个

转载 作者:IT老高 更新时间:2023-10-28 21:47:47 24 4
gpt4 key购买 nike

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上下文返回 Activity 的当前上下文,属于 Activity , Activity 被销毁然后它也会销毁。但在您的情况下,它将引用 Spinner实例,因为我们在 onItemSelected(AdapterView<?>arg0, View arg1, int arg2, long arg3) 中使用它来自 Spinner 的方法类(class)和SpinnerAdapterView.OnItemSelectedListener 继承此方法界面

  3. getBaseContext()ContextWrapper的方法.和ContextWrapper是,“Context 的代理实现,它只是将其所有调用委托(delegate)给另一个 Context。可以子类化以修改行为而不更改原始 Context。”(根据 javadocs)..

在你的情况下:Spinner类不是 Context 的子类或 ContextWrapper类*

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

表示getBaseContext()ContextWrapper的方法和 ContextWrapperContext 的代理实现所以间接地我们传递了一个上下文类对象。

或者我们也可以传递 'Activity.this' 因为 Activity类是 ContextWrapper 的子类类。

如果你选择 android documention那么这个方法需要一个Context类对象:
public static Toast makeText (Context context, int resId, int duration)

所以我们无法传递 Activity 或类上下文意味着 thisToast.makeText没有 Context 的子类或 ContextWrapper类。

关于Android:为什么必须使用 getBaseContext() 而不是这个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9605459/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com