当前位置: 编程技术>移动开发
本页文章导读:
▪保留activity状态(Saving activity state) 保存activity状态(Saving activity state)
保存activity状态(Saving activity state) 当系统而不是用户自己出于回收内存的考虑,关闭了一个activity之后。用户会期望当他再次回到那个activity的时.........
▪ java字符串处置(分割截取替换等) java字符串处理(分割截取替换等)
/**
* 分割字符串
*
* @param str String 原始字符串
* @param splitsign String 分隔符
* @return String[] 分割后的字符串数组
*/
@SuppressWarnings("unchecked")
public st.........
▪ ViewPager使用中的一些小疑点 ViewPager使用中的一些小问题
ViewPager是在引入Fragment中一起加入的,它的主要作用就是可以配合ActionBar与Fragment一起,容易的编写一些tab界面.从Demos里可以看到一些例子,对于如何使用它与Fragment.........
[1]保留activity状态(Saving activity state)
来源: 互联网 发布时间: 2014-02-18
保存activity状态(Saving activity state)
保存activity状态(Saving activity state)
当系统而不是用户自己出于回收内存的考虑,关闭了一个activity之后。用户会期望当他再次回到那个activity的时候,它仍保持着上次离开时的样子。
为了获取activity被杀死前的状态,你应该为activity实现onSaveInstanceState() 方法。Android在activity有可能被销毁之前(即onPause() 调用之前)会调用此方法。它会将一个以名称-值对方式记录了activity动态状态的Bundle 对象传递给该方法。当activity再次启动时,这个Bundle会传递给onCreate()方法和随着onStart()方法调用的onRestoreInstanceState(),所以它们两个都可以恢复捕获的状态。
与onPause()或先前讨论的其它方法不同,onSaveInstanceState() 和 onRestoreInstanceState() 并不是生命周期方法。它们并不是总会被调用。比如说,Android会在activity易于被系统销毁之前调用 onSaveInstanceState(),但用户动作(比如按下了BACK键)造成的销毁则不调用。在这种情况下,用户没打算再次回到这个activity,所以没有保存状态的必要。
因为onSaveInstanceState()不是总被调用,所以你应该只用它来为activity保存一些临时的状态,而不能用来保存持久性数据。而是应该用onPause()来达到这个目的。
保存activity状态(Saving activity state)
当系统而不是用户自己出于回收内存的考虑,关闭了一个activity之后。用户会期望当他再次回到那个activity的时候,它仍保持着上次离开时的样子。
为了获取activity被杀死前的状态,你应该为activity实现onSaveInstanceState() 方法。Android在activity有可能被销毁之前(即onPause() 调用之前)会调用此方法。它会将一个以名称-值对方式记录了activity动态状态的Bundle 对象传递给该方法。当activity再次启动时,这个Bundle会传递给onCreate()方法和随着onStart()方法调用的onRestoreInstanceState(),所以它们两个都可以恢复捕获的状态。
与onPause()或先前讨论的其它方法不同,onSaveInstanceState() 和 onRestoreInstanceState() 并不是生命周期方法。它们并不是总会被调用。比如说,Android会在activity易于被系统销毁之前调用 onSaveInstanceState(),但用户动作(比如按下了BACK键)造成的销毁则不调用。在这种情况下,用户没打算再次回到这个activity,所以没有保存状态的必要。
因为onSaveInstanceState()不是总被调用,所以你应该只用它来为activity保存一些临时的状态,而不能用来保存持久性数据。而是应该用onPause()来达到这个目的。
[2] java字符串处置(分割截取替换等)
来源: 互联网 发布时间: 2014-02-18
java字符串处理(分割截取替换等)
/**
* 分割字符串
*
* @param str String 原始字符串
* @param splitsign String 分隔符
* @return String[] 分割后的字符串数组
*/
@SuppressWarnings("unchecked")
public static String[] split(String str, String splitsign) {
int index;
if (str == null || splitsign == null)
return null;
ArrayList al = new ArrayList();
while ((index = str.indexOf(splitsign)) != -1) {
al.add(str.substring(0, index));
str = str.substring(index + splitsign.length());
}
al.add(str);
return (String[]) al.toArray(new String[0]);
}
/**
* 替换字符串
*
* @param from String 原始字符串
* @param to String 目标字符串
* @param source String 母字符串
* @return String 替换后的字符串
*/
public static String replace(String from, String to, String source) {
if (source == null || from == null || to == null)
return null;
StringBuffer bf = new StringBuffer("");
int index = -1;
while ((index = source.indexOf(from)) != -1) {
bf.append(source.substring(0, index) + to);
source = source.substring(index + from.length());
index = source.indexOf(from);
}
bf.append(source);
return bf.toString();
}
/**
* 替换字符串,能能够在HTML页面上直接显示(替换双引号和小于号)
*
* @param str String 原始字符串
* @return String 替换后的字符串
*/
public static String htmlencode(String str) {
if (str == null) {
return null;
}
return replace("\"", """, replace("<", "<", str));
}
/**
* 替换字符串,将被编码的转换成原始码(替换成双引号和小于号)
*
* @param str String
* @return String
*/
public static String htmldecode(String str) {
if (str == null) {
return null;
}
return replace(""", "\"", replace("<", "<", str));
}
private static final String _BR = "<br/>";
/**
* 在页面上直接显示文本内容,替换小于号,空格,回车,TAB
*
* @param str String 原始字符串
* @return String 替换后的字符串
*/
public static String htmlshow(String str) {
if (str == null) {
return null;
}
str = replace("<", "<", str);
str = replace(" ", " ", str);
str = replace("\r\n", _BR, str);
str = replace("\n", _BR, str);
str = replace("\t", " ", str);
return str;
}
/**
* 返回指定字节长度的字符串
*
* @param str String 字符串
* @param length int 指定长度
* @return String 返回的字符串
*/
public static String toLength(String str, int length) {
if (str == null) {
return null;
}
if (length <= 0) {
return "";
}
try {
if (str.getBytes("GBK").length <= length) {
return str;
}
} catch (Exception ex) {
}
StringBuffer buff = new StringBuffer();
int index = 0;
char c;
length -= 3;
while (length > 0) {
c = str.charAt(index);
if (c < 128) {
length--;
} else {
length--;
length--;
}
buff.append(c);
index++;
}
buff.append("...");
return buff.toString();
}
/**
* 判断是否为整数
*
* @param str 传入的字符串
* @return 是整数返回true,否则返回false
*/
public static boolean isInteger(String str) {
Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
return pattern.matcher(str).matches();
}
/**
* 判断是否为浮点数,包括double和float
*
* @param str 传入的字符串
* @return 是浮点数返回true,否则返回false
*/
public static boolean isDouble(String str) {
Pattern pattern = Pattern.compile("^[-\\+]?[.\\d]*$");
return pattern.matcher(str).matches();
}
/**
* 判断输入的字符串是否符合Email样式.
*
* @param str 传入的字符串
* @return 是Email样式返回true,否则返回false
*/
public static boolean isEmail(String str) {
Pattern pattern = Pattern.compile("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$");
return pattern.matcher(str).matches();
}
/**
* 判断输入的字符串是否为纯汉字
*
* @param str 传入的字符窜
* @return 如果是纯汉字返回true,否则返回false
*/
public static boolean isChinese(String str) {
Pattern pattern = Pattern.compile("[\u0391-\uFFE5]+$");
return pattern.matcher(str).matches();
}
/**
* 是否为空白,包括null和""
*
* @param str
* @return
*/
public static boolean isBlank(String str) {
return str == null || str.trim().length() == 0;
}
/**
* 判断是不是合法手机
* handset 手机号码
*/
public static boolean isHandset(String handset) {
try {
if(!handset.substring(0,1).equals("1")) {
return false;
}
if (handset==null || handset.length()!=11) {
return false;
}
String check = "^[0123456789]+$";
Pattern regex = Pattern.compile(check);
Matcher matcher = regex.matcher(handset);
boolean isMatched = matcher.matches();
if(isMatched) {
return true;
} else {
return false;
}
} catch (RuntimeException e) {
return false;
}
}
}
[3] ViewPager使用中的一些小疑点
来源: 互联网 发布时间: 2014-02-18
ViewPager使用中的一些小问题
ViewPager是在引入Fragment中一起加入的,它的主要作用就是可以配合ActionBar与Fragment一起,容易的编写一些tab界面.
从Demos里可以看到一些例子,对于如何使用它与Fragment.使用supportv4的包可以将Fragment运用在api level 10以下的系统,但是没有ActionBar,如果想要,需要自己实现.至于如何实现ActionBar再说了.
主要谈谈ViewPager与Fragment一起使用.
代码主要参考Support4Demos中的,可以下载来看下.
ViewPager的初始化:
mPager = (ViewPager)findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
一个适配器是必须的,因为在页面切换时需要一个切换内容的数据列表,就像自己实现ViewFlipper或是使用手势操作一样,但它有一个优点,就是当你移动时,可以先看到下一个界面的内容,而自己实现手势操作,是先看到一片黑色背景,移动成功后才加载新的界面xml与数据.
ViewPager里面还定义了一个
private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES;默认值 是1,这表示你的预告加载的页面数量是1,假设当前有四个Fragment的tab,显示一个,预先加载下一个.这样你在移动前就已经加载了下一个界面,移动时就可以看到已经加载的界面了.
从日志里面可以看到onActivityCreated等方法在初始化第一个Fragment完成后就会初始化下一个Fragment.
假设你想预先加载多个Fragment可以使用它提供的公共方法:
ViewPager是在引入Fragment中一起加入的,它的主要作用就是可以配合ActionBar与Fragment一起,容易的编写一些tab界面.
从Demos里可以看到一些例子,对于如何使用它与Fragment.使用supportv4的包可以将Fragment运用在api level 10以下的系统,但是没有ActionBar,如果想要,需要自己实现.至于如何实现ActionBar再说了.
主要谈谈ViewPager与Fragment一起使用.
代码主要参考Support4Demos中的,可以下载来看下.
ViewPager的初始化:
mPager = (ViewPager)findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
一个适配器是必须的,因为在页面切换时需要一个切换内容的数据列表,就像自己实现ViewFlipper或是使用手势操作一样,但它有一个优点,就是当你移动时,可以先看到下一个界面的内容,而自己实现手势操作,是先看到一片黑色背景,移动成功后才加载新的界面xml与数据.
ViewPager里面还定义了一个
private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES;默认值 是1,这表示你的预告加载的页面数量是1,假设当前有四个Fragment的tab,显示一个,预先加载下一个.这样你在移动前就已经加载了下一个界面,移动时就可以看到已经加载的界面了.
从日志里面可以看到onActivityCreated等方法在初始化第一个Fragment完成后就会初始化下一个Fragment.
假设你想预先加载多个Fragment可以使用它提供的公共方法:
public void setOffscreenPageLimit(int limit) {
if (limit < DEFAULT_OFFSCREEN_PAGES) {
Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to " +
DEFAULT_OFFSCREEN_PAGES);
limit = DEFAULT_OFFSCREEN_PAGES;
}
if (limit != mOffscreenPageLimit) {
mOffscreenPageLimit = limit;
populate();
}
}
从这个方法来看,不管你设置什么值,至少会预先加载下一个Fragment,你想预先加载几个就可以传入相应的参数.
这种情况如音乐播放时,如果有自动加载歌词就可以使用了.
如果你的界面需要加载一些大量的数据,但你不想预先加载下一个界面(需要网络或耗时的操作),使用ViewPager却很无耐.特别是下一个界面有可能你一段很长时间不会使用到,如我开发的微博,在显示主页后我不想立即加载下一个界面,因为都有ListView,如果我不访问它,就不必加载无用的资源.
可以通过修改这个值,但有,修改后就会有一个麻烦的地方,因为移动时不会预先加载下一个界面的关系,所以会看到一片黑色的背景.
如果不介意黑色背景,可以覆盖这个类,然后定义默认的加载数量为0
private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES=0;就是不预先加载下一个界面.
如果想预加载,可以使用原来的ViewPager,或这里直接改为mOffscreenPageLimit=你要加载的数量。
由于sdk的更新问题,不是所有v4 support都适合的,v17时就换了
先到这吧.
1 楼
si5hao
2012-04-21
为什么 设置了都 不起什么作用呢,请问怎么写呢
2 楼
phenom
2012-04-23
mViewPager.setOffscreenPageLimit(5);
就可以了。会加载后面的5个fragment,当你滚动到相应的页面时,就会显示已经加载的界面了,默认是一个,保证了,当你滚动时,可以立即看到下一个页面,而我改成0,滚动时看不到下一个界面,只有滚动完成了,才会加载数据,布局等。
就可以了。会加载后面的5个fragment,当你滚动到相应的页面时,就会显示已经加载的界面了,默认是一个,保证了,当你滚动时,可以立即看到下一个页面,而我改成0,滚动时看不到下一个界面,只有滚动完成了,才会加载数据,布局等。
最新技术文章: