均属于笔记,仅供个人参考,有问题欢迎指正
一,Xml文件解析,现在已经用的很少了,基本都是json
三,尺寸
四,日期
五,相机的原始使用
六,ListView图片错乱处理
一,Xml文件解析,现在已经用的很少了,基本都是json
/**
* 以Pull方式解析XML文件的基本知识点:
* 常用的有:
* XmlPullParser.END_DOCUMENT
* XmlPullParser.START_DOCUMENT
* XmlPullParser.START_TAG
* XmlPullParser.END_TAG
* XmlPullParser.TEXT
* 分别代表着XML文档的结束,开始,标签的开始,标签的结束,内容
* 主要方法:
* next():获取下一个解析事件
* getAttributte():获取属性的值
* nextText():获取本节点的值
*/
public class XML_Pull {
/**
* 模板方法,具体XML文件具体解析
* 创建XmlPullParser
* 创建XmlPullParser方式有两种:
* 方式一:通过XmlPullParserFactory创建
* 方式二:通过Android.util.Xml类
* @return
* @throws XmlPullParserException
* @throws IOException
*/
public String PullXml(String xml) throws Exception {
// 1,构造工厂实例
XmlPullParserFactory xpf = XmlPullParserFactory.newInstance();
// 2,创建解析对象
XmlPullParser parser = xpf.newPullParser(); //通过XmlPullParserFactory创建
// XmlPullParser parser = Xml.newPullParser(); //通过Android.util.Xml类
// 3,设置数据源
parser.setInput(new StringReader(xml));
// XmlResourceParser xrp = getResources().getXml(R.xml.channels); //可以直接放在Activity中使用,读取本地XML形式的文件
// 4,设置存储解析后数据的容器,可使用StringBuffer或者JavaBean。
StringBuffer stb = new StringBuffer();
// JavaBean bean = new JavaBean();
// 5,解析xml数据,不同的XML文件则有不同的标签
// 直到文档的结尾处
while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
// 如果遇到了开始标签
if (parser.getEventType() == XmlPullParser.START_TAG) {
String tagName = parser.getName();// 获取标签的名字
if (tagName.equals("string")) {
String st = parser.nextText();
stb.append(st);
}
}
parser.next();// 获取解析下一个事件
}
return stb.toString();
}
/**
* 解析邮编地址信息
* @throws XmlPullParserException
*/
public String getAddressByZipCode(String result) throws Exception {
// 1,构造工厂实例
XmlPullParserFactory xpf = XmlPullParserFactory.newInstance();
// 2,创建解析对象
XmlPullParser parser = xpf.newPullParser();
// 3,设置数据源
parser.setInput(new StringReader(result));
// 4,设置存储解析后数据的容器,可使用StringBuffer或者JavaBean。
StringBuffer stb = new StringBuffer();
// JavaBean bean = new JavaBean();
// 5,解析xml数据
// 直到文档的结尾处
while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
// 如果遇到了开始标签
if (parser.getEventType() == XmlPullParser.START_TAG) {
String tagName = parser.getName();// 获取标签的名字
if (tagName.equals("PROVINCE")) {
String st = parser.nextText();
stb.append(st);
}
if (tagName.equals("CITY")) {
String st = parser.nextText();
stb.append(st);
}
if (tagName.equals("ADDRESS")) {
String st = parser.nextText();
stb.append(st);
}
if (tagName.equals("ZIP")) {
String st = parser.nextText();
stb.append(st+";\n");
}
}
parser.next();// 获取解析下一个事件
}
return stb.toString();
}
}
二,散方法
/**
* 把毫秒转换成:1:20:30这里形式
*/
public static String stringForTime(int timeMs) {
// 转换成字符串的时间
mFormatBuilder = new StringBuilder();
mFormatter = new Formatter(mFormatBuilder, Locale.getDefault());
int totalSeconds = timeMs / 1000;
int seconds = totalSeconds % 60;
int minutes = (totalSeconds / 60) % 60;
int hours = totalSeconds / 3600;
mFormatBuilder.setLength(0);
if (hours > 0) {
return mFormatter.format("%d:%02d:%02d", hours, minutes, seconds) .toString();
} else {
return mFormatter.format("%02d:%02d", minutes, seconds).toString();
}
}
/**
* 得到网络速度
* 每隔两秒调用一次
*/
public static String getNetSpeed(Context context) {
String netSpeed = "0 kb/s";
long nowTotalRxBytes = TrafficStats.getUidRxBytes(context.getApplicationInfo().uid)==TrafficStats.UNSUPPORTED ? 0 :(TrafficStats.getTotalRxBytes()/1024);//转为KB;
long nowTimeStamp = System.currentTimeMillis();
long speed = ((nowTotalRxBytes - lastTotalRxBytes) * 1000 / (nowTimeStamp - lastTimeStamp));//毫秒转换
lastTimeStamp = nowTimeStamp;
lastTotalRxBytes = nowTotalRxBytes;
netSpeed = String.valueOf(speed) + " kb/s";
return netSpeed;
}
/**
* 复制文本到剪贴板
* @param text
*/
public static void copyToClipboard(String text){
if(Build.VERSION.SDK_INT >= 11){
ClipboardManager cbm = (ClipboardManager) mApplicationContent.getSystemService(Activity.CLIPBOARD_SERVICE);
cbm.setPrimaryClip(ClipData.newPlainText(mApplicationContent.getPackageName(), text));
}else {
android.text.ClipboardManager cbm = (android.text.ClipboardManager) mApplicationContent.getSystemService(Activity.CLIPBOARD_SERVICE);
cbm.setText(text);
}
}
/**
* 经纬度测距
*/
public static double distance(double jingdu1, double weidu1, double jingdu2, double weidu2) {
double a, b, R;
R = 6378137; // 地球半径
weidu1 = weidu1 * Math.PI / 180.0;
weidu2 = weidu2 * Math.PI / 180.0;
a = weidu1 - weidu2;
b = (jingdu1 - jingdu2) * Math.PI / 180.0;
double d;
double sa2, sb2;
sa2 = Math.sin(a / 2.0);
sb2 = Math.sin(b / 2.0);
d = 2
* R
* Math.asin(Math.sqrt(sa2 * sa2 + Math.cos(weidu1)
* Math.cos(weidu2) * sb2 * sb2));
return d;
}
/**
* 是否有网络
*/
public static boolean isNetWorkAvilable() {
ConnectivityManager connectivityManager = (ConnectivityManager) mApplicationContent
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
if (activeNetInfo == null || !activeNetInfo.isAvailable()) {
return false;
} else {
return true;
}
}
/**
* 取APP版本号
*/
public static int getAppVersionCode(){
try {
PackageManager mPackageManager = mApplicationContent.getPackageManager();
PackageInfo _info = mPackageManager.getPackageInfo(mApplicationContent.getPackageName(),0);
return _info.versionCode;
} catch (NameNotFoundException e) {
return 0;
}
}
/**
* 取APP版本名
*/
public static String getAppVersionName(){
try {
PackageManager mPackageManager = mApplicationContent.getPackageManager();
PackageInfo _info = mPackageManager.getPackageInfo(mApplicationContent.getPackageName(),0);
return _info.versionName;
} catch (NameNotFoundException e) {
return null;
}
}
/**
* 读取asset文件,可使用
*/
public static String getStringFromAssets(String fileName){
try {
InputStreamReader inputReader = new InputStreamReader(mApplicationContent.getResources().getAssets().open(fileName) );
BufferedReader bufReader = new BufferedReader(inputReader);
String line="";
String Result="";
while((line = bufReader.readLine()) != null)
Result += line;
return Result;
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
/**
* 打开软键盘
*/
public static void openKeybord(EditText mEditText, Context mContext)
{
InputMethodManager imm = (InputMethodManager) mContext
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(mEditText, InputMethodManager.RESULT_SHOWN);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,
InputMethodManager.HIDE_IMPLICIT_ONLY);
}
/**
* 关闭软键盘
*/
public static void closeKeybord(EditText mEditText, Context mContext)
{
InputMethodManager imm = (InputMethodManager) mContext
.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);
}
三,尺寸
/**
* dp转px
*
*/
public static int dip2px(float dpValue) {
final float scale = mApplicationContent.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* px转dp
*/
public static int px2dip(float pxValue) {
final float scale = mApplicationContent.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/**
* 取屏幕宽度
* @return
*/
public static int getScreenWidth(){
DisplayMetrics dm = mApplicationContent.getResources().getDisplayMetrics();
return dm.widthPixels;
}
/**
* 取屏幕高度
* @return
*/
public static int getScreenHeight(){
DisplayMetrics dm = mApplicationContent.getResources().getDisplayMetrics();
return dm.heightPixels-getStatusBarHeight();
}
/**
* 取屏幕高度包含状态栏高度
* @return
*/
public static int getScreenHeightWithStatusBar(){
DisplayMetrics dm = mApplicationContent.getResources().getDisplayMetrics();
return dm.heightPixels;
}
/**
* 取导航栏高度
* @return
*/
public static int getNavigationBarHeight() {
int result = 0;
int resourceId = mApplicationContent.getResources().getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId > 0) {
result = mApplicationContent.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
/**
* 取状态栏高度
* @return
*/
public static int getStatusBarHeight() {
int result = 0;
int resourceId = mApplicationContent.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = mApplicationContent.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
public static int getActionBarHeight() {
int actionBarHeight = 0;
final TypedValue tv = new TypedValue();
if (mApplicationContent.getTheme()
.resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
actionBarHeight = TypedValue.complexToDimensionPixelSize(
tv.data, mApplicationContent.getResources().getDisplayMetrics());
}
return actionBarHeight;
}
四,日期
/**
* 获取现在时间
*/
public static String getNowDate() {
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA);
Date date = new Date();
return sf.format(date);
}
/**
* 获取后一天
*/
public static String getNextDateTime() {
Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_MONTH, 1);
return new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA).format(c
.getTime());
}
/**
* 获取前一天
*/
public static String getDateOfLastDay() {
Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_MONTH, -1);
return new SimpleDateFormat("yyyy-MM-dd", Locale.CHINA).format(c
.getTime());
}
五,相机的原始使用
protected void createDirs() throws IOException {
if (Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED)) {
File file = new File(Constant.FILEPATH);
if (!file.exists()) {
file.mkdirs();
}
} else {
Toast.makeText(activity, "SD卡不存在,请插入SD卡!", Toast.LENGTH_SHORT)
.show();
}
}
public void useCamera(int requestCode, String name) {
this.requestCode = requestCode;
String status = Environment.getExternalStorageState();
if (status.equals(Environment.MEDIA_MOUNTED)) {
try {
createDirs();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(activity, "创建文件夹失败", Toast.LENGTH_LONG).show();
}
Intent intent = new Intent(
android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File tempFile = new File(Constant.FILEPATH + name);
Uri photoUri = Uri.fromFile(tempFile);
intent.putExtra(ImageColumns.ORIENTATION, 0);
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
activity.startActivityForResult(intent, requestCode);
} else {
Toast.makeText(activity, "没有储存卡", Toast.LENGTH_LONG).show();
}
}
六,ListView图片错乱处理
主要是熟悉settag用法
1,图片错位产生原因:
使用listview或者recycleview时,这两个空间内部的复用机制,再加上异步获取图片。会导致图片显示错位。
图片加载是异步任务,通过网络,访问服务器并拿到图片资源的时间是不定的,并且这个任务不在主线程中执行。
在异步访问网络的过程中,listview或者recycleview可能已经滑动,原先的convertview被复用,且被复用的convertview理应显示另一张图片,但是刚好,之前的异步任务执行完成了,显示在控件上。导致图片错位。
2,解决方法:
给listview或者recycleview的item中显示图片的控件,设置标志,即tag(通常为这个控件应该显示的图片的url地址)
viewHolder.iv_main.setTag(imgUrl);
从网络获取完图片后,需要判断,此时这个控件身上的标志(imgUrl),是否与从网络上获取的图片的地址一样???
一样,才显示到控件上!!!
public void onLoadingComplete(String imageUrl, View view, Bitmap bitmap) {
if (viewHolder.iv_main.getTag() != null && imageUrl.equals(viewHolder.iv_main.getTag())) {
bitmap = CommonUtils.scallXinDianBitmap(bitmap);
viewHolder.iv_main.setImageBitmap(bitmap);
}
}
网友评论