当前位置: 首页 > news >正文

使用Context创建一个View需要注意的地方

如果我们在java代码中创建一个View,那么需要在View的构造方法中传一个Context,Application和Activity都是Context的子类,关于使用Application和Activity的创建一个View,google的引导教程是这样解释的:

It is possible to get the Context for the Application, but it is incorrect to use that context for creating UI, because it does not have the correct theme information. Instead, use the Context object for the Activity instead. For example, if you are retrieving resources for your activity, you should do so from the Activity context, not the Application context.

就是说Application 这个Context没有携带正确的主题信息。我们应该使用Activity的Context。比如想取得Activity的资源就应该通过Activity context,而不是Application Context。 这是我做的一个小测试

//通过activity创建一个View
RadioButton button1 = new RadioButton(this);
button1.setLayoutParams(params);
button1.setText("RadioButton created by activity");

//通过Application创建一个View
RadioButton button2 = new RadioButton(getApplicationContext());
button2.setLayoutParams(params);
button2.setText("RadioButton created by Application");
linerLayout.addView(button1);
linerLayout.addView(button2);
复制代码

这2个RadioButton分别通过Activity和Application创建。最后的看看结果:

可以发现两个button选中时的颜色不一样,这是因为Activity创建的RadioButton携带有AppTheme中的主题信息。

@color/colorPrimary
@color/colorPrimaryDark
@color/colorAccent
复制代码

随便补上一张详细的Context使用场景

  1. 启动Activity在这些类中是可以的,但是需要创建一个新的task。一般情况不推荐。
  2. 在这些类中去layout inflate是合法的,但是会使用系统默认的主题样式,如果你自定义了某些样式可能不会被使用。
  3. 在receiver为null时允许,在4.2或以上的版本中,用于获取黏性广播的当前值。(可以无视)

注:ContentProvider、BroadcastReceiver之所以在上述表格中,是因为在其内部方法中都有一个context用于使用。

相关文章:

  • Android爬坑之旅之FileProvider(Failed to find configured root that contains)
  • Java常用工具类之自定义访问对象
  • windows代理
  • unity3d GUITexture不显示问题
  • 微信小程序之 Index(仿淘宝分类入口)
  • Jerry的CRM Middleware(中间件)文章合集
  • 一些网址
  • 原生JS实现百度搜索功能
  • JavaScript:(a==1 a==2 a==3)能输出true么?
  • 阿里云启动API创新大赛 资源编排技术为场景赛题
  • 阿里云MaxCompute,用计算力让数据发声
  • Linux - ubuntu 设置固定ip和设置dns
  • 8-Socket网络编程
  • Linux下的tar压缩解压缩命令详解
  • CSS3第三天
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 分享的文章《人生如棋》
  • 【刷算法】求1+2+3+...+n
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 0基础学习移动端适配
  • 30天自制操作系统-2
  • gf框架之分页模块(五) - 自定义分页
  • JDK 6和JDK 7中的substring()方法
  • OSS Web直传 (文件图片)
  • scala基础语法(二)
  • Spring核心 Bean的高级装配
  • vue 个人积累(使用工具,组件)
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 多线程 start 和 run 方法到底有什么区别?
  • 如何选择开源的机器学习框架?
  • 数据仓库的几种建模方法
  • 通过几道题目学习二叉搜索树
  • 微服务入门【系列视频课程】
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 7行Python代码的人脸识别
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #WEB前端(HTML属性)
  • (3)STL算法之搜索
  • (Git) gitignore基础使用
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (SpringBoot)第二章:Spring创建和使用
  • (分享)自己整理的一些简单awk实用语句
  • (南京观海微电子)——I3C协议介绍
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .net core webapi 大文件上传到wwwroot文件夹
  • .NET Reactor简单使用教程
  • .net 反编译_.net反编译的相关问题
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .Net(C#)自定义WinForm控件之小结篇
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • /etc/shadow字段详解
  • @Autowired标签与 @Resource标签 的区别
  • @Autowired多个相同类型bean装配问题
  • @transaction 提交事务_【读源码】剖析TCCTransaction事务提交实现细节