android 一些工具类汇总
作者:曾田生z 发布时间:2023-08-29 11:32:05
标签:android,工具类
一 Paint ,Canvas
public class drawView extends View{
private Paint paint1;
public drawView(Context context,AttributeSet set ){
super(context,set);
}
public void onDraw(Canvas canvas){
super.onDraw(canvas);
//new 一个画笔对象
paint1= new Paint();
canvas.drawColor(Color.TRANSPARENT);
//给画笔设置 属性
paint1.setAntiAlias(true);
paint1.setColor(Color.GRAY);
paint1.setStyle(Paint.Style.FILL);
paint1.setStrokeWidth(3);
//画一个圆
//canvas.drawCircle(arg0, arg1, arg2, arg3);
canvas.drawCircle(10, 10, 5, paint1);
}
}
二 AsyncImageTask
/*
* //默认开启的线程数为128条如果超过128条会放进队列进行排队
//继承AsyncTask时指定三个参数第一个为要传入的参数类型 第二个为进度的参数类型 第三个为返回结果的参数类型
//当调用execute时首先执行preExecute然后在执行去启用线程池的execute
//这时会启动子线程去执行doinbackground--执行完后AsyncTask内部会有Handler将结果返回到UI线程中
//也就是onPostExecute的这个方法然后在进行UI界面的更新
*/
private void asyncImageLoad(ImageView imageView, String path) {
AsyncImageTask asyncImageTask = new AsyncImageTask(imageView);
asyncImageTask.execute(path);
}
private final class AsyncImageTask extends AsyncTask<String, Integer, Uri>{
private ImageView imageView;
public AsyncImageTask(ImageView imageView) {
this.imageView = imageView;
}
protected Uri doInBackground(String... params) {//子线程中执行的
try {
Uri uu = ContactService.getImage(params[0], cache);//将URI路径抛给主线程
System.out.println(uu+" zuuuuuuuu");
return uu;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(Uri result) {//运行在主线程,获取 URI 路径 ,进行图片更新
Log.i("Test", result+"");
if(result!=null && imageView!= null)
imageView.setImageURI(result);//setImageURI这个方法会根据路径加载图片
}
}
三 截取字符串
//截取字符串 从 0 到 第一个 "/" 字符
String name = result.substring(0,result.indexOf("/"));
//截取字符串 从 第一个 字符 “/” 到 最后一个 “/” 字符
String name = result.substring(result.indexOf("/")+1, result.lastIndexOf("/")));
四 MD5广泛用于加密
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5 {
public static String getMD5(String content) {
try {
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.update(content.getBytes());
return getHashString(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
private static String getHashString(MessageDigest digest) {
StringBuilder builder = new StringBuilder();
for (byte b : digest.digest()) {
builder.append(Integer.toHexString((b >> 4) & 0xf));
builder.append(Integer.toHexString(b & 0xf));
}
return builder.toString();
}
}
五 读取流中的字节:
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
public class StreamTool {
/**
* 读取流中的数据
* @param inStream
* @return
* @throws Exception
*/
public static byte[] read(InputStream inStream) throws Exception{
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while( (len = inStream.read(buffer)) != -1){
outStream.write(buffer, 0, len);
}
inStream.close();
return outStream.toByteArray();
}
}
六 解析服务器传过来的 xml 数据流
/*
* 得到解析 xml 后 的 Contact list 集合
*/
public static List<Contact> getContacts() throws Exception {
String path = StringTools.getURL_list_xml;
URL url = new URL(path);
//URLConnection与HttPURLConnection都是抽象类,无法直接实例化对象。
//其对象主要通过URL的openconnection方法获得。
//利用HttpURLConnection对象从网络中获取网页数据
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setReadTimeout(5000);
con.setRequestMethod("GET");
if(con.getResponseCode() == 200){ //http协议,里面有相应状态码的解释,
//这里如楼上所说是判断是否正常响应请求数据.
return parseXML(con.getInputStream()); //FFF
//return StreamTool.read(con.getInputStream());
}
return null;
}
其中 parseXML(con.getInputStream());
/*
* 解析XMl
*/
private static List<Contact> parseXML(InputStream xml) throws Exception {
List<Contact> contacts = new ArrayList<Contact>();
Contact contact = null;
XmlPullParser pullParser = Xml.newPullParser();
pullParser.setInput(xml,"UTF-8");
int event = pullParser.getEventType();
while(event != XmlPullParser.END_DOCUMENT){
switch (event) {
case XmlPullParser.START_TAG :
if("contact".equals(pullParser.getName())){
contact = new Contact();
contact.id = new Integer(pullParser.getAttributeValue(0));
}else if("name".equals(pullParser.getName())){
contact.name = pullParser.nextText();// .nextText 不是 .getText !!!!
}else if("image".equals(pullParser.getName())){
contact.imageUrl = pullParser.getAttributeValue(0);//FFF
}
break;
case XmlPullParser.END_TAG :
if("contact".equals(pullParser.getName())){
contacts.add(contact);
contact = null;
}
break;
}
event = pullParser.next();
}
return contacts;
}
七 解析 服务器传过来的 Json 数据:
/*
* 解析 Json 数据
*/
private static List<SecondActivity_Goods_Bean> parseJson(InputStream inputStream) throws Exception {
List<SecondActivity_Goods_Bean> SecondActivity_Goods_Beans = new ArrayList<SecondActivity_Goods_Bean>();
SecondActivity_Goods_Bean goodBean = null;
byte[] data = StreamTool.read(inputStream);
String json = new String(data);
JSONArray array = new JSONArray(json);
for(int i=0;i<array.length();i++){
JSONObject jsonObject = array.getJSONObject(i);
jsonObject.getString("imageUrl");
jsonObject.getString("imageContent");
jsonObject.getString("goodsPrice");
goodBean = new SecondActivity_Goods_Bean(jsonObject.getString("imageUrl"),
jsonObject.getString("imageContent"),
jsonObject.getString("goodsPrice"));
SecondActivity_Goods_Beans.add(goodBean);
}
return null;
}
八 向服务器提交数据:
private static String sendPostRequest(String path,Map<String, String> parame, String encoding)
throws Exception {
//StringBuilder 来组合成这段数据 发给服务器 telephone_number=telephone_number&password=password
StringBuilder data = new StringBuilder();
if(parame != null && !parame.isEmpty()){
for(Map.Entry<String, String> entry:parame.entrySet()){
data.append(entry.getKey()).append("=");
data.append(URLEncoder.encode(entry.getValue(), encoding));
data.append("&");
}
data.deleteCharAt(data.length() -1);//最后会多出 “&”
}
byte[] entity = data.toString().getBytes();//默认得到UTF-8的字节码
HttpURLConnection conn = (HttpURLConnection) new URL(path).openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("POST"); //采用 POST 向服务器发送请求
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");//设置Post请求的 头字段
conn.setRequestProperty("Content-Length", String.valueOf(entity.length));//设置Post请求的 头字段
OutputStream outStream = conn.getOutputStream();//得到数据输出流
outStream.write(entity);//将数据写给 http输出流缓冲区
if(conn.getResponseCode() == 200){ //的android客户端向服务器请求 请求码 时 数据输出流的缓冲区才把数据写给服务器
//String s = conn.getResponseMessage();//这个方法得到字符串 “OK”
/*
* 得到服务器返回的数据!!! 得到服务器的返回值就可以判断数据是否上传成功
*/
byte[] stringData = StreamTool.read(conn.getInputStream());
String stringFlag = new String(stringData,"UTF-8");
return stringFlag; // 数据发送成功 返回 true
}
return "Submit_Fail";
}
九 SharedPreferences
public class SharedPreferences_Service {
private Context context;
private SharedPreferences sp;
public SharedPreferences_Service(Context applicationCon){
this.context = applicationCon;
}
/**
* 将 文件存储在 File Explorer的data/data/相应的包名/Rsgistered_form.xml 下导出该文件
* @param name
* @param telephone_number
* @param password
*/
public void SetParament(String name,String telephone_number,String password){
sp = context.getSharedPreferences("Rsgistered_form", context.MODE_APPEND);
Editor et = sp.edit();
et.putString("name", name);
et.putString("telephone_number",telephone_number);
et.putString("password",password);
et.commit();
}
/**
* 在文件夹 File Explorer的data/data/相应的 Rsgistered_form.xml下取数据
* @return
*/
public Map<String, String> GetParament(){
Map<String, String> parmes = new HashMap<String, String>();
sp = context.getSharedPreferences("Rsgistered_form", context.MODE_APPEND);
parmes.put("name", sp.getString("name", ""));//获得name字段,参数为空就返回空
parmes.put("telephone_number", sp.getString("telephone_number", ""));
parmes.put("password", sp.getString("password", ""));
return parmes;
}
}
十 <!-- 设置圆角半径 --><!-- 渐变 -->
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<!-- 圆角 -->
<corners
android:radius="9dp"
android:topLeftRadius="2dp"
android:topRightRadius="2dp"
android:bottomLeftRadius="2dp"
android:bottomRightRadius="2dp"/>
<!-- 设置圆角半径 --><!-- 渐变 -->
<gradient
android:startColor="@android:color/white"
android:centerColor="@android:color/black"
android:endColor="@android:color/black"
android:useLevel="true"
android:angle="45"
android:type="radial"
android:centerX="0"
android:centerY="0"
android:gradientRadius="90"/>
<!-- 间隔 -->
<padding
android:left="2dp"
android:top="2dp"
android:right="2dp"
android:bottom="2dp"/>
<!-- 各方向的间隔 --><!-- 大小 -->
<size
android:width="50dp"
android:height="50dp"/>
<!-- 宽度和高度 --><!-- 填充 -->
<solid
android:color="@android:color/white"/>
<!-- 填充的颜色 --><!-- 描边 -->
<stroke
android:width="2dp"
android:color="@android:color/black"
android:dashWidth="1dp"
android:dashGap="2dp"/>
</shape>
也可以在 drawable 文件夹下 在定义个 xxx.xml 使用 selector
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/button_pressed_bg" android:state_pressed="true"></item>
<item android:drawable="@drawable/shape_image"></item>
</selector>
定义一个有四个角弧度的 长方形背景
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle" >
<!-- 指定4個角的弧度 -->
<corners android:topLeftRadius="2px"
android:topRightRadius="2px"
android:bottomLeftRadius="2px"
android:bottomRightRadius="2px"/>
<!-- 指定背景顏色 -->
<solid android:color="#FFFFFF"/>
<!-- 指定框條的顏色的寬度 -->
<stroke android:width="0.5dp" android:color="#7A7A7A"/>
</shape>
十一 anim文件
// anim 文件夹下 的 out.xml 动画文件
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false">
<!-- 100%p 的 p 是指从父类view 的 指定位置 0 到 起始位 100%-->
<!-- 位移 -->
<translate
android:fromXDelta="0%p"
android:toXDelta="100%p"
android:duration="1000"
/>
<!-- 透明度 -->
<alpha
android:fromAlpha="1.0"
android:toAlpha="0.5"
android:duration="500"
/>
</set>
十二 ,将 Raw 加载数据库 导入 手机文件夹下
private SQLiteDatabase openDatabase(String dbfile) {
try {
if (!(new File(dbfile).exists())) {
//判断数据库文件是否存在,若不存在则执行导入,否则直接打开数据库
InputStream is = this.context.getResources().openRawResource(R.raw.china_city); //欲导入的数据库
FileOutputStream fos = new FileOutputStream(dbfile);
byte[] buffer = new byte[BUFFER_SIZE];
int count = 0;
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.close();
is.close();
}
return SQLiteDatabase.openOrCreateDatabase(dbfile, null);
} catch (FileNotFoundException e) {
PLog.e("File not found");
e.printStackTrace();
} catch (IOException e) {
PLog.e("IO exception");
e.printStackTrace();
}
return null;
}
十三 , 双击退出应用
public class DoubleClickExit {
/**
* 双击退出检测, 阈值 2000ms
*/
public static long lastClick = 0L;
private static final int THRESHOLD = 2000;// 2000ms
public static boolean check() {
long now = System.currentTimeMillis();
boolean b = now - lastClick < THRESHOLD;
lastClick = now;
return b;
}
}
@Override
public void onBackPressed() {
if (!DoubleClickExit.check()) {
ToastUtil.showShort(getString(R.string.double_exit));
} else {
finish();
}
}
十四 EditText 一些设置:
//设置点击后 软键盘的 显示类型 ,numberDecimal带小数点的数字
android:inputType="numberDecimal"
// 设置alertDialog中的 editView 自动弹出软键盘
editView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
// 设置 弹出软键盘
alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
}
});
十五 Calendar
mCalendar= Calendar.getInstance();//获取当前日期
int_YEAR = mCalendar.get(Calendar.YEAR);
int_MONTH = mCalendar.get(Calendar.MONTH);
int_DAT = mCalendar.get(Calendar.DAY_OF_MONTH);
int_lastday=mCalendar.getActualMaximum(Calendar.DAY_OF_MONTH);
int_week = mCalendar.get(Calendar.DAY_OF_WEEK);
十六 DialogFragment ,DialogFragment官方推荐使用的,好处就不多说
public class YourDialogFragment extends DialogFragment {
public interface DialogFragmentDataImp{//定义一个与Activity通信的接口,使用该DialogFragment的Activity须实现该接口
void showMessage(String message);
}
public static YourDialogFragment newInstance(String message){
//创建一个带有参数的Fragment实例
YourDialogFragment fragment = new YourDialogFragment ();
Bundle bundle = new Bundle();
bundle.putString("message", message);
fragment.setArguments(bundle);//把参数传递给该DialogFragment
return fragment;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
View customView = LayoutInflater.from(getActivity()).inflate(
R.layout.fragment_edit_bill_dialog, null);
//ButterKnife.bind(this,customView);
mContext = getActivity();
initView();
return new AlertDialog.Builder(getActivity()).setView(customView)
.create();
}
使用(在 activity 或 fragment 调用):
YourDialogFragment dialog = new YourDialogFragment();
dialog.show(getFragmentManager(), "loginDialog");
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 最近有小伙伴问我mybatis有没有自动创建表结构的功能,因为他们之前一直使用hibernate用习惯了,理所当然的认为,在实体类上配置 *
- 在《Android Handler之消息循环的深入解析》中谈到了Handler是用于操作线程内部的消息队列,所以Handler可以用来线程间
- 本文实例为大家分享了AsyncTask异步类实现网页内容放大缩小的详细代码,供大家参考,具体内容如下WebActivity.java:pac
- 目录1、在java中,无论在何处调用,使用静态属性必须以类名做前缀。2、若有定义语句: int a=10 ; double b=3.14 ;
- 登录注册小代码,将学过的一些小知识融合在一起进行了使用,加深印象。本例中如果有注释不详细的地方,详见其它博客。功能介绍:简单的登录注册系统,
- 本文实例讲述了Android编程实现下载时主界面与详细界面一致更新的方法。分享给大家供大家参考,具体如下:1、创建监听管理类public c
- 今天在码代码的时候突然想到这个问题,觉得有点困惑。在网上也翻阅不少帖子其中有一个帖子给了我一个思路,其实也是解释了基础概念。概念一:try
- 本文实例讲述了Android仿微信语音聊天功能代码。分享给大家供大家参考。具体如下:项目效果如下:具体代码如下:AudioManager.j
- 1) 要及时回收Bitmap的内存Bitmap类有一个方法recycle(),从方法名可以看出意思是回收。这里就有疑问了,Android系统
- Java中数组初始化和OC其实是一样的,分为动态初始化和静态初始化,动态初始化:指定长度,由系统给出初始化值静态初始化:给出初始化值,由系统
- 前言在JDK当中给我们提供的各种并发工具当中,比如ReentrantLock等等工具的内部实现,经常会使用到一个工具,这个工具就是LockS
- 通过下面代码在构造函数中调用方法 SetShadow();即可实现无边框窗体的阴影效果了需要添加命名空间 using System.Runt
- 系统原来用的是BOSCH_BMA222的gsensor, 现在要求换成使用MMA7660,我们来看一下怎样增加驱动和调试过程。 1. 修改M
- 前言本文主要讲述如何在同一个窗体内,实现不同功能模块的页面切换。一、准备工作1.搭建一个简单的mvvm项目结构首先搭建一个简单的项目框架,然
- 工厂模式在Java应用程序中对象无处不在,这些对象都需要进行创建,如果创建的时候直接new对象,那么如果我们要更换对象,所有new对象的地方
- Spring简介和配置学习目标【应用】能够独立完成springIOC的快速入门【应用】能够掌握spring的bean标签的配置【应用】能够独
- 起因最近在写CRUD的时候,发现有个分页的VO写的健壮性比较差,一时手痒改了一下,没想到改了之后好几个功能都出现了问题。原VO关键代码如下:
- 一、序言Java多线程编程线程池被广泛使用,甚至成为了标配。线程池本质是池化技术的应用,和连接池类似,创建连接与关闭连接属于耗时操作,创建线
- 本文实例为大家分享了C# Winform实现进度条显示的具体代码,供大家参考,具体内容如下创建一个窗体,命名为StartForm添加一个ti
- Spring 使用Junit单元测试并配置数据源一、问题描述由于公司项目中的数据源是配置在Tomcat中的server.xml中的,所以在使