android 读写xml,修改appserver.xml(根据appserver.xml文件的位置进行操作)

来源:互联网 发布:ai cc mac 破解版 编辑:程序博客网 时间:2024/05/16 06:17
这个例子可以独立运行,需要在res/xml中添加一个appserver.xml文件。package com.capinfo.mobile.elena_wang;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;import org.xmlpull.v1.XmlPullParserFactory;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.res.XmlResourceParser;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.Gravity;import android.view.KeyEvent;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.EditText;import android.widget.LinearLayout.LayoutParams;import android.widget.ListView;import android.widget.SimpleAdapter;import com.capinfo.mobile.R;import com.capinfo.mobile.application.AppServerVO;import com.capinfo.mobile.base.view.NewLockActivity;import com.capinfo.mobile.exception.MSCException;import com.capinfo.mobile.utils.MSCUtil;import com.capinfo.mobilecore.utils.CoreConstants;public class SystemVersionAppserver extends Activity {ListView listview;//显示AppServer中内容List<HashMap<String, Object>> list = null;//直接解析appserver.xml得到的内容List<HashMap<String, Object>> listTitle = null;//存储更改的listview中的内容boolean[] isChange;//判断是否修改了值private SimpleAdapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.appserver);setTitle("appserver");//设置页面的titlelistview = (ListView)findViewById(R.id.appserver_listview);list = new ArrayList<HashMap<String, Object>>();listTitle  = new ArrayList<HashMap<String, Object>>();File file = new File(CoreConstants.FILE_SYSTEM_PATH + "appserver.xml");//获取sdcard上的文件路径//判断sdcard中是否有AppServer.xml文件if (!file.exists()) {//证明sdcard中没有该资源文件。getAppServer(SystemVersionAppserver.this.getResources().getXml(R.xml.appserver));System.out.println("sdcard中没有资源文件");saveUpdate();//往sdcard中写入appserver.xml文件。} else {//sdcard上面有资源文件,则直接解析sdcard上的文件pullXml();}adapter = new SimpleAdapter(this, listTitle,R.layout.appserver_list, new String[] { "appName","appValue" }, new int[] {R.id.appserver_list_tv,R.id.appserver_list_et });listview.setAdapter(adapter);listview.setOnItemClickListener(listener);isChange = new boolean[list.size()];//初始化isChange,先赋值为falsefor(int i = 0;i<list.size();i++){isChange[i] = false;}}//end onCreate()/**listview监听item事件  * * @author elena*/private OnItemClickListener listener = new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View arg1, final int arg2,long arg3) {HashMap<String, Object> map = listTitle.get(arg2);final String appValue = map.get("appValue").toString();final EditText et = new EditText(SystemVersionAppserver.this);et.setText(appValue);et.setSingleLine(); // 设置单行显示et.setGravity(Gravity.FILL_HORIZONTAL); // 使对话框位于屏幕的底部并居中et.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 100));final String appName = map.get("appName").toString();AlertDialog dialog = new AlertDialog.Builder(SystemVersionAppserver.this).setTitle(appName).setView(et).setPositiveButton("确定", // 确定按钮new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog,int which) {String value_2 = et.getText().toString();HashMap<String, Object> map = new HashMap<String, Object>();map.put("appName", appName);map.put("appValue", value_2);listTitle.set(arg2, map);adapter.notifyDataSetChanged();// 更新listviewdialog.cancel();change(arg2);//判断是否改变list中的内容是否改变了}}).setNegativeButton("取消", // 取消按钮new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog,int which) {dialog.cancel();dialog.dismiss();}}).create();dialog.show();}};/**提示对话框,是否保存   *  * @author elena*/public void showDialog() {AlertDialog dialog = new AlertDialog.Builder(SystemVersionAppserver.this).setTitle("是否确定保存修改的内容").setPositiveButton(R.string.main_b_submit,new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface paramDialogInterface,int paramInt) {saveUpdate();SystemVersionAppserver.this.finish();System.out.println("=======change===saveUpdate===");}}).setNegativeButton(R.string.main_b_cancel,new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int arg1) {System.out.println("=======change===cancel======");dialog.cancel();SystemVersionAppserver.this.finish();}}).create();dialog.show();}//end showDialog()/**判断是否修改,修改了之后在退出时弹出对话框是否确定保存   *  * @author 王晨 */private void change(int position) {String b = listTitle.get(position).get("appValue").toString();if(!(list.get(position).get("appValue").toString()).equals(b)){isChange[position] = true;//System.out.println("====change position is===="+position);}else{isChange[position] = false;}}//end change()/** * 解析SDcard文件函数  *  * @author elena */private void pullXml() {list.clear();listTitle.clear();String path = CoreConstants.FILE_SYSTEM_PATH + "appserver.xml";try {XmlPullParserFactory factory = XmlPullParserFactory.newInstance();XmlPullParser parser = factory.newPullParser();parser.setInput(Thread.currentThread().getContextClassLoader().getResourceAsStream(path), "UTF-8");int type = parser.getEventType();// 获取事件类型while (type != XmlPullParser.END_DOCUMENT) {if (type == XmlPullParser.START_TAG) {String tagName = parser.getName();if (tagName.equals("app")) {HashMap<String, Object> map = new HashMap<String, Object>();String appName = parser.getAttributeValue(0);map.put("appName", appName);String appValue = parser.getAttributeValue(1);map.put("appValue", appValue);list.add(map);listTitle.add(map);}}type = parser.next();}} catch (XmlPullParserException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}//end pullxml()/** 保存修改后的内容 *  * @author elena */public void saveUpdate() {System.out.println("===------save  update-------====");StringBuffer str = new StringBuffer();str.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>"+ "<resources>");for(int i = 0;i<listTitle.size();i++){String a = listTitle.get(i).get("appName").toString();String b = listTitle.get(i).get("appValue").toString();b = b.replace("&", "&");//将b中含有“&”的位置改为“&”的方法用后面的字符串代替前面的字符串str.append(" <app ").append("id=\""+a+"\" ").append("value=\""+b+"\" ").append("/>");}str.append("</resources>");String file_path = CoreConstants.FILE_SYSTEM_PATH + "appserver.xml";File file = new File(file_path);FileOutputStream fos = null;try {fos = new FileOutputStream(file);fos.write(str.toString().getBytes());} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (fos != null) {try {fos.flush();fos.close();} catch (IOException e) {e.printStackTrace();}}}}//end saveUpdate()/** * 读取res/xml下资源文件 *  * @author elena *  * @param xrp *            XmlResourceParser * @return 服务器信息 */public void getAppServer(final XmlResourceParser xrp) {try {list.clear();listTitle.clear();while (xrp.getEventType() != XmlResourceParser.END_DOCUMENT) {if (xrp.getEventType() == XmlResourceParser.START_TAG) {String s = xrp.getName();if (s.equals("app")) {String id = xrp.getAttributeValue(null, "id");String value = xrp.getAttributeValue(null, "value");HashMap<String, Object> map = new HashMap<String, Object>();map.put("appName", id);map.put("appValue", value);list.add(map);listTitle.add(map);}}xrp.next();}} catch (Exception e) {MSCException.show("Constants.getAppServer error ! ", e);} finally {xrp.close();}}/** * 捕捉返回按钮事件 *  * @author elena *  * @param keyCode *            按键编码 * @param event *            按键事件 * @return true */@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {// 是否触发按键为back键if ((keyCode == KeyEvent.KEYCODE_BACK)) {for(int i=0;i<list.size();i++){if(isChange[i] == true){showDialog();return true;}}return super.onKeyDown(keyCode, event);} else {return super.onKeyDown(keyCode, event);}}}