Android: 布局;xml生成与解析;测试
**1.android布局
2.Android中发送短信
3.android中开发和调试的相关工具
4.测试相关概念和android测试工具
5.android中点击事件四种处理方法
6.xml介绍和用法以及xml生成和解析**
**具体实例包括:
布局;
短讯发送实例;
junit单元测试;
事件响应的方法;
xml的生成和解析**
android:gravity=”center” 控件内容对齐
android:layout_gravity=”center”控件本身在父窗体中的对齐方法
布局
帧布局
1.帧布局
控件是一层一层的叠;
1.1案例 view.setVisibility (view.INVISIBLE);
暂停按钮点击事件;view参数就是被点击的控件对象
短讯发送
1.权限:
<uses-permission android:name="android.permission.SEND_SMS"/>
2.代码只有两三行
//发送短信
SmsManager smsManager = SmsManager.getDefault();
//发送短信
smsManager.sendTextMessage(
"5556",//destinationAddress, 目标号码
null,//scAddress, 哪个号码发送
"hello",//text,短信内容
null,//sentIntent, 发送报告
null);//deliveryIntent);送达报告
开发环境和调试工具## (DDMS和ADT)
R文件找不到的问题如何解决?问题出现res目录有资源名或者属性名有错误,这就会造成R文件无法自动生成
DDMS: Dalvik Debug Monitor Service android调试的工具
/data/data/应用程序包名命名的文件夹是私有目录
测试相关概念
1.按照是否知道源码
1.黑盒测试:从用户的角度来测试程序的功能是否符合要求;
2.白盒测试:知道源码;结构测试,测试程序的代码是否正确是否执行过一次;(技术含量更高一些)
测试的粒度划分
1.单元测试:对方法测试,junit test
2.集成测试:几个模块的测试,Integration test
3.系统测试:对整个系统进行测试 System test
测试的力度
1.压力测试:pressure test;一般针对服务器的测试
2冒烟测试:压力测试到了极端的程序;极端压力测试;
android中的压力测试工具 mokey
**1.adb shell 进入android底层linux 命令行
2.# monkey 200(测试次数) 让monkey产生200次用户操作;
3. #monkey -P 应用包名200,只测试指定应用;**
android 中junit单元测试
**1.编写业务代码
2.编写测试代码,新建测试类需要继承AndroidTestCase,测试的方法需要抛出异常
此处是代码
//测试代码
public class TestCalcService extends AndroidTestCase {
//测试add方法 注意抛出异常
public void testAdd() throws Exception {
CalcService calcService = new CalcService();
int result = calcService.add(3, 5);
//利用断言测试
assertEquals(8, result);
}
}
3.在清单文件中配置instrumentation和users-library;
此处是代码
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.itheima.junit" >
</instrumentation>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<uses-library android:name="android.test.runner"/>
4.选中要被测试的方法 testAdd,运行测试,查看结果;**
android中点击事件的写法
android中时间处理机制.基于监听的事件处理机制
步骤:
*1.获得监听对象(事件源),被监听对象;
*2.实现监听器类,实现接口,实现xxxListener接口;
*3.利用监听对象的setxxxListener方法设置监听器;
写法1
1.在xml文件中添加onClick属性指定处理方法
<Button
android:onClick="click1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="button1" />
//直接在xml布局中指定点击事件处理方法
public void click1(View v) {
Toast.makeText(this, "button1被翻牌子了", Toast.LENGTH_SHORT).show();
}
写法2
2.基于监听的点击事件处理步骤;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 写法2 基于监听事件处理,内部类实现接口
// 1.找监听对象
Button btn2 = (Button) findViewById(R.id.btn2);
// 2.实现监听器,XxxListener OnClickListener
MyOnClickListener listener = new MyOnClickListener();
// 3.利用监听对象的setXxxListener方法设置监听器
btn2.setOnClickListener(listener);
}
class MyOnClickListener implements OnClickListener {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "btn2被点击了", Toast.LENGTH_SHORT)
.show();
}
}
}
写法3
3.使用匿名内部类实现xxxListener;
// 写法3 基于监听事件处理,匿名内部类实现接口
// 1.找监听对象
Button btn3 = (Button) findViewById(R.id.btn3);
// 2.实现监听器,XxxListener OnClickListener
// 3.利用监听对象的setXxxListener方法设置监听器
btn3.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "btn3被点击了", Toast.LENGTH_SHORT).show();
}
});
写法4
4.让当前的mainactivity来实现xxxListenner接口;
public class MainActivity extends Activity implements OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 写法2 基于监听事件处理,实现接口
// 1.找监听对象
Button btn1 = (Button) findViewById(R.id.btn1);
Button btn2 = (Button) findViewById(R.id.btn2);
// 3.利用监听对象的setXxxListener方法设置监听器
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
//根据id判断是哪个btn被点击了
switch (v.getId()) {
case R.id.btn1:
Toast.makeText(this, "btn1被点击了", 0).show();
break;
case R.id.btn2:
Toast.makeText(this, "btn2被点击了", 0).show();
break;
default:
break;
}
}
}
在eclipse中搜索
**ctrl + h 可以在工程中搜索;
ctrl + k 可以在文件中查找,向下;
Ctrl + shift + k 向下查找;**
xml介绍
**XML 指可扩展标记语言 Extensible Markup Language ;
xml用于传输和保存语言,html用于显示数据;
xml可以用于保存软件的配置,服务器返回格式化的数据;**
xml语法要点
**XML 的开头要有文档声明,
XML 文档必须要有根元素,并且只能有一个根源素;
XML 必须有关闭标签;
XML 标签对大小写敏感
XML 元素必须被正确的嵌套
XML 属性必须加引号 例如 version = “2.0”
XML 特殊字符必须转义
XML 中的空格,回车换行解析式会保留**
xml的约束
约定xml的文档中可以出现的元素和顺序,属性;
android中SharedPreferences用法
写入xml
//将状态写入xml保存
//1.获得sharedPreferences,指定要操作文件,和私有模式
SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE);
//2.获得编辑器
Editor editor = sp.edit();
//3.以key-value形式写入数据
editor.putBoolean("isChecked", isChecked);
//4.提交修改
editor.commit();
从xml中读出设置
//读出xml中配置,回显到checkBox
//1.获得SharedPreferences对象,指定文件及模式
SharedPreferences sp = getSharedPreferences("config", 0);
//2.读数据
boolean isChecked = sp.getBoolean("isChecked", false);
cb.setChecked(isChecked);
xml的生成
用的是序列化器
### xml生成 ###
try {
//1.利用XmlSerializer生成xml文件
XmlSerializer xmlSerializer = Xml.newSerializer();
File file = new File("/data/data/com.itheima.xmlgen/config.xml");
FileOutputStream fos = new FileOutputStream(file);
//2.指定生成什么文件
xmlSerializer.setOutput(fos, "utf-8");
//3.写文档开头
xmlSerializer.startDocument("utf-8", true);//<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
//5.写开标标签
xmlSerializer.startTag(null, "map");//<map>
xmlSerializer.startTag(null, "boolean");//<boolean>
//写属性 name="isChecked"
xmlSerializer.attribute(null, "name", "isChecked");
//写属性 value="true"
xmlSerializer.attribute(null, "value", "true");
xmlSerializer.endTag(null, "boolean");//</boolean>
//6.结束标签</map>
xmlSerializer.endTag(null, "map");
//4.写文档结束
xmlSerializer.endDocument();
fos.close();
xml的解析
pull解析原理:基于 事件的解析方式;开始和结束标签,标签包围的文本都看做事件;
核心的方法1:parser.next();指针从前往后移动
核心的方法2:getEventType();获得当前指针指向的事件类型;
取标签包围的文本;张三
指针指向取后面的text文本”张三”;
name的开始标签 后面必然后面跟着文本;
pull解析过程
// person.xml要放在assets资产目录下
try {
// 1.获得pull解析器
XmlPullParser parser = Xml.newPullParser();
// 利用上下文获得资产目录管理器并打开文件
InputStream inputStream = getAssets().open("person.xml");
// 2.指定解析目录
parser.setInput(inputStream, "utf-8")
// 获得初始指针指向事件类型
int eventType = parser.getEventType();
System.out.println(getEventName(eventType));
//循环移动指针,直到文档结束
while (eventType != XmlPullParser.END_DOCUMENT) {
//指针向下一个事件移动,返回下一个事件类型
eventType = parser.next();
System.out.println(getEventName(eventType));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}