android 一些工具类汇总
一Paint,Canvas
publicclassdrawViewextendsView{ privatePaintpaint1; publicdrawView(Contextcontext,AttributeSetset){ super(context,set); } publicvoidonDraw(Canvascanvas){ super.onDraw(canvas); //new一个画笔对象 paint1=newPaint(); 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界面的更新 */ privatevoidasyncImageLoad(ImageViewimageView,Stringpath){ AsyncImageTaskasyncImageTask=newAsyncImageTask(imageView); asyncImageTask.execute(path); } privatefinalclassAsyncImageTaskextendsAsyncTask<String,Integer,Uri>{ privateImageViewimageView; publicAsyncImageTask(ImageViewimageView){ this.imageView=imageView; } protectedUridoInBackground(String...params){//子线程中执行的 try{ Uriuu=ContactService.getImage(params[0],cache);//将URI路径抛给主线程 System.out.println(uu+"zuuuuuuuu"); returnuu; }catch(Exceptione){ e.printStackTrace(); } returnnull; } protectedvoidonPostExecute(Uriresult){//运行在主线程,获取URI路径,进行图片更新 Log.i("Test",result+""); if(result!=null&&imageView!=null) imageView.setImageURI(result);//setImageURI这个方法会根据路径加载图片 } }
三截取字符串
//截取字符串从0到第一个"/"字符 Stringname=result.substring(0,result.indexOf("/")); //截取字符串从第一个字符“/”到最后一个“/”字符 Stringname=result.substring(result.indexOf("/")+1,result.lastIndexOf("/")));
四MD5广泛用于加密
importjava.security.MessageDigest; importjava.security.NoSuchAlgorithmException; publicclassMD5{ publicstaticStringgetMD5(Stringcontent){ try{ MessageDigestdigest=MessageDigest.getInstance("MD5"); digest.update(content.getBytes()); returngetHashString(digest); }catch(NoSuchAlgorithmExceptione){ e.printStackTrace(); } returnnull; } privatestaticStringgetHashString(MessageDigestdigest){ StringBuilderbuilder=newStringBuilder(); for(byteb:digest.digest()){ builder.append(Integer.toHexString((b>>4)&0xf)); builder.append(Integer.toHexString(b&0xf)); } returnbuilder.toString(); } }
五读取流中的字节:
importjava.io.ByteArrayOutputStream; importjava.io.InputStream; publicclassStreamTool{ /** *读取流中的数据 *@paraminStream *@return *@throwsException */ publicstaticbyte[]read(InputStreaminStream)throwsException{ ByteArrayOutputStreamoutStream=newByteArrayOutputStream(); byte[]buffer=newbyte[1024]; intlen=0; while((len=inStream.read(buffer))!=-1){ outStream.write(buffer,0,len); } inStream.close(); returnoutStream.toByteArray(); } }
六解析服务器传过来的xml数据流
/* *得到解析xml后的Contactlist集合 */ publicstaticList<Contact>getContacts()throwsException{ Stringpath=StringTools.getURL_list_xml; URLurl=newURL(path); //URLConnection与HttPURLConnection都是抽象类,无法直接实例化对象。 //其对象主要通过URL的openconnection方法获得。 //利用HttpURLConnection对象从网络中获取网页数据 HttpURLConnectioncon=(HttpURLConnection)url.openConnection(); con.setReadTimeout(5000); con.setRequestMethod("GET"); if(con.getResponseCode()==200){//http协议,里面有相应状态码的解释, //这里如楼上所说是判断是否正常响应请求数据. returnparseXML(con.getInputStream());//FFF //returnStreamTool.read(con.getInputStream()); } returnnull; }
其中 parseXML(con.getInputStream());
/* *解析XMl */ privatestaticList<Contact>parseXML(InputStreamxml)throwsException{ List<Contact>contacts=newArrayList<Contact>(); Contactcontact=null; XmlPullParserpullParser=Xml.newPullParser(); pullParser.setInput(xml,"UTF-8"); intevent=pullParser.getEventType(); while(event!=XmlPullParser.END_DOCUMENT){ switch(event){ caseXmlPullParser.START_TAG: if("contact".equals(pullParser.getName())){ contact=newContact(); contact.id=newInteger(pullParser.getAttributeValue(0)); }elseif("name".equals(pullParser.getName())){ contact.name=pullParser.nextText();//.nextText不是.getText!!!! }elseif("image".equals(pullParser.getName())){ contact.imageUrl=pullParser.getAttributeValue(0);//FFF } break; caseXmlPullParser.END_TAG: if("contact".equals(pullParser.getName())){ contacts.add(contact); contact=null; } break; } event=pullParser.next(); } returncontacts; }
七解析服务器传过来的Json数据:
/* *解析Json数据 */ privatestaticList<SecondActivity_Goods_Bean>parseJson(InputStreaminputStream)throwsException{ List<SecondActivity_Goods_Bean>SecondActivity_Goods_Beans=newArrayList<SecondActivity_Goods_Bean>(); SecondActivity_Goods_BeangoodBean=null; byte[]data=StreamTool.read(inputStream); Stringjson=newString(data); JSONArrayarray=newJSONArray(json); for(inti=0;i<array.length();i++){ JSONObjectjsonObject=array.getJSONObject(i); jsonObject.getString("imageUrl"); jsonObject.getString("imageContent"); jsonObject.getString("goodsPrice"); goodBean=newSecondActivity_Goods_Bean(jsonObject.getString("imageUrl"), jsonObject.getString("imageContent"), jsonObject.getString("goodsPrice")); SecondActivity_Goods_Beans.add(goodBean); } returnnull; }
八向服务器提交数据:
privatestaticStringsendPostRequest(Stringpath,Map<String,String>parame,Stringencoding) throwsException{ //StringBuilder来组合成这段数据发给服务器telephone_number=telephone_number&password=password StringBuilderdata=newStringBuilder(); 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的字节码 HttpURLConnectionconn=(HttpURLConnection)newURL(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请求的头字段 OutputStreamoutStream=conn.getOutputStream();//得到数据输出流 outStream.write(entity);//将数据写给http输出流缓冲区 if(conn.getResponseCode()==200){//的android客户端向服务器请求请求码时数据输出流的缓冲区才把数据写给服务器 //Strings=conn.getResponseMessage();//这个方法得到字符串“OK” /* *得到服务器返回的数据!!!得到服务器的返回值就可以判断数据是否上传成功 */ byte[]stringData=StreamTool.read(conn.getInputStream()); StringstringFlag=newString(stringData,"UTF-8"); returnstringFlag;//数据发送成功返回true } return"Submit_Fail"; }
九SharedPreferences
publicclassSharedPreferences_Service{ privateContextcontext; privateSharedPreferencessp; publicSharedPreferences_Service(ContextapplicationCon){ this.context=applicationCon; } /** *将文件存储在FileExplorer的data/data/相应的包名/Rsgistered_form.xml下导出该文件 *@paramname *@paramtelephone_number *@parampassword */ publicvoidSetParament(Stringname,Stringtelephone_number,Stringpassword){ sp=context.getSharedPreferences("Rsgistered_form",context.MODE_APPEND); Editoret=sp.edit(); et.putString("name",name); et.putString("telephone_number",telephone_number); et.putString("password",password); et.commit(); } /** *在文件夹FileExplorer的data/data/相应的Rsgistered_form.xml下取数据 *@return */ publicMap<String,String>GetParament(){ Map<String,String>parmes=newHashMap<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","")); returnparmes; } }
十<!--设置圆角半径--><!--渐变-->
<?xmlversion="1.0"encoding="utf-8"?> <shapexmlns: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
<?xmlversion="1.0"encoding="utf-8"?> <selectorxmlns:android="http://schemas.android.com/apk/res/android"> <itemandroid:drawable="@drawable/button_pressed_bg"android:state_pressed="true"></item> <itemandroid:drawable="@drawable/shape_image"></item> </selector>
定义一个有四个角弧度的长方形背景
<?xmlversion="1.0"encoding="utf-8"?> <shapexmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <!--指定4個角的弧度--> <cornersandroid:topLeftRadius="2px" android:topRightRadius="2px" android:bottomLeftRadius="2px" android:bottomRightRadius="2px"/> <!--指定背景顏色--> <solidandroid:color="#FFFFFF"/> <!--指定框條的顏色的寬度--> <strokeandroid:width="0.5dp"android:color="#7A7A7A"/> </shape>
十一anim文件
//anim文件夹下的 out.xml动画文件
<?xmlversion="1.0"encoding="utf-8"?> <setxmlns: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加载数据库导入手机文件夹下
privateSQLiteDatabaseopenDatabase(Stringdbfile){ try{ if(!(newFile(dbfile).exists())){ //判断数据库文件是否存在,若不存在则执行导入,否则直接打开数据库 InputStreamis=this.context.getResources().openRawResource(R.raw.china_city);//欲导入的数据库 FileOutputStreamfos=newFileOutputStream(dbfile); byte[]buffer=newbyte[BUFFER_SIZE]; intcount=0; while((count=is.read(buffer))>0){ fos.write(buffer,0,count); } fos.close(); is.close(); } returnSQLiteDatabase.openOrCreateDatabase(dbfile,null); }catch(FileNotFoundExceptione){ PLog.e("Filenotfound"); e.printStackTrace(); }catch(IOExceptione){ PLog.e("IOexception"); e.printStackTrace(); } returnnull; }
十三,双击退出应用
publicclassDoubleClickExit{ /** *双击退出检测,阈值2000ms */ publicstaticlonglastClick=0L; privatestaticfinalintTHRESHOLD=2000;//2000ms publicstaticbooleancheck(){ longnow=System.currentTimeMillis(); booleanb=now-lastClick<THRESHOLD; lastClick=now; returnb; } } @Override publicvoidonBackPressed(){ if(!DoubleClickExit.check()){ ToastUtil.showShort(getString(R.string.double_exit)); }else{ finish(); } }
十四EditText一些设置:
//设置点击后软键盘的显示类型,numberDecimal带小数点的数字 android:inputType="numberDecimal" //设置alertDialog中的editView自动弹出软键盘 editView.setOnFocusChangeListener(newView.OnFocusChangeListener(){ @Override publicvoidonFocusChange(Viewv,booleanhasFocus){ 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官方推荐使用的,好处就不多说
publicclassYourDialogFragmentextendsDialogFragment{ publicinterfaceDialogFragmentDataImp{//定义一个与Activity通信的接口,使用该DialogFragment的Activity须实现该接口 voidshowMessage(Stringmessage); } publicstaticYourDialogFragmentnewInstance(Stringmessage){ //创建一个带有参数的Fragment实例 YourDialogFragmentfragment=newYourDialogFragment(); Bundlebundle=newBundle(); bundle.putString("message",message); fragment.setArguments(bundle);//把参数传递给该DialogFragment returnfragment; } @Override publicDialogonCreateDialog(BundlesavedInstanceState){ ViewcustomView=LayoutInflater.from(getActivity()).inflate( R.layout.fragment_edit_bill_dialog,null); //ButterKnife.bind(this,customView); mContext=getActivity(); initView(); returnnewAlertDialog.Builder(getActivity()).setView(customView) .create(); }
使用(在activity或fragment调用):
YourDialogFragmentdialog=newYourDialogFragment(); dialog.show(getFragmentManager(),"loginDialog");