1.android的项目目录结构
Android学习首先要大致了解项目目录,有些看不懂的就先记下,等之后遇到了再回头来看,印象肯定会更加深刻。
src Java源码
gen 自动生成的java文件
R.java (Resource)静态内部类
assets 资产 包括:音频视频 比较大的 不需要修改资源
不会再R.java中自动生成,必须通过路径来访问
bin 二进制文件(apk)
res Resource 资源
drawable_hdpi 高分辨率的图片
drawable_ldpi 低分辨率的图片
drawable_mdpi 中分辨率的图片
drawable_xhdpi 超高清辨率的图片
drawable_xxhdpi 特高清分辨率的图片
layout 布局
xml的文件,告诉Activity显示什么样的内容
menu 菜单 xml的文件
values 数据文件 没有对应的静态的内部类
dimens.xml 尺寸
strings.xml 常量值
styles.xml 样式
AndroidMainfest.xml 项目清单文件
package="com.qf.day01_helloworld" 包名,应用程序的唯一标示
android:versionCode="1" 版本号
application:
android:icon="@drawable/ic_launcher" 图标
android:label="@string/app_name" 标签名称
android:theme="@style/AppTheme" 样式
2.DVM(Dalvik)和JVM的区别:
(1)Dalvik基于寄存器 jvm基于栈 基于寄存器的虚拟虚拟机对于更大的程序来说,
在他们编译的时候,花费的时间更短
(2)Dalvik执行.dex格式的字节码
JVM执行.class格式的字节码
(3).class的文件存在很多重要信息,.dex工具会去除重复的信息
3.android五大布局
(1)线性布局 LinearLayout
android:layout_width="match_parent" 设置布局的宽度(通用属性)
android:layout_height="match_parent" 设置布局的高度(通用属性)
属性值:match_parent 填充父容器的宽度和高度
fill_parent 填充父容器的宽度和高度(2.2之前的版本)
wrap_content 包裹内容的宽度和高度
android:orientation="" 设置线性布局的排列方式
属性值: vertical 垂直排列
horizontal 水平排列(默认的)
android:gravity="center" 父容器内所有子控件的位置
android:gravity="bottom|right" 多个属性直接必须“|”分割
权重 android:layout_weight="1" 子控件在父容器剩余空间中所占的比例
属性值越大,所占的比例就越大
(2)相对布局 RelativeLayout
指子控件与父容器、控件与控件 相对位置的来进行布局
<1>,子控件相对于父容器的位置
居中对齐:
android:layout_centerHorizontal = "true" 子控件相对于父容器水平居中android:layout_centerVertical="true" 子控件相对于父容器垂直居中
android:layout_centerInParent = "true" 子控件相对于父容器完全居中
位置对齐:
android:layout_alignParentRight="true" 子控件相对于父容器的右边对齐android:layout_alignParentLeft="true" 子控件相对于父容器的左边对齐android:layout_alignParentBottom="true" 子控件相对于父容器的底部对齐android:layout_alignParentTop="true" 子控件相对于父容器的顶部对齐
<2>,子控件与兄弟控件之间的位置
放置的位置:
android:layout_toRightOf="@id/button_id" 子控件显示在ID为button_id的右侧
android:layout_toLeftOf="@id/button_id" 子控件显示在ID为button_id的左侧
android:layout_below="@id/button_id" 子控件显示在ID为button_id的下方
android:layout_above="@id/button_id" 子控件显示在ID为button_id的上方
对齐的方式:
android:layout_alignRight="@id/button_id" 子控件与ID为button_id的右边对齐
android:layout_alignLeft="@id/button_id" 子控件与ID为button_id的左边对齐
android:layout_alignBottom="@id/button_id" 子控件与ID为button_id的底部对齐
android:layout_alignTop = "@id/button_id" 子控件与ID为button_id的顶部对齐
android:layout_alignBaseLine = "@id/button_id" 子控件与ID为button_id的基准线对齐
(3),帧布局
(4),表格布局
(5),绝对布局 这三个布局很少被用到,这里不做过多讲解,了解即可。用上面的线性布局和相对布局几乎可以达到大部分效果。另外有些老代码可能会用到帧布局,有兴趣的小伙伴可以自行找资料学习。
(6),网格布局GridLayout (4.0后出现的)
1,设置组件的排列方式
android:orientation=""
属性值: vertical 垂直
horizontal 水平
2,设置布局为几行几列
android:rowCount="4" 设置网格布局有4行
android:columnCount="4" 设置网格布局有4列
3,设置控件位于几行几列
注意:都是从0开始算的
android:layout_row = "1" 设置控件位于第二行显示
android:layout_column = "2" 设置控件位于第三列显示
4,设置某个组件横跨几行几列
android:layout_rowSpan="2" 行的跨度
android:layout_columnSpan = "3" 列的跨度
android:layout_gravity ="fill" 填充你所跨的整行或整列
4.TextView extends View
android:textStyle="bold" 文字的样式(可以叠加使用,必须用"|"分割)
属性值: bold 加粗
Italic 斜体
android:singleLine = "true" 是否单行显示
android:ellipSize = "" 用省略号显示超出文本宽度的内容
属性值: none 无
start 开始位置省略
middle 中间
end 结束位置
marquee 滚动显示
跑马灯:
step1: android:ellipSize = "marquee"
step2: 设置焦点
android:focusable = "true"
android:focusableInTouchMode = "true"
step3: android:marqueeRepeatLimit = "marquee_forever"循环滚动
step4: android:singleLine = "true"
android:autoLink = " " 自动连接(根据内容类型的不同,点击打开相应的应用程序
属性值: none 无
web 网址
email 邮箱
Phone 电话号码
map 地理位置
all 包括以上所有
5.EditText extends TextView
android:hint = "提示信息"
android:textColorHint = " " 提示信息的颜色
android:inputType = "" 允许用户输入的内容
属性值: text 默认
number 只能输入数字
textpassword 文本密码
date 日期
Phone 电话号码
android:layout_alignBaseline = ""在一条基准线上
<requestFocus/>请求焦点
6.Button extends TextView
android:drawableRight 图片放在文本的右侧
android:drawableLeft 图片放在文本的左侧
android:drawableBottom 图片放在文本的下方
android:drawableTop 图片放在文本的上方
ImageButton
android:src="@drawable/ic_launcher" 图片路径
android:background="@null" 去除灰色背景
7.按钮监听器
监听三部曲:
1,定义控件并且初始化
2,定义监听器(得到监听器对象)
3,为控件设置监听器
监听器实现的方式:4种
第一种方式: 匿名内部类
第二种方式: 成员内部类的方式
第三中方式: 让当前的类 implements OnClickListener 接口,重写OnClick(),为控件设置监听器
第四种方式: Button属性
1,标签中定义属性:android:onClick ="onClickButton"
2, 在代码中写监听方法:
2.1 必须是public
2.2 返回值必须是void
2.3 方法名称必须和xml中onClick属性的属性值一致
2.4 必须有一个View类型的参数
8.ImageView extends View
android:scaleType = ""图片显示的方式
属性值: matrix: 不缩放,从左上角开始截取和ImageView红箭,(可以在代码中设置Matrix对象)
(常用)fitXY: 不按比例缩放图片,目标是把图片塞满整个ImageView
fitStart: 按比例缩放图片的大小,置于顶部显示,完全显示图片
(常用)fitCenter: 按比例缩放图片的大小,居中显示,完全显示图片(默认)
fitEnd: 按比例缩放图片的大小,置于底部显示,完全显示图片
center: 保持图片原来的size,居中显示,超出部分不显示
centerCrop 按比例扩大图片的size,居中显示,小边填满容器,大边超出部分不显示
centerInside按比例缩小图片的size,居中显示,超出部分不显示
代码中设置图片资源:
imageView.setImageResource(R.drawabe.xxx);
9.CheckBox 多选框 extends CompoundButton --->Button
android:checked = "true" 设置为被选中状态
java代码中的方法
checkBox.isChecked() 获取多选框的状态
checkBox.setChecked(true) 设置多选框被选中
状态改变监听器 OnCheckedChangeListener (需要导入 android.widget.CompoundButton.OnCheckedChangeListener包,注意要与RadioButton区分)
10.RadioButton 单选按钮 extends CompoundButton --->Button
(1)由于是单选按钮,所以使用组来管理(RadioGroup)
(2)特点:多个取其一(RadioButton 必须制定id)
(3)属性
RadioGroup:
android:orientation = ""排列方式(默认为垂直排列)
android:checked = "" 按钮是否被点亮
(4)radioGroup.isChecked();判断是否被选中,默认为true
(5)从radioGroup组上获取其中的radioButton,判断是否被选中
((RadioButton)radioGroup.getChildAt(index)).ischecked();
(6)监听事件:OnCheckedChangeListener
只能给RadioGroup设置OncheckedChangeListener
需要导入android.widget.RadioGroup.OncheckedChangeListener包
与checkBox区分
11.Spinner 下拉菜单
android:spinnerMode="" Spinner的展示方式
属性值:drodown 下拉方式
dialog 对话框
android:prompt="" 在对话框方式下设置标题(标题内容只能应用,不能写死)
android:entries = "@array/citys" 下拉菜单的内容 数据源的填充:
<1>数据源必须是String[]或List(纯文本)
<2>通过属性填充:android:entries=""
<3>在代码中使用ArrayAdapter数组适配器填充数据
12.ArrayAdapter数组适配器:
(1)三个参数的(数据源为数组)
this 上下文对象
resource item的布局资源
Object 数据源----数组
ArrayAdapteradapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item,data);
(2)三个参数的(数据源为集合)
this 上下文对象
resource item的布局资源
Object 数据源----List集合
ArrayAdapteradapter = new ArrayAdapter(this,android.R.layout.simple_spinner_item,data); (3)四个参数
this 上下文对象
resource item的布局资源
textViewResourceId item布局资源中要用的TextView的ID
当item的布局资源中只有一个TextView时,此参数可省略
Object 数据源----List集合或者
ArrayAdapteradapter = new ArrayAdapter(this,R.layout.xxx,R.id.textview,data);
(4)API推荐
this 上下文对象
textArrayResId 字符串数组的ID(数组写在Xml文件中)
textViewResId Item样式的资源文件
ArrayAdapteradapter = new ArrayAdapter(this,R.array.xxx,R.id.textview);
13.Spinner监听器 OnItemSelectedListener 用来监听用户点击下来列表的事件
spinner.setOnItemSelectedListener(new OnItemSelectedListener(){
/**
*AdapterView parent 整个下拉菜单的视图(即spinner对象)
*View view 每个Item视图的对象
*int position 当前点击的条目下标
*long Id 当前点击条目的Id
*/
public void onItemSelected(AdapterView parent,View view,int position,long id){
//从parent中获取内容
String str2 = parent.getItemAtPosition(position).toString();
//从adapter中获取内容
String str3 = adapter.getItem(position);
//从spinner中获取内容
String str4 = spinner01.getItemAtPosition(position).toString();
}
};
14.SimpleAdapter 适配器(可实现图文混排:图片只能是本地的)
(1)只用一个构造方法
(2)构造方法介绍:
/** *context 上下文对象
*data 数据源 数据源的格式为:List>
*resource Item的布局资源
*from String[]数据源中的key
*to int[] 布局资源的id
*/
SimpleAdapter adapter = new SimpleAdapter(this,
data,
R.layout.item_spinner,
new String[]{"icon","city"},
new int[]{R.id.icon,R.id.city});
15.AutoCompleteTextView 自动提醒的编辑框 extends EditText
(1)
android:completetionHint 设置下拉菜单中的提示标题
android:completionThreshold 设置用户至少输入多少个字符才会显示提醒
android:dropDownhorizontalOffset 下拉菜单于文本框之间的水平偏移。默认与文本框左对齐
android:dropDownheight 下拉菜单的高度
android:dropDownWidth 下拉菜单的宽度
android:dropDownVerticalOffset 垂直偏移量
(2)设置OnItemClickListener用来监听用户点击下来列表的事件
spinner.setOnItemClickListener(new OnItemSelectedListener(){
/**
*AdapterView parent 整个下拉菜单的视图(即AutoCompleteTextView对象)
*View view 点击的Item视图的对象
*int position 当前点击的条目下标
*long Id 当前点击条目的Id
*/
public void onItemClick(AdapterView parent,View view,int position,long id){
//从parent中获取内容
String str2 = parent.getItemAtPosition(position).toString();
//从adapter中获取内容
String str3 = adapter.getItem(position);
//从spinner中获取内容
String str4 = spinner01.getItemAtPosition(position).toString();
}
};
(3)添加TextChangedListener监听器 用来监听输入框文本的变化
autoView.addTextChangedListener(new TextWatcher(){
/**
*文本正在变化
*charSequence s 改变之前的文本
*start: 改变之前文本的下标
*before 改变之前文本的数量
*count 改变的文本个数
*/
public void onTextChanged(CharSequence s,int start,int before,int count){
}
/**
*文本改变之前触发次方法
*s:变化之前的文本
*start 变化之前文本的下标
*count 变化之前文本的个数
*after 变化之后文本的个数
*/
public void beforeTextChanged(Charsequence s,int start,int count,int after){
}
/**
*文本变化之后触发次方法
*s:s.toString() 变化之后的文本
*/
public void afterTextChanged(Editable s){
}
};
16.两个Activity之间传值(4种)
(1)通过意图Intent传值
<1>A: Intent intent = new Intent();
intent.putExtra("key", value);
putExtra();该方法的value支持所有基本数据类型和String对象 以及他们所对应的数组类 型除此之外还支持实现Serializable、Parcelable接口的类对象(也就是说,要想 在Activit之间传对象,则该对象的类需要实现Serializable、Parcelable接口)
intent.setClass(this,xxxActivity.class);
startActivity(intent);
B: Intent intent = getIntent();
intent.getXXXExtra(key); 拿到对应的值
<2>类似于上面
A: Bundle bundle = new Bundle();
bundle.putxxx("key",value); 与上面intent.putExtra("key",value)用法一样
intent.putExtras(bundle);
B: Bundle getIntent().getBundleExtra() 拿到bundle对象
bundle.getxxx("key"); 拿到值
(2)静态成员传值(不建议使用)
在A中声明一个公共的静态成员,在合适的地方存入数据
在B类中直接访问A类的静态成员,读取相应的数据
(3)全局变量传值(android建议使用)(★)
----Application组件中(一般存放适用于全局的数据,比如用户账户)
<1>创建Application的子类,并声明全局的变量(类成员)
<2>在AndroidManiFest.xml(清单文件)中标签中,
通过android:name="包名+类名"属性将创建的Application子类引入项目
<3>在合适的位置存入数据
<4>在需要用的地方读取相应的数据
(4)回传数据
A:startActivityForResult(Intent,110)启动界面
B:setResult(RESULT_OK,data);设置回传的数据(然后直接finish()关闭当前页面) data为Intent类型,data中不需要setClass()
A:重写onActivityResult(int requesCode,int resultCode,Intent data)方法
该方法传回数据时系统调用
参数:requesCode---请求码对应上面的110
resultCode----回复码对应上面的RESULT_OK
data ------传回的数据
17.Activity的生命周期(7个)从创建到消亡
onCreate() 第一次创建时执行 初始化Activity
onStratet() 显示窗口时执行 显示Activity
onResume() 获取焦点是执行 与用户交互
onPause() 失去焦点时执行 停止与用户交互
onStop() 关闭窗口时执行 关闭Activity
onRestart() 重新显示窗口 再次显示Activity
onDestroy() 销毁时执行 销毁Activity
(1)在A中启动B时执行声明周期方法的顺序
A:onPause()---B:onCreate()---B:onStart()----B:onResume()---A:onStop()
从B中返回A
B:onPause()---A:onRestart----A:onStart()---A:onResume()---B:onStop()---B:onDestroy()
(2)在A中启动B(以对话框形式显示的Activity)
A:onParse()---B:onCreate()---B:onStart()---B:onResume()
从B中返回A
B:onParse()---A:onResume()----B:onStop()---:onDastroy()
18.现场保护(保持状态)
应对横竖屏切换时重新创建Activity,因此需要保持业务数据来保护现场
//重写onSaveInstanceState()方法来存入数据
protected void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(ontState);
outState.putInt("index",index);
}
//在onCreate() 方法中获取保护的数据
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedinstanceState){
index = savedInstanceState.getInt("index");
}
}