XML

activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:columnCount="2" android:rowCount="9" tools:context="com.xiesir.example17xml.MainActivity"> <TextView android:layout_columnSpan="2" android:layout_gravity="fill" android:text="好友信息" android:textAlignment="center" android:textSize="28sp" /> <TextView android:text="姓名" /> <EditText android:id="@+id/etName" android:layout_gravity="right" android:gravity="right" android:minWidth="180dp" android:hint="请输入姓名" /> <TextView android:text="性别" /> <Switch android:id="@+id/sSex" android:layout_gravity="center_horizontal" android:minWidth="120dp" android:showText="true" android:textOff="男" android:textOn="女" /> <TextView android:layout_gravity="center_vertical" android:text="电话" /> <EditText android:id="@+id/etPhone" android:layout_gravity="end" android:gravity="right" android:minWidth="180dp" android:inputType="phone" android:hint="请输入电话号码" /> <TextView android:text="邮箱" /> <EditText android:id="@+id/etEmail" android:layout_gravity="end" android:gravity="right" android:minWidth="180dp" android:inputType="textEmailAddress" android:hint="请输入电子邮箱" /> <TextView android:text="主页" /> <EditText android:id="@+id/etHomepage" android:layout_gravity="end" android:gravity="right" android:minWidth="180dp" android:inputType="textUri" android:hint="请输入个人主页" /> <TextView android:layout_rowSpan="2" android:layout_gravity="center_vertical" android:text="备注" /> <EditText android:id="@+id/etNote" android:layout_rowSpan="2" android:layout_gravity="end" android:gravity="center_vertical|right" android:minWidth="180dp" android:minLines="3" android:hint="请输入其它信息" /> <RelativeLayout android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_gravity="center_horizontal" android:layout_columnSpan="2" android:gravity="fill" > <Button android:id="@+id/btnSave" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="保存" android:onClick="saveClick" /> <Button android:id="@+id/btnPrevious" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/btnSave" android:layout_gravity="center_horizontal" android:text="上一位(Un)" android:onClick="click" /> <Button android:id="@+id/btnNext" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/btnPrevious" android:layout_gravity="center_horizontal" android:text="下一位(Un)" android:onClick="click" /> <Button android:id="@+id/btnRead" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/btnNext" android:text="读取" android:onClick="readClick" /> </RelativeLayout> </GridLayout>
PersonInfo.java:
package com.xiesir.example17xml; /** * Created by xiegly on 2016/5/26. */ public class PersonInfo { String name; boolean sex; String phone; String email; String homepage; String note; public PersonInfo() { } public PersonInfo(String name, boolean sex, String phone, String email, String homepage, String note) { this.name = name; this.sex = sex; this.phone = phone; this.email = email; this.homepage = homepage; this.note = note; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isSex() { return sex; } public void setSex(boolean sex) { this.sex = sex; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getHomepage() { return homepage; } public void setHomepage(String homepage) { this.homepage = homepage; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } @Override public String toString() { return "PersonInfo{" + "name='" + name + '\'' + ", sex=" + sex + ", phone='" + phone + '\'' + ", email='" + email + '\'' + ", homepage='" + homepage + '\'' + ", note='" + note + '\'' + '}'; } }
MainActivity.java:
package com.xiesir.example17xml; import android.Manifest; import android.content.pm.PackageManager; import android.os.Build; import android.os.Environment; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.util.Xml; import android.view.View; import android.widget.Toast; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlSerializer; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { final public static int EXTERNAL_STORAGE_REQ_CODE = 10; List<PersonInfo> personInfoList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String allname = "高帅富雄伟白富美小芳"; personInfoList = new ArrayList<PersonInfo>(); for (int i = 0; i < 10; i++) { PersonInfo pi = new PersonInfo("", true, "1385868789" + i, "1385868789" + i + "@gmail.com", "https://www.facebook.com/" + "1385868789" + i, ""); if (i % 2 == 0) { pi.name = "大" + allname.substring(i/2, i/2 + 1); pi.sex = false; } else { pi.name = "小" + allname.substring(i/2 + 5, i/2 + 6); pi.sex = true; pi.note = "小小美女一枚"; } // System.out.println(pi.toString()); personInfoList.add(pi); } } public void saveClick(View v) { requestPermission(); } private void save() { // 获取xml序列化器 XmlSerializer xs = Xml.newSerializer(); if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { File file = new File(Environment.getExternalStorageDirectory(), "pil.xml"); FileOutputStream fos; try { fos = new FileOutputStream(file); // 初始化,xml文件由什么编码生成 xs.setOutput(fos, "utf-8"); // 开始生成xml文件 // 生成头结点 xs.startDocument("utf-8", true); // 生成开始标签 xs.startTag(null, "Infomations"); for (PersonInfo pi : personInfoList) { xs.startTag(null, "Personal"); xs.startTag(null, "name"); xs.text(pi.getName()); xs.endTag(null, "name"); xs.startTag(null, "sex"); xs.text(pi.isSex() + ""); xs.endTag(null, "sex"); xs.startTag(null, "phone"); xs.text(pi.getPhone()); xs.endTag(null, "phone"); xs.startTag(null, "email"); xs.text(pi.getEmail()); xs.endTag(null, "email"); xs.startTag(null, "homepage"); xs.text(pi.getHomepage()); xs.endTag(null, "homepage"); xs.startTag(null, "note"); xs.text(pi.getNote()); xs.endTag(null, "note"); xs.endTag(null, "Personal"); } // 生成结束标签 xs.endTag(null, "Infomations"); // 告知序列化器生成xml结束 xs.endDocument(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void requestPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // Build.VERSION_CODES.M == 23,即 Android 6.0 ,也即 API 23 // 判断当前Activity是否已经获得了该权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // 进行权限请求 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, EXTERNAL_STORAGE_REQ_CODE); return; } else save(); } else save(); } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case EXTERNAL_STORAGE_REQ_CODE: { // 如果请求被拒绝,那么通常grantResults数组为空 if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) // 申请成功,进行相应操作 save(); else // 申请失败,可以继续向用户解释。 Toast.makeText(getApplicationContext(), "拒绝访问外部存储器", Toast.LENGTH_SHORT).show(); return; } } } public void readClick(View v) { // 获取 xml 文件 InputStream is = getClassLoader().getResourceAsStream(Environment.getExternalStorageDirectory() + "pil.xml"); // 获取xmlpull解析器 XmlPullParser xp = Xml.newPullParser(); try { // 初始化 xp.setInput(is, "UTF-8"); // 获取当前节点的事件类型 int type = xp.getEventType(); PersonInfo person = null; while (type != XmlPullParser.END_DOCUMENT) { switch (type) { case XmlPullParser.START_TAG: // 获取当前节点的名字 if ("Infomations".equals(xp.getName())) { personInfoList.clear(); // personInfoList = new ArrayList<PersonInfo>(); } else if ("Personal".equals(xp.getName())) { person = new PersonInfo(); } else if ("name".equals(xp.getName())) { // 获取下一个节点的文本 String name = xp.nextText(); person.setName(name); } else if ("sex".equals(xp.getName())) { // 获取下一个节点的文本,把指针移动至当前节点的结束节点 String sex = xp.nextText(); person.setSex(sex.equals("true")); } else if("phone".equals(xp.getName())) { String phone = xp.nextText(); person.setPhone(phone); } else if("email".equals(xp.getName())) { String email = xp.nextText(); person.setEmail(email); } else if("homepage".equals(xp.getName())) { String homepage = xp.nextText(); person.setHomepage(homepage); } else if("note".equals(xp.getName())) { String note = xp.nextText(); person.setNote(note); } break; case XmlPullParser.END_TAG: if("Personal".equals(xp.getName())){ personInfoList.add(person); } break; } // 把指针移动至下一个节点,并返回该节点的事件类型 type = xp.next(); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } for (PersonInfo pi : personInfoList) System.out.println(pi.toString()); } }
参考:
说明:
在Android 6下,程序有重大缺陷,不能先点“读出”按钮,再点"保存"按钮,因为是在保存中授权的。
需要将授权模块独立出来,先执行,才能解决。
浙公网安备 33010602011771号