主要内容:布局,测试,文件读写,xml文件序列化与pull解析
布局:(注意单元的概念)
- 相对布局(RelativeLayout):就是各个View的相对位置,比较常用
- 线性布局(LinearLayout):线性布局包括水平(horizontal)和竖直("vertical")两种,很方便的布局,用处很广。
- 表格布局(tableLayout):每一行都用一个tableRow圈起来
- 绝对布局(AbsoluteLayout):每一个View指定具体的位置,一般不用。
- 帧布局(FrameLayout):每一个单元占据单独的一层,同时显示在界面上,可以设置每一帧的显示与否;
- 网格布局:还没学;
测试的概念:
logcat(日志):安卓系统的控制台,可以通过他了解到系统的运行信息。
可以自己在代码中插入日志,如插入Log.i(String tag,Stirng msg);
- verbose 提示
- debug 调试
- info 信息
- warn 警告
- error 错误
白盒测试:
知道程序源代码.
根据测试的粒度分为不同的类型
单元测试 unit test
功能测试 function test
集成测试 intergation test
冒烟测试 smoke test
压力测试 pressure test
junit测试框架:第一,需要创建一个类继承androidTestcase,实现测试。第二,需要在Androidmainfest.xml文件中添加以下语句
在mainfest中添加
1 <instrumentation 2 android:name="android.test.InstrumentationTestRunner" 3 android:targetPackage="com.first.junit" />
其中第二行是目标包名;
在application中添加
<uses-library android:name="android.test.runner" />
最后选择程序运行代码,如果logcat出现绿条说明运行正常。
文件的存取:
保存数据到rom文件中
1 public static void saveToRom(Context context, String name , String password) throws Exception{ 2 //File file = new File("/data/data/com.itheima.login/files/pwd.txt"); 3 File file = new File(context.getFilesDir(),"pwd.txt"); 4 FileOutputStream fos = new FileOutputStream(file); 5 String txt = name+":"+password; 6 fos.write(txt.getBytes()); 7 fos.flush(); 8 fos.close(); 9 }
Context:上下文,提供程序所需要的环境。
context.getFilesDir():Returns the absolute path to the directory on the filesystem where files created with openFileOutput(String, int)
are stored.一般是在data/data/包名/files/
Environment.getExternalStorageDirectory():获取sd卡所在目录
应用程序保存到shareperference
1 /** 2 * 保存应用程序数据 到sharedpreference 3 * @param context 上下文 4 * @param name 姓名 5 * @param password 密码 6 */ 7 public static void saveTOSP (Context context, String name, String password){ 8 //获取系统的一个sharedpreference文件 名字叫 sp 9 SharedPreferences sp = context.getSharedPreferences("sp", Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE); 10 //创建一个编辑器 可以编辑 sp 11 Editor editor = sp.edit(); 12 editor.putString("name", name); 13 editor.putString("password", password); 14 editor.putBoolean("boolean", false); 15 editor.putInt("int", 8888); 16 editor.putFloat("float",3.14159f); 17 //注意:调用 commit 提交 数据到文件. 18 editor.commit(); 19 //editor.clear(); 20 } 21 22 /** 23 * 获取系统sharepreference里面的数据 24 * @param context 25 * @return 26 */ 27 public static Map<String,String> readFromSP(Context context){ 28 Map<String,String> map = new HashMap<String, String>(); 29 SharedPreferences sp = context.getSharedPreferences("sp", Context.MODE_PRIVATE); 30 String name = sp.getString("name", "defaultname"); 31 String password = sp.getString("password", "password"); 32 map.put("name", name); 33 map.put("password", password); 34 return map; 35 } 36
文件的访问权限
MODE_PRIVATE,
MODE_APPEND,
MODE_WORLD_READABLE,
MODE_WORLD_WRITEABLE;
1 package com.itheima.testmode; 2 3 import java.io.File; 4 import java.io.FileNotFoundException; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 8 import android.app.Activity; 9 import android.os.Bundle; 10 import android.os.Environment; 11 import android.view.View; 12 import android.widget.RadioGroup; 13 14 public class MainActivity extends Activity { 15 private RadioGroup rg; 16 17 @Override 18 protected void onCreate(Bundle savedInstanceState) { 19 super.onCreate(savedInstanceState); 20 setContentView(R.layout.activity_main); 21 rg = (RadioGroup) findViewById(R.id.rg); 22 } 23 24 public void generateFile(View view) { 25 switch (rg.getCheckedRadioButtonId()) { 26 case R.id.rb_private: 27 savePrivate(); 28 break; 29 case R.id.rb_readable: 30 saveReadble(); 31 break; 32 case R.id.rb_writeable: 33 savewriteable(); 34 break; 35 case R.id.rb_all: 36 saveAll(); 37 break; 38 case R.id.rb_sd: 39 saveSD(); 40 break; 41 42 case R.id.rb_append: 43 saveAppend(); 44 break; 45 } 46 47 } 48 49 private void saveAppend() { 50 try { 51 FileOutputStream fos = this.openFileOutput("append.txt", 52 MODE_APPEND); 53 fos.write("我是追加模式生成的文件".getBytes()); 54 fos.close(); 55 } catch (Exception e) { 56 e.printStackTrace(); 57 } 58 59 } 60 61 private void saveSD() { 62 try { 63 File file = new File(Environment.getExternalStorageDirectory(), 64 "sd.txt"); 65 FileOutputStream fos = new FileOutputStream(file); 66 fos.write("我是sd卡的文件".getBytes()); 67 fos.close(); 68 } catch (FileNotFoundException e) { 69 // TODO Auto-generated catch block 70 e.printStackTrace(); 71 } catch (IOException e) { 72 // TODO Auto-generated catch block 73 e.printStackTrace(); 74 } 75 76 } 77 78 private void saveAll() { 79 try { 80 FileOutputStream fos = this.openFileOutput("all.txt", 81 MODE_WORLD_WRITEABLE | MODE_WORLD_READABLE); 82 fos.write("我是全局可读可写文件".getBytes()); 83 fos.close(); 84 } catch (Exception e) { 85 e.printStackTrace(); 86 } 87 88 } 89 90 private void savewriteable() { 91 try { 92 FileOutputStream fos = this.openFileOutput("writeable.txt", 93 MODE_WORLD_WRITEABLE); 94 fos.write("我是全局可写文件".getBytes()); 95 fos.close(); 96 } catch (Exception e) { 97 e.printStackTrace(); 98 } 99 100 } 101 102 private void saveReadble() { 103 try { 104 FileOutputStream fos = this.openFileOutput("readable.txt", 105 MODE_WORLD_READABLE); 106 fos.write("我是全局可读的文件".getBytes()); 107 fos.close(); 108 } catch (Exception e) { 109 e.printStackTrace(); 110 } 111 112 } 113 114 private void savePrivate() { 115 // File file = new File(this.getFilesDir(),"1.txt"); 116 // FileOutputStream 117 try { 118 FileOutputStream fos = this.openFileOutput("private.txt", 119 MODE_PRIVATE); 120 fos.write("我是私有的文件".getBytes()); 121 fos.close(); 122 } catch (Exception e) { 123 e.printStackTrace(); 124 } 125 126 } 127 public void writeappend(View view){ 128 129 try { 130 FileOutputStream fos = this.openFileOutput("append.txt", 131 MODE_APPEND); 132 fos.write(".... 我是新添加到的内容".getBytes()); 133 fos.close(); 134 } catch (Exception e) { 135 e.printStackTrace(); 136 } 137 138 } 139 140 public void writecache(View view){ 141 try { 142 File file = new File(this.getCacheDir(),"temp.txt"); 143 FileOutputStream fos = new FileOutputStream(file); 144 fos.write("我是缓存".getBytes()); 145 fos.close(); 146 } catch (FileNotFoundException e) { 147 // TODO Auto-generated catch block 148 e.printStackTrace(); 149 } catch (IOException e) { 150 // TODO Auto-generated catch block 151 e.printStackTrace(); 152 } 153 } 154 }
xml序列化:
1 //1.获取到xml的序列号器 2 XmlSerializer serializer = Xml.newSerializer(); 3 //2.序列化器的初始化 4 serializer.setOutput(fos, "utf-8"); //文件的编码方式 utf-8 5 //3.创建xml文件 6 serializer.startDocument("utf-8", true);
pull解析:
1 public static List<Weather> getWeather(InputStream is) throws Exception { 2 // 解析 天气的xml文件. 3 // 1.获取到一个xml文件的解析器. 4 XmlPullParser parser = Xml.newPullParser(); 5 // 2.初始化解析器. 6 parser.setInput(is, "utf-8"); 7 // 3.解析xml文件. 8 // 得到当前解析条目的节点类型. 9 int eventType = parser.getEventType(); // 第一次被调用的时候 定位在xml开头 10 List<Weather> weatherInfos = null; 11 Weather weatherInfo = null; 12 while (eventType != XmlPullParser.END_DOCUMENT) {// 需要 不停的让 解析器解析下一个节点 13 switch (eventType) { 14 case XmlPullParser.START_TAG: 15 if ("weather".equals(parser.getName())) { 16 // 发现开始节点 为weather 创建集合 17 weatherInfos = new ArrayList<Weather>(); 18 } else if ("day".equals(parser.getName())) { 19 // 发现一个新的日期 对应的天气 20 weatherInfo = new Weather(); 21 String id = parser.getAttributeValue(0); 22 weatherInfo.setId(Integer.parseInt(id)); 23 } else if ("wendu".equals(parser.getName())) { 24 String wendu = parser.nextText(); 25 weatherInfo.setWendu(Integer.parseInt(wendu)); 26 } else if ("wind".equals(parser.getName())) { 27 String wind = parser.nextText(); 28 weatherInfo.setWind(Integer.parseInt(wind)); 29 } else if ("type".equals(parser.getName())) { 30 String type = parser.nextText(); 31 weatherInfo.setType(type); 32 } 33 34 break; 35 36 case XmlPullParser.END_TAG: 37 if ("day".equals(parser.getName())) { 38 weatherInfos.add(weatherInfo); 39 } 40 break; 41 } 42 eventType = parser.next();// 控制解析器 解析下一个节点 43 } 44 is.close(); 45 return weatherInfos; 46 47 } 48 }