編輯:Android開發實例
前兩天用SharedPreference實現了保存用戶歷史信息,當用戶再次登錄的時候在AutoCompleteTextView(仿google搜索自動提示框)中顯示歷史用戶信息。
這次用戶信息是通過XML保存的,其中比較中要的包括了XML數據的生成和XML數據的解析,以及生成apk私有數據。
XML數據生成:在將用戶信息保存成XML數據前,我們應該先了解一個非常重要的類XmlSerializer,這個類幫助我們將需要保存成XML數據的信息進行序列化。
代碼public String writeToString(List<UserInfo> users){
//實現xml信息序列號的一個對象
XmlSerializer serializer=Xml.newSerializer();
StringWriter writer=new StringWriter();
try {
//xml數據經過序列化後保存到String中,然後將字串通過OutputStream保存為xml文件
serializer.setOutput(writer);
//文檔開始
serializer.startDocument("utf-8", true);
//開始一個節點
serializer.startTag("", "users");
//開始一個子節點
for(UserInfo user : users){
serializer.startTag("", "user");
serializer.attribute("", "id", String.valueOf(user.getId()));
serializer.startTag("", "name");
serializer.text(user.getName());
serializer.endTag("", "name");
serializer.startTag("", "pwd");
serializer.text(user.getPwd());
serializer.endTag("", "pwd");
serializer.startTag("", "isremember");
serializer.text(String.valueOf(user.getIsRemember()));
serializer.endTag("", "isremember");
serializer.endTag("", "user");
}
serializer.endTag("", "users");
//關閉文檔
serializer.endDocument();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return writer.toString();
}
將字串保存為apk的私有文件
代碼public boolean writeToXml(Context context,String str){
try {
OutputStream out=context.openFileOutput("users.xml", Context.MODE_PRIVATE);
OutputStreamWriter outw=new OutputStreamWriter(out);
try {
outw.write(str);
outw.close();
out.close();
return true;
} catch (IOException e) {
// TODO Auto-generated catch block
return false;
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
return false;
}
}
XML數據解析
由於使用DOM方法需要將整個XML文檔加載內存中,對系統資源占用比較多,這對內存比較緊張的Android系統來說,使用DOM方法讀取XML文檔會有很大的限制。 所以使用SAX方法讀取XML,以減少對內存資源的占用。
使用SAX解析xml數據其實很簡單,無非就是幾個過程,startDocument——startElement——character——endElement——endDocument
startDocument:開始解析xml數據,如果處理的數據很多,在這裡實例化一個list對象。
startElement:節點元素數據的處理,獲取節點元素的屬性值,往往在這裡對抽象化的對象進行實例化如一個用戶的信息UserInfo user
character:獲得傑點元素的內容,在這裡專門獲得沒有屬性節點的內容,如<name>cbin</name>
endElement:一個節點的結束,也就相當於一個用戶信息的解析完畢,在這裡將user添加到list中
endDocument:XML數據解析結束
代碼public class UsersHandler extends DefaultHandler {
private List<UserInfo> list=null;
private UserInfo user=null;
private String tagname;
//開始解析XML文檔
@Override
public void startDocument() throws SAXException{
list=new ArrayList<UserInfo>();
super.startDocument();
}
//開始處理節點,在這裡獲得節點屬性值的(節點屬性)
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException{
if(localName.equals("user")){
user=new UserInfo();
user.setId(Integer.parseInt(attributes.getValue("id")));
}
this.tagname=localName;
super.startElement(uri, localName, qName, attributes);
}
//處理沒有屬性的節點(節點內容)
@Override
public void characters(char[] ch, int start, int length) throws SAXException{
if(this.tagname!=""){
if(this.tagname.equals("name")){
String str=new String(ch, start, length);
user.setName(str);
}else if(this.tagname.equals("pwd")){
String str=new String(ch, start, length);
user.setPwd(str);
}else if(this.tagname.endsWith("isremember")){
String str=new String(ch, start, length);
user.setIsRemember(Integer.parseInt(str));
}
}
super.characters(ch, start, length);
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException{
if(localName.equals("user")){
list.add(user);
}
super.endElement(uri, localName, qName);
}
@Override
public void endDocument() throws SAXException{
super.endDocument();
}
public List<UserInfo> getUserList(){
return list;
}
}
表示層與SharedPreferences中實現用戶登錄大同小異,無非是一個登錄的邏輯處理
1、加載頁面時,加載xml中數據,將用戶名列表綁定AutoCompleteTextView
2、假若從act中選定數據,根據用戶名查找密碼等信息綁定et、ck;
3、登錄成功,是新用戶直接添加,老用戶刪除原有記錄,重新記錄用戶信息。
貼個效果圖:
選定之後自動填充數據
參考:http://www.moandroid.com/?p=821 Android讀寫XML(中)
1、用於沒有一點提示的情況:依次打開eclipse上面的windows ——preferences ——java ——editor —— content assi
android實現底部布局往往使用RelativeLayout的布局方式,並且設置android:layout_alignParentBottom=”true”,
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我