您的位置:首页 > 移动开发 > Android开发

Andorid入门--风格主题设定和XML解析

2011-08-27 12:44 399 查看
再看----XML》

这里要说的其实也没多少东西,无非定义布局外观时候怎么节省代码量、提高可维护性。

我们知道android做布局用的是XML,当然也可以自己写代码生成布局,不过为了快速有效的开发,大家应该不会经常采用这种方法,层层嵌套,一个个的把元素flate出来吧,想想都头疼,所以个人感觉,XML仍然是玩家的必备之选,考虑到我们要说的2点好处,所以很容易的让想到了CSS(层叠样式表),是的,说道做UI的外观,有了Style&Theme给我们省了不少的时间。

现在说一下Style&Theme:

a) 可以继承,两种方式 .和parent,在res\values中完成

b) style与theme冲突时

以主题为准,或者子类

-------比如我们定义的应用中用的theme,应用下的活动用的style,那么theme会覆盖style的显示效果。

-------比如我们定义father和father.child两个风格,2个风格中同时有item-android:textColor 那么father.child会覆盖father的显示效果。

c) 属性的引用

style与theme的不同之处在于style是对组件的属性进行了设置

theme是对窗体属性进行的设置

d) 如何使用系统的风格和主题

e) 主题定义的属性来自哪里

Android系统定义主题、风格、窗口属性的xml文件位置:

$android-sdk-r10\platforms\android-10\data\res\values

styles.xml/themes.xml/attrs.xml

f) 代码中设置主题

setTheme(R.style.)

1. 测试代码设置主题是否生效---我们可以做个练习从系统的定义的一个主题中选一个看一下效果,需要注意的是setTheme(R.style.)应该放在setContentView(R.layout.)之前设置

2. 代码中的主题名称与AndroidManifest.xml文件

中使用的主题名称是有区别的

因为"."在java代码中是有特殊意义的,所以在R文件中会把.生成为"_"来表示

------------------------------------------------

以上是对style和theme的一些课堂总结,下面说一下XML的解析

2. XML文件解析

a) SAX---很简单的基于事件驱动的解析,当发现元素的开始、结束,文本文档的开始、结束时发送事件进行解析,但是解析后的数据不易保存

b) DOM---把整个树结构解析出来调入内存,然后调用DOM的接口进行解析,但是内存的消耗较大

c) PULL---android推荐的解析XML的解析器,个人感觉和SAX差不多,只是更好的做了一些处理,手机编程尽量还是使用比较节省内存的解析器来解析为好,资源很重要嘛。

下面是我在网上拷贝的一个例子(包含了生成XML和解析XML):

package com.ljq.service;

import java.io.InputStream;

import java.io.Writer;

import java.util.ArrayList;

import java.util.List;

import org.xmlpull.v1.XmlPullParser;

import org.xmlpull.v1.XmlSerializer;

import com.ljq.entity.Person;

import android.util.Xml;

/**

* Pull解析xml文件

*

* @author jiqinlin

*

*/

public class PullPersonService {

/**

* 使用pull解析器生成xml文件

*

* @param persons

* @param writer

* @return

*/

public static String writeXML(List<Person> persons, Writer writer){

XmlSerializer serializer = Xml.newSerializer();

try {

serializer.setOutput(writer);

serializer.startDocument("UTF-8", true);

//第一个参数为命名空间,如果不使用命名空间,可以设置为null

serializer.startTag("", "persons");

for (Person person : persons){

serializer.startTag("", "person");

serializer.attribute("", "id", person.getId().toString());

serializer.startTag("", "name");

serializer.text(person.getName());

serializer.endTag("", "name");

serializer.startTag("", "age");

serializer.text(person.getAge().toString());

serializer.endTag("", "age");

serializer.endTag("", "person");

}

serializer.endTag("", "persons");

serializer.endDocument();

} catch (Exception e) {

e.printStackTrace();

}

return writer.toString();

}

/**

* 使用pull解析器解析xml文件

*

* @param inStream

* @return

* @throws Exception

*/

public static List<Person> readXML(InputStream inStream) throws Exception {

XmlPullParser parser = Xml.newPullParser();

parser.setInput(inStream, "UTF-8");

int eventType = parser.getEventType();

Person currentPerson = null;

List<Person> persons = null;

while (eventType != XmlPullParser.END_DOCUMENT) {

switch (eventType) {

case XmlPullParser.START_DOCUMENT:// 文档开始事件,可以进行数据初始化处理

persons = new ArrayList<Person>();

break;

case XmlPullParser.START_TAG:// 开始元素事件

String name = parser.getName();

if (name.equalsIgnoreCase("person")) {

currentPerson = new Person();

currentPerson.setId(new Integer(parser.getAttributeValue(null, "id")));

} else if (currentPerson != null) {

if (name.equalsIgnoreCase("name")) {

currentPerson.setName(parser.nextText());// 如果后面是Text元素,即返回它的值

} else if (name.equalsIgnoreCase("age")) {

currentPerson.setAge(new Short(parser.nextText()));

}

}

break;

case XmlPullParser.END_TAG:// 结束元素事件

if (parser.getName().equalsIgnoreCase("person")&& currentPerson != null) {

persons.add(currentPerson);

currentPerson = null;

}

break;

}

eventType = parser.next();

}

inStream.close();

return persons;

}

}
-----------------
其实XML用途一般就是2个:
---1.做数据的载体,进行数据的传输
---2.定义数据结构,比如我们的res中用到的XML

在作为数据传输中,XML并非是最优的选择,下面简单介绍下JSON

JSON

a) 好处就是比XML的结构更简单一些,节省资源
b) 格式规则 { +"key"+ : + value + ,+…… + }

c) 如何解析

new JSONObject(strJSON)

HashMap

JSONArray

ArrayList
下面是做练习时候摘了一段解析的例子:

public class MainActivity extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

JSONObject jsonObj = new JSONObject();

try {

jsonObj.put("string", "this is a string");

jsonObj.put("boolean", true);

jsonObj.put("int", 243234);

JSONArray jsonArr = new JSONArray();

jsonArr.put("张");

jsonArr.put("asfdas");

jsonArr.put("sadf");

jsonObj.put("jsonArr", jsonArr);

} catch (JSONException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

final String strJSON = jsonObj.toString();

final TextView helloTv = (TextView) findViewById(R.id.hello);

final TextView appNameTv = (TextView) findViewById(R.id.app_name);

Button btn = (Button) findViewById(R.id.button1);

btn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

try {

// 解析JSON

JSONObject jsonObj = new JSONObject(strJSON);

JSONArray jsonArr = jsonObj.getJSONArray("jsonArr");

String str = jsonArr.getString(1);

String strAppName = jsonObj.getString("boolean");

helloTv.setText(str);

appNameTv.setText(strAppName);

} catch (JSONException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

});

}

}

其实很简单,就是一个键值对而已,可以做一下简单的了解。

就先介绍到这里吧,希望看到的人能有些许的启发和学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息