android 读写xml,修改appserver.xml(根据appserver.xml文件的位置进行操作)
2013-08-15 10:41
609 查看
这个例子可以独立运行,需要在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; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.appserver); setTitle("appserver");//设置页面的title listview = (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,先赋值为false for(int i = 0;i<list.size();i++){ isChange[i] = false; } }//end onCreate() /**listview监听item事件 * * @author elena*/ private OnItemClickListener listener = new OnItemClickListener() { @Override public 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();// 更新listview dialog.cancel(); change(arg2);//判断是否改变list中的内容是否改变了 } }).setNegativeButton("取消", // 取消按钮 new DialogInterface.OnClickListener() { @Override public 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() { @Override public 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 */ @Override public 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); } } }
相关文章推荐
- 运行时修改App.config文件----完善登录时的用户体验与对XmlDocument对象进行操作札记
- 关于C#和ASP.NET中对App.config和Web.config文件里的[appSettings]和[connectionStrings]节点进行新增、修改、删除和读取相关的操作
- 对项目配置文件app.comfig进行读写操作
- android中如何在SD卡上进行文件读写操作
- c# winform app.config xml 配置文件 读写操作
- android报错及解决2--Sdcard进行文件的读写操作报的异常
- android用NDK在内存卡创建目录、文件并进行读写操作
- Android编程之在SD卡上进行文件读写操作实例详解
- Android在对Sdcard进行文件的读写操作的时候报错FileNotFoundException
- 关于C#和ASP.NET中对App.config和Web.config文件里的[appSettings]和[connectionStrings]节点进行新增、修改、删除和读取相关的操作
- Android根据xml配置文件动态修改九宫格功能配置
- 利用python操作android的xml资源文件,让其按照中文自动生成对应中文首字母加起来的名字,并且根据中文在java类里面替代对应的中文
- Android-解析/生成xml、文件读写、数据库操作
- 关于C#和ASP.NET中对App.config和Web.config文件里的[appSettings]和[connectionStrings]节点进行新增、修改、删除和读取相关的操作
- 解决Android在对Sdcard进行文件的读写操作的时候报错FileNotFoundException
- 简单的Android对文件进行读写操作
- android中如何在SD卡上进行文件读写操作
- Android创建隐藏文件或者文件夹,并对其读写操作android创建隐藏文件或者文件夹,其实只要在文件名或者文件夹名字前加一个点号即可。 隐藏文件(夹)可直接进行读写。 下面是一段隐藏文件的创建
- Metro Style App开发快速入门 之XML文件读取,修改,保存等操作
- 关于C#和ASP.NET中对App.config和Web.config文件里的[appSettings]和[connectionStrings]节点进行新增、修改、删除和读取相关的操作