android - 为什么我的应用程序的某些部分在一个上下文中工作而在另一个上下文中不工作?
问题描述
好的,我有一个类LibApp
,它是扩展的应用程序类并存储上下文:
public class LibApp extends Application {
private static LibApp instance;
private static Context context;
private AppModule appModule;
private AppComponent appComponent;
@Override
public void onCreate() {
super.onCreate();
...
instance = this;
context = getApplicationContext();
...
}
public static LibApp getInstance() {
return instance;
}
public static Context getContext() {
return context;
}
...
}
然后我有带有 Fragment 的 Activity,这个 Fragment 包含 RecyclerView 和 Adapter。我的适配器打来电话HomePacksAdapter
,他留意 Context 来创建 ImageView。所以,如果我写:
HomePacksAdapter adapter = new HomePacksAdapter(getContext());
一切正常。但如果我写:
HomePacksAdapter adapter = new HomePacksAdapter(LibApp.getContext());
我很喜欢:
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
我不认为我理解上下文是什么,因为我无法解释为什么一个上下文比另一个上下文“更好”。在我的定义中,上下文是提供应用程序基本功能的对象,那么,应用程序上下文不提供我的适配器需要的那些东西呢?
解决方案
getApplicationContext()
- 返回应用程序中运行的所有活动的上下文。所以你的家庭适配器只需要你的活动的上下文来膨胀视图,而你正在提供所有活动的上下文,所以它根本无法确定在哪里膨胀视图。
getBaseContext()
- 如果您想从应用程序中的另一个上下文访问上下文,您可以访问。
getContext()
- 仅返回当前正在运行的活动的上下文视图,这确实是当您使用 getContext() 时它可以正常工作的原因,因为它会找到活动的上下文来膨胀视图。
希望能帮助到你。
推荐阅读
- c# - 将文件块上传到 SPS 2013 - 行中不存在方法“StartUpload”
- mysql - MySQL - 根据值分配数字
- elasticsearch - 做出像 Quora 这样令人印象深刻的自我暗示的核心部分是什么?
- javascript - 如何打印带有缩进的 HTML 代码?
- azure-devops - 上游 Feed 功能是否会导致计费增加作为副作用?
- c# - DTO(数据传输对象)和数据对象之间是否存在概念差异?
- typescript - 运行用打字稿编写的量角器插件
- sql - 带有 LIKE 的 SELECT 查询失败
- python - 拟合 scipy.linalg.lstsq 时如何考虑数据的不确定性(标准偏差)?
- c# - 如何使用 Helix.SharpDX 体积渲染可视化 3D 标量场?