新思想

XML

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下,程序有重大缺陷,不能先点“读出”按钮,再点"保存"按钮,因为是在保存中授权的。

需要将授权模块独立出来,先执行,才能解决。

posted on 2016-05-31 01:04  新思想  阅读(233)  评论(0)    收藏  举报

导航