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();
}
}
});
}
}
其实很简单,就是一个键值对而已,可以做一下简单的了解。
就先介绍到这里吧,希望看到的人能有些许的启发和学习。
这里要说的其实也没多少东西,无非定义布局外观时候怎么节省代码量、提高可维护性。
我们知道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();
}
}
});
}
}
其实很简单,就是一个键值对而已,可以做一下简单的了解。
就先介绍到这里吧,希望看到的人能有些许的启发和学习。
相关文章推荐
- android主题与风格入门
- Andorid 界面风格和主题设计
- seaborn主题风格与调色板设定
- 【阅读】《网页设计创意书》第五章——风格和主题
- Resource相关 风格style与主题theme(一)-style、theme的关系与使用
- 主题 Java学习从入门到精通
- Android 主题资源风格定制 <1>
- 转:ECharts图表组件入门教程之Theme:ECharts图表的皮肤是什么?如何给图表换主题(皮肤)Theme?
- 自定义Android的风格和主题的详细使用
- Java简单入门---------JDK的检测,安装和环境变量设定
- PHP 会话(session 时间设定)使用入门
- Metro UI 风格的主题和模板
- Android应用开发中的风格和主题(style,themes)
- COGS 902 乐曲主题 题解 & hash入门贺
- 10大流行的 Metro UI 风格的 Bootstrap 主题和模板
- Android应用开发中的风格和主题(style,themes)
- Mqtt入门之主题与主题过滤器
- Android风格与主题(style and theme)
- 【项目搭建】使用spring-boot进行REST风格的微服务开发入门
- 【Android】统一主题风格