Android笔记(一):this 的表示范围和 Context
this 的表示范围
this 指的是它所在的直接所在的类。
例如:
public class MyClass{
int num;
public MyClass(int num){
this.num = num;
}
}
在初始化中,传入的变量名与 MyClass 类的类变量名一致。如果直接:
num = num;
这样是得不到预期的效果的。
这里的 this.num 可以理解为 MyClass.num ,但又不是 MyClass.num 。因为程序在运行的时候,会有一个 MyClass 类的实例对象。这个 this 指的是实例化的对象,而 MyClass.num 则指的是静态的类。
Android 中,在给 MainActivity 类的按钮设置点击事件的时候:
btnSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"this is a toast",Toast.LENGTH_SHORT).show();
}
});
这里用到了 MainActivity.this ,如果直接传入 this 则是错的。
但同时你又会发现,如果你不是在这个new View.OnClickListener()
里面写 Toast ,就不用写成MainActivity.this
,而是直接写成:
Toast.makeText(this,"this is another toast",Toast.LENGTH_SHORT).show();
怎么会有两种写法?
第一种写法是因为这里的new View.OnClickListener()
创建了一个对象,View.OnClickListener()
是一个接口,那么自然就得有一个类来实现这个接口,这里是一个匿名类。也就是说,第一种写法是在 MainActivity 类的内部的一个类里面写的 Toast 。那么如果直接使用 this ,这时它指向的是这个匿名类,因为 this 的直接所在类是这个匿名类。
第二种写法是因为这是直接写在 MainActivity 这个类的方法里面的,这行代码没有再被一个类所包含, MainActivity 是它的直接上层类。
传入 Activity 而不是 Context ?
到这里还有一个疑问,那就是 Toast 类的这个 makeText 所要求的参数:
public static Toast makeText(Context context, CharSequence text, @Duration int duration)
这里接收的是 Context ,而我们传入的是 Activity 。
在 Activity官方文档 可以看到:
Activity 是 Context 的间接子类,所以可以直接传入 Activity 。
顺便,我们再来看看我们经常看到的一个AppCompatActivity
类,也就是我们每次创建新的 Activity 的时候,Android Studio 自动帮我们继承的类。我以前曾经很好奇:为什么不是直接继承 Activity 类?
这个 AppCompatActivity 是 Activity 的间接子类!它是一种向下兼容的 Activity ,可以将在 Android 2.1系统之后 Activity 增加的内容可以在 Android 2.1上正确执行。只要你编写程序的时候,在build.gradle
的dependencies
里添加远程依赖库,例如:
compile 'com.android.support:appcompat-v7:25.1.0'
这个通常是 Android Studio 自动添加的,我们只需要放心的使用 AppCompatActivity 就行了。
Android笔记(一):this 的表示范围和 Context的更多相关文章
- Android笔记——Android中数据的存储方式(二)
我们在实际开发中,有的时候需要储存或者备份比较复杂的数据.这些数据的特点是,内容多.结构大,比如短信备份等.我们知道SharedPreferences和Files(文本文件)储存这种数据会非常的没有效 ...
- Android笔记:触摸事件的分析与总结----TouchEvent处理机制
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://glblong.blog.51cto.com/3058613/1559320 ...
- Android 笔记之 R 文件
Android笔记之R文件 h2{ color: #4abcde; } a{ color: blue; text-decoration: none; } a:hover{ color: red; te ...
- Android 笔记之 Android 系统架构
Android笔记之Android系统架构 h2{ color: #4abcde; } a{ color: blue; text-decoration: none; } a:hover{ color: ...
- Android笔记之使用Glide加载网络图片、下载图片
Glide简介 不想说太多,真的很方便:P)可以节省我不少时间 GitHub地址:https://github.com/bumptech/glide 加载网络图片到ImageView Glide.wi ...
- Android笔记--View绘制流程源码分析(二)
Android笔记--View绘制流程源码分析二 通过上一篇View绘制流程源码分析一可以知晓整个绘制流程之前,在activity启动过程中: Window的建立(activit.attach生成), ...
- Android笔记--View绘制流程源码分析(一)
Android笔记--View绘制流程源码分析 View绘制之前框架流程分析 View绘制的分析始终是离不开Activity及其内部的Window的.在Activity的源码启动流程中,一并包含 着A ...
- Android笔记--自定义控件仿遥控器的圆形上下左右OK圆盘按钮
原文:Android笔记--自定义控件仿遥控器的圆形上下左右OK圆盘按钮 上面就是几张预览图!代码在最底下 主要就两个步骤,画图.监听点击 1.整个控件基本上是一步步画出来的,重写onDraw方法开始 ...
- 我的Android笔记--我对安卓系统的一些了解
敲了这么长时间代码,记录一下我对Android的一些概念,下面大部分内容来源自网络资料和官方给的文档. 1,Android操作系统的核心属于Linux的一个分支,具有典型的Linux调度和功能 ...
- Android笔记——Android中数据的存储方式(三)
Android系统集成了一个轻量级的数据库:SQLite,所以Android对数据库的支持很好,每个应用都可以方便的使用它.SQLite作为一个嵌入式的数据库引擎,专门适用于资源有限的设备上适量数据存 ...
随机推荐
- Kafka 温故(四):Kafka的安装
Step 1: 下载Kafka > tar -xzf kafka_2.9.2-0.8.1.1.tgz> cd kafka_2.9.2-0.8.1.1 Step 2: 启动服务Kafka用到 ...
- [转载]AngularJS学习笔记
http://www.zouyesheng.com/angular.html 关于AngularJS 关于本文档 开始的例子 依赖注入 作用域 数据绑定与模板 6.1. 数据->模板 6.2. ...
- [BZOJ 4350]括号序列再战猪猪侠 题解(区间DP)
[BZOJ 4350]括号序列再战猪猪侠 Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个 ...
- 正则匹配URL地址
import re u = "http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]) ...
- Python 入门基础5 --元组、字典、集合
今日目录: 一.元组 二.字典 三.集合 四.后期添加内容 一.元组 1.定义 t1 = () # 参数为for可以循环的对象(可迭代对象) 思考: 如何定义一个只有一个值的元组? ("li ...
- 什么是BS,BS和CS的区别有哪些
BS和CS的区别以及优缺点 C/S又称Client/Server或客户/服务器模式.服务器通常采用高性能的PC.工作站或小型机,并采用大型数据库系统,如Oracle.Sybase.Informix或 ...
- Identical Binary Tree
Check if two binary trees are identical. Identical means the two binary trees have the same structur ...
- camera驱动框架分析(上)
前言 camera驱动框架涉及到的知识点比较多,特别是camera本身的接口就有很多,有些是直接连接到soc的camif口上的,有些是通过usb接口导出的,如usb camera.我这里主要讨论前者, ...
- 初始ADO.NET数据操作
以下介绍直接来源与百度百科,介绍十分全面和详细,作为小菜的我们没有理由不看完这些枯燥的介绍原有: ADO.NET的名称起源于ADO(ActiveX Data Objects),是一个COM组件库,用于 ...
- php毫秒时间戳
2014年5月23日 17:46:04 凡事还是得靠自己呀,网上太多坑 如果你的机器是 32位 的可以看这个: list($usec, $sec) = explode(' ', microtime() ...