Android有用的代码片段

 有时候,需要一些小的功能,找到以后,就把它贴到了博客下面,作为留言,查找起来很不方便,所以就整理一下,方便自己和他人。


         一、  获取系统版本号:

[java]  view plain copy
  1. PackageInfo info = this.getPackageManager().getPackageInfo(this.getPackageName(), 0);  
  2. int versionCode=nfo.versionCode  
  3. string versionName=info.versionNam  

       二、获取系统信息:

[java]  view plain copy
  1. <span style="font-size:16px;">String archiveFilePath="sdcard/download/Law.apk";//安装包路径  
  2. PackageManager pm = getPackageManager();   
  3. PackageInfo info = pm.getPackageArchiveInfo(archiveFilePath, PackageManager.GET_ACTIVITIES);   
  4. if(info != null){   
  5. ApplicationInfo appInfo = info.applicationInfo;   
  6. String appName = pm.getApplicationLabel(appInfo).toString();   
  7. String packageName = appInfo.packageName; //得到安装包名称  
  8. String version=info.versionName; //得到版本信息   
  9. Toast.makeText(test4.this"packageName:"+packageName+";version:"+version, Toast.LENGTH_LONG).show();  
  10. Drawable icon = pm.getApplicationIcon(appInfo);//得到图标信息  
  11. TextView tv = (TextView)findViewById(R.id.tv); //显示图标  
  12. tv.setBackgroundDrawable(icon);</span>  

        三、获取安装路径和已安装程序列表

[java]  view plain copy
  1. <span style="font-size:16px;">(1)android中获取当前程序路径  
  2. getApplicationContext().getFilesDir().getAbsolutePath()  
  3. (2)android取已安装的程序列表  
  4. List<PackageInfo> packageInfoList = getPackageManager().getInstalledPackages(0);</span>  

       四、获取图片、应用名、包名

[java]  view plain copy
  1. <span style="font-size:16px;">PackageManager pManager = MessageSendActivity.this.getPackageManager();   
  2. List<PackageInfo> appList = Utils.getAllApps(MessageSendActivity.this);   
  3.      for(int i=0;i<appList.size();i++) {   
  4.          PackageInfo pinfo = appList.get(i);   
  5.          ShareItemInfo shareItem = new ShareItemInfo();   
  6.          //set Icon   
  7.          shareItem.setIcon(pManager.getApplicationIcon(pinfo.applicationInfo));   
  8.          //set Application Name shareItem.setLabel(pManager.getApplicationLabel(pinfo.applicationInfo).toString());   
  9.         //set Package Name shareItem.setPackageName(pinfo.applicationInfo.packageName);   
  10. }</span>  

         五、解决listview上 Item上有按钮时 item本身不能点击的问题:

[java]  view plain copy
  1. <span style="font-size:16px;">1. 在item试图上面添加代码: android:descendantFocusability="blocksDescendants"  
  2. 2.在listview里 添加代码 android:focusable="true"</span>  

         六、不让文本框输入中文:

在xml文件里面

[html]  view plain copy
  1. <span style="font-size: 16px; ">android:digits="1234567890qwertyuiopasdfghjklzxcvbnm`-=[]\;,./~!@#$%^*()_+}{:?&<>"'"  
  2. 这样就不会输入中文了。  
  3. </span>  
        

         七、获取屏幕宽高

[java]  view plain copy
  1. <span style="font-size:16px;">DisplayMetrics displayMetrics = new DisplayMetrics();   
  2. this.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);   
  3. int height = displayMetrics.heightPixels;   
  4. int width = displayMetrics.widthPixels;  
  5. </span>  

         八、将TabWidget显示在屏幕下方

[java]  view plain copy
  1. <span style="font-size:16px;">设置TabWidget的属性 android:layout_alignParentBottom="true"</span>  
为了让tabHost显示在下方,要将RadioGroup的layout_gravity设置为bottom,再将FrameLayout的 layout_weight设置为1,这样就可以将RadioGroup撑到最下方。style="@style/main_tab_bottom"里面定义了样式文件      

         九、获取线程ID和线程名称:

[java]  view plain copy
  1. <span style="font-size:16px;">Log.v("@@@@@@@@@@",Thread.currentThread().getId()+" "+Thread.currentThread().getName());  
  2. </span>  

        十、android中调用其它android应用

[java]  view plain copy
  1. <span style="font-size:16px;">ComponentName comp = new ComponentName("com.Test","com.login.Main");   
  2.  intent = new Intent();   
  3.  intent.setComponent(comp);   
  4.  intent.setAction("android.intent.action.VIEW");   
  5.  startActivity(intent);  
  6. </span>  

         十一、禁止软键盘弹出

EditText有焦点(focusable为true)阻止输入法弹出 editText.setInputType(InputType.TYPE_NULL); // 关闭软键盘 当EidtText无焦点(focusable=false)时阻止输入法弹出 

[java]  view plain copy
  1. <span style="font-size: 16px; ">  
  2. InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);   
  3. imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);  
  4. </span>  
【Android】EditText标签调用键盘
在xml文件中EditText标签有一个属性android:editable="false"和android:numeric="integer"

android:numeric="integer"表示只允许输入数字,此属性可以限制用户只能输入数字内容。
android:editable表示是否可以输入内容TRUE表示可以输入,false表示不允许输入内容;
当为android:editable="false"时,点击输入框,虚拟键盘是显示不出来的,不过当设置了 android:editable=""属性时,不管是false还是true,在其后加入android:numeric="integer"属性时,是可以输入数字内容了;这里没搞明白是怎么回事,也许是numeric把前面的属性覆盖掉了。
当android:editable="false"时,在java类里如果再规定EditText.setEnabled(true)时,虚拟键盘还是不会显示的。

       十二、模拟器的各种规格与分辨率对照:

[html]  view plain copy
  1. 单位:像素   
  2. WVGA854: 854*480  
  3. WVGA800: 800*480  
  4. HVGA: 480*320   
  5. QVGA: 320*240  
  6. WQVGA432:432*240   
  7. WQVGA400:400*240   
    

     十三、调用Android其他Context的Activity

[java]  view plain copy
  1. Context c = createPackageContext("chroya.demo", Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);  
  2. //载入这个类  
  3. Class clazz = c.getClassLoader().loadClass("chroya.demo.Main");  
  4. //新建一个实例  
  5. Object owner = clazz.newInstance();  
  6. //获取print方法,传入参数并执行  
  7. Object obj = clazz.getMethod("print", String.class).invoke(owner, "Hello");  
这个方法有两个参数:
1、packageName  包名,要得到Context的包名
2、 flags  标志位,有CONTEXT_INCLUDE_CODE和CONTEXT_IGNORE_SECURITY两个选项。 CONTEXT_INCLUDE_CODE的意思是包括代码,也就是说可以执行这个包里面的代码。CONTEXT_IGNORE_SECURITY的意思 是忽略安全警告,如果不加这个标志的话,有些功能是用不了的,会出现安全警告。
 

      十四、android4.0Dialog风格小技巧

4.0上如果还用Theme.Dialog,只能说很土,跟整体UI风格差别很大

请使用android:theme="@android:style/Theme.Holo.DialogWhenLarge"


   

        十五、程序中安装apk

     
[java]  view plain copy
  1. Intent intent = new Intent();             
  2.        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  3.     intent.setAction(android.content.Intent.ACTION_VIEW);  
  4.     intent.setDataAndType(Uri.fromFile(“APK”),"application/vnd.android.package-archive");  
  5.     startActivity(intent);  

其中“apk”为你要安装的那个文件。

         十六、获取设备型号、SDK版本及系统版本

[java]  view plain copy
  1. String device_model = Build.MODEL; // 设备型号    
  2. String version_sdk = Build.VERSION.SDK; // 设备SDK版本    
  3. String version_release = Build.VERSION.RELEASE; // 设备的系统版本    

       十七、图片分析功能

[java]  view plain copy
  1. public void SharePhoto(String photoUri,final Activity activity) {    
  2.     Intent shareIntent = new Intent(Intent.ACTION_SEND);    
  3.     File file = new File(photoUri);    
  4.     shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));    
  5.     shareIntent.setType("image/jpeg");    
  6.     StartActivity(Intent.createChooser(shareIntent, activity.getTitle()));    
  7. }    

         十八、linux关机命令

在Windows下,按着电源键4秒强制关机,在Linux下强烈不建议这么做。Windows由于是单用户、“假多”任务的情况,所以即使你的计算机关机,也不会对别人造成影响。不过在Linux中,由于每个程序都是在后台执行的,因此,在你看不到的屏幕背后可能有很多人同时在你的主机上工作。而且,若不正常关机可能会造成文件系统的损毁。所以,正常情况下,要关机时需要注意下面几件事情:

(1)查看系统的使用状态。

要看目前有谁在线,可以用who命令。要看网络的联机状态,可以用netstat-a命令。要看后台执行那个的程序可以执行ps-aux命令。

(2)通知在线用户的关机时刻

这个时候可以使用shutdown命令

[java]  view plain copy
  1. Shutdown命令:  
  2. 语法:shutdown[-t秒][-arkhncfF]时间 警告消息  
  3. -t:后面加描述表示过几秒之后关机。  
  4. -k:不是真的关机,仅仅发出警告消息。  
  5. -r:将系统服务停掉之后重启。  
  6. -h:将系统服务停掉之后立即关机。  
  7. -f:关机并开机之后,强制跳过fsck的磁盘检查。  
  8. -F:系统重启之后,强制进行fsck的磁盘检查。  
  9. -c:取消已经进行的shutdown命令内容。  
  10.   
  11. 另外,重启关机命令有reboot、halt、poweroff。其实在默认情况下,都完成一样的工作。  
  12. halt先调用shutdown,而shutdown最后调用halt。不过,shutdown可以根据目前已经启动的服务来逐次关闭服务后才关机;而halt能够在不理会目前系统情况下,进行硬件关机的特殊功能。  
  13.   
  14. 除了这些,还有一个关机命令是init 0  
  15. init是切换执行等级的命令。Linux共有7种执行等级,比较重要的是下面4种等级:  
  16. run level 0:关机  
  17. run level 3:纯命令行模式  
  18. run level 5:含有图形界面模式  
  19. run level 6:重启  

      十九、让自己的应用不被kill掉

可以在frameworks\base\services\java\com\android\server\am\ActivityManagerService.java这个类的forceStopPackage中加一个条件:
[java]  view plain copy
  1. public void forceStopPackage(final String packageName) {  
  2.         if (checkCallingPermission(android.Manifest.permission.FORCE_STOP_PACKAGES)  
  3.                 != PackageManager.PERMISSION_GRANTED) {  
  4.             String msg = "Permission Denial: forceStopPackage() from pid="  
  5.                     + Binder.getCallingPid()  
  6.                     + ", uid=" + Binder.getCallingUid()  
  7.                     + " requires " + android.Manifest.permission.FORCE_STOP_PACKAGES;  
  8.             Slog.w(TAG, msg);  
  9.             throw new SecurityException(msg);  
  10.         }          
  11.         long callingId = Binder.clearCallingIdentity();  
  12.         try {  
  13.             IPackageManager pm = ActivityThread.getPackageManager();  
  14.             int pkgUid = -1;  
  15.             synchronized(this) {  
  16.                 try {  
  17.                     pkgUid = pm.getPackageUid(packageName);  
  18.                 } catch (RemoteException e) {  
  19.                 }  
  20.                 if (pkgUid == -1) {  
  21.                     Slog.w(TAG, "Invalid packageName: " + packageName);  
  22.                     return;  
  23.                 }  
  24.                 //begin:加入一个判断条件  
  25.                 if (packageName.equals("你的进程名")) {  
  26.                     return;  
  27.                 }  
  28.                 //end: 加入一个判断条件                                forceStopPackageLocked(packageName, pkgUid);  
  29.             }  
  30.         } finally {  
  31.             Binder.restoreCallingIdentity(callingId);  
  32.         }  
  33.     }  

这样的话在任务管理器里可以保证KISS不掉的;
还有在这个方法上还有个方法clearApplicationUserData中保证如果是该进程就不让调用forceStopPackage()方法。
另:其他方法:
1,首先在你的service的onDestory方法里面写上启动你自己的代码,为什么要写这个?因为如果用户是在设置->应用程序->正在运行服务这里面杀掉你service的话会调用到onDestory方法的,这里就可以启动了,
2:监听屏幕关闭广播,屏幕已关闭,就启动服务。
3:监听屏幕解锁广播,一样的道理,这样,基本上,你的service就达到永不停止了。对用户来说有点变态,但很多软件都这样。

     二十、EditText获取焦点

[java]  view plain copy
  1. EditText.requestFoucus()  

二十一、获取手机屏幕分辨率

[java]  view plain copy
  1. DisplayMetrics  dm = new DisplayMereics();  
  2.   
  3.         getWindowManager().getDefaultDisplay().getMetrics(dm);  
  4.   
  5.         float width = dm.widthPixels * dm.density;  
  6.   
  7.         float height = dm.heightPixels * dm.density  
     在这里问什么要乘以  dm.density   了,是因为通过dm.widthPixels的到的结果始终是320,不是真实的屏幕分辨率,所以要乘以dm.density得到真实的分辨率。

     二十二、在Activity里面播放背景音乐

[java]  view plain copy
  1. public void onCreate(Bundle savedInstanceState) {  
  2.              super.onCreate(savedInstanceState);  
  3.              setContentView(R.layout.mainlay);  
  4.              mediaPlayer = MediaPlayer.create(this, R.raw.mu);  
  5.              mediaPlayer.setLooping(true);  
  6.              mediaPlayer.start();  
  7.   
  8.                    }  

      二十三、让程序的界面不随机器的重力感应而翻转

                 第一种方法,在manifast文件里面

[html]  view plain copy
  1. <activity  
  2.   android:screenOrientation="portrait">  
  3.   </activity>  

                  第二种,在代码里面

[java]  view plain copy
  1. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  

    二十四、使activity全屏显示

[java]  view plain copy
  1. requestWindowFeature(Window.FEATURE_NO_TITLE);  
  2.         getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,        
  3.                 WindowManager.LayoutParams. FLAG_FULLSCREEN);  

        二十五、在RelativeLayout中使selector要注意点

         关于selector的使用方法,可以参考http://blog.csdn.net/aomandeshangxiao/article/details/6759576这篇文章,今天,遇到在RelativeLayout中添加background为selector后没有反应的问题,寻摸了很长时间,一直没有找到原因,其实只要加上一句代码就完全可以解决:

[java]  view plain copy
  1. <span style="font-size:16px;">RelativeLayout 里面加上android:clickable="true"</span>  

这样,RelativLayout就会出现在selector里面定义的效果。


   二十六、显示或隐藏虚拟键盘

[java]  view plain copy
  1. 显示:  
  2. InputMethodManager imm = (InputMethodManager)(getSystemService(Context.INPUT_METHOD_SERVICE));  
  3. imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);  
  4.   
  5. 隐藏:  
  6. InputMethodManager imm = (InputMethodManager)(getSystemService(Context.INPUT_METHOD_SERVICE));  
  7. imm.hideSoftInputFromWindow(m_edit.getWindowToken(), 0);  

   二十七、退出程序时清除通知中信息  

[java]  view plain copy
  1. NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);  
  2. nm.cancelAll();  

     二十八、创建快捷方式

[java]  view plain copy
  1. Intent intent=new Intent();  
  2. //设置快捷方式的图标  
  3. intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(this, R.drawable.img));  
  4. //设置快捷方法的名称  
  5. intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "点击启动哥的程序");            //设置点击快键图标的响应操作  
[java]  view plain copy
  1. intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(this,MainActivity.class));  
  2. //传递Intent对象给系统  
  3. setResult(RESULT_OK, intent);  
  4. finish();  

 

   二十九、获取文件中的类名:

[java]  view plain copy
  1. String path = context.getPackageManager().getApplicationInfo(  
  2.                                         context.getPackageName(), 0).sourceDir;  
  3.                         DexFile dexfile = new DexFile(path);  
  4.                         Enumeration<String> entries = dexfile.entries();  
  5.                         while (entries.hasMoreElements()) {  
  6.                                 String name = (String) entries.nextElement();  
  7.                                 ......  
  8.                         }  



三十. TextView中的getTextSize返回值是以像素(px)为单位的,

         而setTextSize()是以sp为单位的.

        所以如果直接用返回的值来设置会出错,解决办法是:

        用setTextSize()的另外一种形式,可以指定单位:

[java]  view plain copy
  1. TypedValue.COMPLEX_UNIT_PX : Pixels    
  2. TypedValue.COMPLEX_UNIT_SP : Scaled Pixels    
  3. TypedValue.COMPLEX_UNIT_DIP : Device Independent Pixels  

三十一. 在继承自View时,绘制bitmap时,需要将图片放到新建的drawable-xdpi

中,否则容易出现绘制大小发生改变


三十二. 在文字中加下划线: textView.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG); 


三十三. scrollView是继承自frameLayout,所以在使用LayoutParams时需要用frameLayout

 

三十四、android阴影字体设置

 

[html]  view plain copy
  1. <TextView  android:id="@+id/tvText1"   
  2.  android:layout_width="wrap_content"   
  3.  android:layout_height="wrap_content"   
  4.  android:text="text1"   
  5.  android:textSize="30sp"   
  6.  android:textStyle="bold"   
  7.  android:textColor="#FFFFFF"   
  8.  android:shadowColor="#ff0000ff"  
  9.  android:shadowDx="5"  
  10.  android:shadowDy="5"       
  11.  android:shadowRadius="10"/>  


 

android:shadowColor 阴影颜色

android:shadowDx 阴影的水平偏移量

android:shadowDy 阴影的垂直偏移量

android:shadowRadius 阴影的范围

 

为了统一风格和代码的复用,通常可以把这个样式抽取放入到style.xml文件中

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <style name="textstyle">         
  4.         <item name="android:shadowColor">#ff0000ff</item>  
  5.         <item name="android:shadowRadius">10</item>  
  6.         <item name="android:shadowDx">5</item>  
  7.         <item name="android:shadowDy">5</item>       
  8.     </style>  
  9. </resources>  
[html]  view plain copy
  1. <TextView  
  2.         style="@style/textstyle"  
  3.         android:layout_width="fill_parent"  
  4.         android:layout_height="wrap_content"  
  5.         android:text="字体样式"  
  6.         android:textSize="30sp"  
  7.         android:textStyle="bold" />  

 

 三十五、android实现手机震动功能

[java]  view plain copy
  1. import android.app.Activity;  
  2. import android.app.Service;  
  3. import android.os.Vibrator;  
  4.   
  5. public class TipHelper {   
  6.     public static void Vibrate(final Activity activity, long milliseconds) {  
  7.         Vibrator vib = (Vibrator) activity.getSystemService(Service.VIBRATOR_SERVICE);  
  8.         vib.vibrate(milliseconds);  
  9.     }  
  10.     public static void Vibrate(final Activity activity, long[] pattern,boolean isRepeat) {  
  11.         Vibrator vib = (Vibrator) activity.getSystemService(Service.VIBRATOR_SERVICE);  
  12.         vib.vibrate(pattern, isRepeat ? 1 : -1);  
  13.     }  
  14. }  


还需要在AndroidManifest.xml 中添加震动权限:

[html]  view plain copy
  1. <uses-permission android:name="android.permission.VIBRATE" />  
通过上面操作,我们可以使用TipHelper所定义的函数了。两个Vibrate函数的参数简单介绍如下:

final Activity activity  :调用该方法的Activity实例

long milliseconds :震动的时长,单位是毫秒

long[] pattern   :自定义震动模式 。数组中数字的含义依次是[静止时长,震动时长,静止时长,震动时长。。。]时长的单位是毫秒

boolean isRepeat : 是否反复震动,如果是true,反复震动,如果是false,只震动一次

三十六、常用的正则表达式

       ^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$    //email地址 
       ^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$  //url
       ^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$ //年-月-日
       ^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$  //月/日/年
       ^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$   //Emil
       ^((\+?[0-9]{2,4}\-[0-9]{3,4}\-)|([0-9]{3,4}\-))?([0-9]{7,8})(\-[0-9]+)?$     //电话号码
       ^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$   //IP地址

       (^\s*)|(\s*$)   // 首尾空格

       ^[a-zA-Z][a-zA-Z0-9_]{4,15}$  // 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线)

       ^[1-9]*[1-9][0-9]*$  //  腾讯QQ号


三十七、输入框不挤压activity布局:

在manifest文件activity下 加:

[html]  view plain copy
  1. android:windowSoftInputMode="adjustPan"  

三十八、listview中item中button可点击:

[html]  view plain copy
  1. android:descendantFocusability="blocksDescendants"  

三十九、获取移动设备的IP地址:

[java]  view plain copy
  1. public class Tools {  
  2.     public static String getLocalIpAddress() {    
  3.         try {    
  4.             for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {    
  5.                 NetworkInterface intf = en.nextElement();    
  6.                 for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {    
  7.                     InetAddress inetAddress = enumIpAddr.nextElement();    
  8.                     if (!inetAddress.isLoopbackAddress()) {    
  9.                         return inetAddress.getHostAddress().toString();    
  10.                     }    
  11.                 }    
  12.             }    
  13.         } catch (SocketException ex) {    
  14.             Log.e("出错啦", ex.toString());    
  15.         }    
  16.         return null;    
  17.     }    
  18. }  
  19. 然后  
  20.         WifiManager wm = (WifiManager)getSystemService(WIFI_SERVICE);  
  21.         WifiInfo wi = wm.getConnectionInfo();  
  22.         System.out.println("IP地址是:"+Tools.getLocalIpAddress());  
  23.         System.out.println("SSID:"+wi.getSSID());  
  24. 最后记得加两个权限  
  25.     <uses-permission android:name="android.permission.INTERNET"/>  
  26.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>  


四十、高仿小米launcher跨屏拖动item(GridView长按item进行拖动

        触发长按事件后浮动原理:

     

[java]  view plain copy
  1. windowParams = new WindowManager.LayoutParams();  
  2.   windowParams.gravity = Gravity.TOP | Gravity.LEFT;  
  3.   windowParams.x = x - itemWidth / 2;  
  4.   windowParams.y = y - itemHeight / 2;  
  5.   windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;  
  6.   windowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;  
  7.   ImageView iv = new ImageView(getContext());  
  8.   iv.setImageBitmap(bm);  
  9.   windowManager = (WindowManager) getContext().getSystemService(  
  10.   Context.WINDOW_SERVICE);// "window"  
  11.   windowManager.addView(iv, windowParams);  
       拖动效果:

[java]  view plain copy
  1. if (dragImageView != null) {  
  2.   windowParams.alpha = 0.6f;  
  3.   windowParams.x = x - itemWidth / 2;  
  4.   windowParams.y = y - itemHeight / 2;  
  5.   windowManager.updateViewLayout(dragImageView, windowParams);  
  6.   }  

  四十一、数据库写入图片信息:

[java]  view plain copy
  1. <span style="font-family:Tahoma, 'Microsoft Yahei', Simsun;color:#444444;">数据库中的字段设置为 binary类型  
  2. Bitmap bitmap = BitmapFactory.decodeFile(path);  
  3. ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  4.                 bitmap.compress(CompressFormat.JPEG, 50, baos);  
  5. String sql = "insert into pic_info(pic_data, pic_name,pic_size,send_date,is_success) " +"values(?,?,?,?,?)";  
  6.                 Object[] args = new Object[]{baos.toByteArray(), name, size, now, isSucess};  
  7. db.insert(sql, args);  
  8. 读取数据库的图片信息:  
  9. byte[] picData = cursor.getBlob(cursor.getColumnIndex("pic_data"));  
  10. bitmap.setImageBitmap(BitmapFactory.decodeByteArray(picData, 0, picData.length));</span>  

       四十二、listView的addView的问题。

         在listView里使用addView()、addFooterView(v)、addHeaderView(v)时,要在setAdepter以前添加,或者在重写的Adapter中添加。因为setAdapter以后,就是listView已经绘制完毕,不能再进行添加。

         四十三、progressBar修改颜色

        有的时候,我们使用progressBar的时候,后面的背景色是白色或者是亮色,使得progressBar效果很不明显,所以,我们可以在下面三条中随意添加一条熟悉就可以了:

[java]  view plain copy
  1. <ProgressBar style="@android:style/Widget.ProgressBar.Inverse"/>  
  2. <ProgressBar style="@android:style/Widget.ProgressBar.Large.Inverse"/>  
  3. <ProgressBar style="@android:style/Widget.ProgressBar.Small.Inverse"/>  

         这是比较简单的,如果要完成复杂效果,需要自定义style了。

       

        四十四、窗口透明(背景模糊等)

       先看下效果图:



第一种效果:

在styles.xml中定义

[html]  view plain copy
  1. <style name="Theme.Translucent" parent="android:style/Theme.Translucent">  
  2. <item name="android:windowBackground">  
  3. @drawable/translucent_background  
  4. </item>  
  5. <item name="android:windowNoTitle">true</item>  
  6. <item name="android:colorForeground">#fff</item>  
  7. </style>  

第二种效果是在源代码里面修改,在onCreate方法里面添加:

[java]  view plain copy
  1. getWindow().  
  2. setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,  
  3. WindowManager.LayoutParams.FLAG_BLUR_BEHIND);  
  4. setContentView(R.layout.translucent_background);  

设置模糊效果是通过窗口管理器(WindowManager)设置参数来完成的,这种设置只有在背景设置为透明后才能显示效果。


  四十五、Android输入框和文本框滚动条ScrollView

    我们都知道EditText与TextView是Android的文本输入框和文本显示框,但是基于手机屏幕的大小因素,如果在需要输入较多文字或者显示较多内容的时候,手机屏幕是远远不够的,因此让文本框具有滚动条的功能是手机上必备的,


要加上滚动条,其实很简单,只需要在文本输入框或者文本显示框上面加上滚动条控件即可,该控件名字为ScrollView,以下我们对比下(以TextView举例)。

A、未加滚动效果

[html]  view plain copy
  1. <TextView   
  2. android:layout_width="fill_parent"   
  3. android:layout_height="wrap_content"   
  4. android:id="@+id/textView"   
  5. />  

B、加上滚动效果

[html]  view plain copy
  1. <ScrollView   
  2. android:id="@+id/scrollView"   
  3. android:layout_width="fill_parent"   
  4. android:layout_height="200px"   
  5. android:scrollbarStyle="outsideOverlay" android:background="@android:drawable/edit_text">   
  6. <TextView   
  7. android:layout_width="fill_parent"   
  8. android:layout_height="wrap_content"   
  9. android:id="@+id/textView"   
  10. />   
  11. </ScrollView>  


由以上例子可以看出,只需要在文本控件的外围加上ScrollView控件就可以让文本框具有滚动体的功能。

       四十六、Android模拟器启动内存错误(内存不能为read)

如图

运行模拟器的时候总是会内存错误。




这种情况偶尔出现,没什么关系,不用管他。点击‘取消’就可以了。 

经常出现就危险了,弄不好就得重装系统了。 

运行某些程序的时候,有时会出现内存错误的提示,然后该程序就关闭。 
“0x????????”指令引用的“0x????????”内存。该内存不能为“read”。 
“0x????????”指令引用的“0x????????”内存,该内存不能为“written”。 
一般出现这个现象有方面的,一是硬件,即内存方面有问题,二是软件 

开始 运行 输入:cmd 确定: 

在DOS提示符下输入: 

for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1 

等待3分钟,左右后,搞定了。(如果怕输错,就把这句话复制上去)。

     

    

四十七、通过路径获取媒体文件信息

    通过路径获取媒体文件信息  http://blog.csdn.net/aomandeshangxiao/article/details/6600725

        四十八、Java中有用的文件操作

      java文件操作 http://blog.csdn.net/aomandeshangxiao/article/details/6597302

       

       四十九、Android文件读写

    Android文件的读写 http://blog.csdn.net/aomandeshangxiao/article/details/6589510

        五十、

     scaleType属性与ImagView中图片的显示的关系

      

    五十一、  Notification的属性

                           notification的各种属性:http://blog.csdn.net/aomandeshangxiao/article/details/6608101

    五十二、Android控件实现震动:

               先在res下面新创建anim文件夹,在该文件夹中创建shake.xml文件:

[java]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <translate xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:duration="1000"   
  4.     android:fromYDelta="0"   
  5.     android:toYDelta="10"  
  6.     android:fromXDelta="0"  
  7.     android:toXDelta="10"  
  8.     android:interpolator="@anim/cycle_7" />  

最后引用了cycle_7,再在该文件夹中创建cycle_7.xml文件

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:cycles="10" />  
  在Java代码里面:

[html]  view plain copy
  1. Animation shake = AnimationUtils.loadAnimation(this, R.anim.shake);  
  2.         findViewById(R.id.image).startAnimation(shake);  

就实现了该控件的震动效果。

         

    五十三、Android 页面切换动画效果

      http://hi.baidu.com/fountainblog/blog/item/66cb9918b0220eaa4bedbc2e.html

    五十四、Android2.2完全退出程序 

     http://www.eoeandroid.com/thread-62284-1-1.html

    五十五、Android按下back键非退出隐藏到后台

[java]  view plain copy
  1. public boolean onKeyDown(int keyCode, KeyEvent event) {    
  2.     if (keyCode == KeyEvent.KEYCODE_BACK) {    
  3.         Intent intent = new Intent(Intent.ACTION_MAIN);    
  4.         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    
  5.         intent.addCategory(Intent.CATEGORY_HOME);    
  6.         startActivity(intent);    
  7.         return true;    
  8.     }    
  9.     return super.onKeyDown(keyCode, event);    
  10. }    

    五十六、在Android开发中使用Gallery实现多级联动

http://mobile.51cto.com/hot-230282.htm


    五十七、获取view在屏幕中的位置:

[java]  view plain copy
  1. int[] points = { 00 };  
  2.             view.getLocationInWindow(points);  

这里用数组存储view的x和y坐标,point[0]是x坐标,point[1]是y坐标。

    五十八、在图形中添加文字

[java]  view plain copy
  1. @Override  
  2.     protected synchronized void onDraw(Canvas canvas) {  
  3.         super.onDraw(canvas);  
  4.         Rect rect = new Rect();  
  5.         this.mPaint.getTextBounds(this.text, 0this.text.length(), rect);  
  6.         int x = (getWidth() / 2) - rect.centerX();  
  7.         int y = (getHeight() / 2) - rect.centerY();  
  8.         canvas.drawText(this.text, x, y, this.mPaint);  
  9.     }  

     五十九、使用Vibrator实现手机震动

 

[java]  view plain copy
  1. @Override  
  2.     public boolean onTouchEvent(MotionEvent event) {  
  3.   
  4.         if(event.getAction() == MotionEvent.ACTION_DOWN){  
  5.              vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);  
  6.              long[] pattern = {80040,40030}; // OFF/ON/OFF/ON...  
  7.              vibrator.vibrate(pattern, 2);//-1不重复,非-1为从pattern的指定下标开始重复  
  8.         }  
  9.         return super.onTouchEvent(event);  
  10.     }   

   六十、界面重绘

              invalidate()或者view.postinvalidate()方法

 六十一、Android创建桌面快捷方式:

[java]  view plain copy
  1. /**  
  2.  * 为程序创建桌面快捷方式  
  3.  */   
  4. private void addShortcut(){    
  5.     Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");    
  6.              
  7.     //快捷方式的名称    
  8.     shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));    
  9.     shortcut.putExtra("duplicate"false); //不允许重复创建    
  10.              
  11.     //指定当前的Activity为快捷方式启动的对象: 如 com.everest.video.VideoPlayer    
  12.     //注意: ComponentName的第二个参数必须加上点号(.),否则快捷方式无法启动相应程序    
  13.     ComponentName comp = new ComponentName(this.getPackageName(), "."+this.getLocalClassName());    
  14.     shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_MAIN).setComponent(comp));    
  15.      
  16.     //快捷方式的图标    
  17.     ShortcutIconResource iconRes = Intent.ShortcutIconResource.fromContext(this, R.drawable.icon);    
  18.     shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconRes);    
  19.              
  20.     sendBroadcast(shortcut);    
  21. }  

需要声明权限:

[java]  view plain copy
  1. <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />   

http://www.cnblogs.com/-OYK/archive/2011/05/31/2064797.html

http://www.apkbus.com/android-17389-1-1.html

http://dev.10086.cn/cmdn/wiki/index.php?edition-view-8836-1.html


 六十二、android画图去锯齿效果

      paint.setAntiAlias(true);

      画图片的时候,前面设置没有用

   canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));

 六十三、获取sd卡里文件信息

[java]  view plain copy
  1. public class SDFileExplorer extends Activity{  
  2.     ListView listView;  
  3.     TextView textView;  
  4.     // 记录当前的父文件夹  
  5.     File currentParent;  
  6.     // 记录当前路径下的所有文件的文件数组  
  7.     File[] currentFiles;  
  8.   
  9.     @Override  
  10.     public void onCreate(Bundle savedInstanceState){  
  11.         super.onCreate(savedInstanceState);  
  12.         setContentView(R.layout.main);  
  13.         //获取列出全部文件的ListView  
  14.         listView = (ListView) findViewById(R.id.list);  
  15.         textView = (TextView) findViewById(R.id.path);  
  16.         //获取系统的SD卡的目录  
  17.         File root = new File("/mnt/sdcard/");  
  18.         //如果 SD卡存在  
  19.         if (root.exists()){  
  20.             currentParent = root;  
  21.             currentFiles = root.listFiles();  
  22.             //使用当前目录下的全部文件、文件夹来填充ListView  
  23.             inflateListView(currentFiles);  
  24.         }  
  25.         // 为ListView的列表项的单击事件绑定监听器  
  26.         listView.setOnItemClickListener(new OnItemClickListener(){  
  27.             @Override  
  28.             public void onItemClick(AdapterView<?> parent, View view,  
  29.                 int position, long id){  
  30.                 // 用户单击了文件,直接返回,不做任何处理  
  31.                 if (currentFiles[position].isFile())  
  32.                     return;  
  33.                 // 获取用户点击的文件夹下的所有文件  
  34.                 File[] tmp = currentFiles[position].listFiles();  
  35.                 if (tmp == null || tmp.length == 0){  
  36.                     Toast.makeText(SDFileExplorer.this"当前路径不可访问或该路径下没有文件",  
  37.                         20000).show();  
  38.                 }else{  
  39.                     //获取用户单击的列表项对应的文件夹,设为当前的父文件夹  
  40.                     currentParent = currentFiles[position];  
  41.                     //保存当前的父文件夹内的全部文件和文件夹  
  42.                     currentFiles = tmp;  
  43.                     // 再次更新ListView  
  44.                     inflateListView(currentFiles);  
  45.                 }  
  46.             }  
  47.         });  
  48.         // 获取上一级目录的按钮  
  49.         Button parent = (Button) findViewById(R.id.parent);  
  50.         parent.setOnClickListener(new OnClickListener(){  
  51.             @Override  
  52.             public void onClick(View source){  
  53.                 try{  
  54.                     if (!currentParent.getCanonicalPath().equals("/mnt/sdcard")){  
  55.                         // 获取上一级目录  
  56.                         currentParent = currentParent.getParentFile();  
  57.                         // 列出当前目录下所有文件  
  58.                         currentFiles = currentParent.listFiles();  
  59.                         // 再次更新ListView  
  60.                         inflateListView(currentFiles);  
  61.                     }  
  62.                 }  
  63.                 catch (IOException e){  
  64.                     e.printStackTrace();  
  65.                 }  
  66.             }  
  67.         });  
  68.     }  
  69.   
  70.     private void inflateListView(File[] files){  
  71.         // 创建一个List集合,List集合的元素是Map  
  72.         List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();  
  73.         for (int i = 0; i < files.length; i++){  
  74.             Map<String, Object> listItem = new HashMap<String, Object>();  
  75.             //如果当前File是文件夹,使用folder图标;否则使用file图标  
  76.             if (files[i].isDirectory()){  
  77.                 listItem.put("icon", R.drawable.folder);  
  78.             }else{  
  79.                 listItem.put("icon", R.drawable.file);  
  80.             }  
  81.             listItem.put("fileName", files[i].getName());  
  82.             //添加List项  
  83.             listItems.add(listItem);  
  84.         }  
  85.         // 创建一个SimpleAdapter  
  86.         SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems,  
  87.             R.layout.line, new String[] { "icon""fileName" }, new int[] {  
  88.                 R.id.icon, R.id.file_name });  
  89.         // 为ListView设置Adapter  
  90.         listView.setAdapter(simpleAdapter);  
  91.         try{  
  92.             textView.setText("当前路径为:" + currentParent.getCanonicalPath());  
  93.         }catch (IOException e){  
  94.             e.printStackTrace();  
  95.         }  
  96.     }  
  97. }  

   六十四、Android标题栏显示progressBar

[java]  view plain copy
  1. protected void onCreate(Bundle savedInstanceState) {  
  2.     super.onCreate(savedInstanceState);  
  3.     requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);//先给Activity注册界面进度条功能  
  4.     setContentView(R.layout.main);  
  5.     setProgressBarIndeterminateVisibility(true);//在需要显示进度条的时候调用这个方法  
  6.     setProgressBarIndeterminateVisibility(false);//在不需要显示进度条的时候调用这个方法  
  7. }  

    六十五、单击EditText全选内容

[java]  view plain copy
  1. percent.setOnTouchListener(this);  
  2.   
  3. @Override  
  4. public boolean onTouch(View v, MotionEvent event) {  
  5. if(v.getId()==R.id.seekPercent) {  
  6. percent.selectAll();  
  7. InputMethodManager imm = (InputMethodManager)  
  8. context.getSystemService(Context.INPUT_METHOD_SERVICE);  
  9. imm.showSoftInput(v, 0);  
  10. return true;  
  11. }  
  12. return false;  
  13. }  


六十六、Android设置图片圆角

[java]  view plain copy
  1. /**  
  2.   * 将图片设置为圆角  
  3.   */   
  4. public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {   
  5.   Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),   
  6.   bitmap.getHeight(), Config.ARGB_8888);   
  7.   Canvas canvas = new Canvas(output);   
  8.   final int color = 0xff424242;   
  9.   final Paint paint = new Paint();   
  10.   final Rect rect = new Rect(00, bitmap.getWidth(), bitmap.getHeight());   
  11.   final RectF rectF = new RectF(rect);   
  12.   final float roundPx = pixels;   
  13.   paint.setAntiAlias(true);   
  14.   canvas.drawARGB(0000);   
  15.   paint.setColor(color);   
  16.   canvas.drawRoundRect(rectF, roundPx, roundPx, paint);   
  17.   paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));   
  18.   canvas.drawBitmap(bitmap, rect, rect, paint);   
  19.   return output;   
  20. }  


六十七、把图片转换成圆形


[html]  view plain copy
  1. bitmap = ((BitmapDrawable)imageView1.getDrawable()).getBitmap();  
  2. bitmap = getRoundedCornerBitmap(bitmap);  
  3. imageView1.setImageBitmap(bitmap);  
  4.   
  5. public static Bitmap getRoundedCornerBitmap(Bitmap bitmap) {  
  6. Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),  
  7. bitmap.getHeight(), Config.ARGB_8888);  
  8. Canvas canvas = new Canvas(output);  
  9.   
  10. final int color = 0xff424242;  
  11. final Paint paint = new Paint();  
  12. final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());  
  13. final RectF rectF = new RectF(rect);  
  14. final float roundPx = bitmap.getWidth() / 2;  
  15.   
  16. paint.setAntiAlias(true);  
  17. canvas.drawARGB(0, 0, 0, 0);  
  18. paint.setColor(color);  
  19. canvas.drawRoundRect(rectF, roundPx, roundPx, paint);  
  20.   
  21. paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));  
  22. canvas.drawBitmap(bitmap, rect, rect, paint);  
  23. return output;  
  24. }   


六十八、TextView高级应用


1.    自定义字体

可以使用setTypeface(Typeface)方法来设置文本框内文本的字体,而android的 Typeface又使用TTF字体文件来设置字体

所以,我们可以在程序中放入TTF字体文件,在程序中使用Typeface来设置字体:第一步,在assets目录下新建fonts目录,把TTF字体文件放到这里。第二步,程序中调用:

TextViewtv = (TextView)findViewById(R.id.textView);

AssetManagermgr=getAssets();//得到AssetManager

Typefacetf=Typeface.createFromAsset(mgr, "fonts/mini.TTF");//根据路径得到Typeface

tv.setTypeface(tf);//设置字体

效果如下图所示:




2.    显示多种颜色的字

Android支持html格式的字符串,通过调用Html.fromHtml(str)方法可以转换html格式的字符串str。

示例如下:

StringtextStr1 = "<font color=\"#ffff00\">如果有一天,</font><br>";

StringtextStr2 = "<font color=\"#00ff00\">我厌倦了这里,</font><br>";

StringtextStr3 = "<font color=\"#ff00ff\">我会乘着梦,</font><br>";

StringtextStr4 = "<font color=\"#00ffff\">飞向那个属于自己的<br>世界……</font><br>";

tv.setText(Html.fromHtml(textStr1+textStr2+textStr3+textStr4));

运行后效果如下:




3.    字体加粗

在xml布局文件中使用android:textStyle=”bold”可以将英文设置成粗体,但是不能将中文设置成粗体,将中文设置成粗体的方法是:使用TextPaint的仿“粗体”设置setFakeBoldText为true。示例代码如下:

tv.getPaint().setFakeBoldText(true);

效果如下:




4.    添加阴影

在xml布局文件中使用一系列android:shadowXXX属性可添加设置阴影。具体为:shadowColor设置阴影颜色;shadowDx设置阴影水平偏移量;shadowDy设置阴影垂直偏移量;shadowRadius设置阴影半径。

示例代码:

android:shadowColor="#ffffff"

android:shadowDx="15.0"

android:shadowDy="5.0"

android:shadowRadius="2.5"

显示效果如下:




5.    插入图片

插入图片有两种方法,第一种方法就是用上面说的html格式的字符串,不过转换稍微有些麻烦。需要用到ImageGetter类来对图片的src属性进行转换。示例代码如下:

StringimgStr = "<img src=\""+R.drawable.sidai+"\"/>";

Html.ImageGetterimageGetter = new Html.ImageGetter() {

         public Drawable getDrawable(Stringarg0) {

                   // TODO Auto-generated methodstub

                   int id =Integer.parseInt(arg0);

                   Drawable draw =getResources().getDrawable(id);

                   draw.setBounds(10, 10, 228,300);

                   return draw;

         }

};

tv.append(Html.fromHtml(imgStr,imageGetter,null));

第二种方法是使用xml布局文件中一系列android:drawableXXX属性来实现插入图片。具体为:drawableBottom是在文本框内文本的底端绘制指定图像;drawableLeft是在文本框内文本的左边绘制指定图像;drawableRight是在文本框内文本的右边绘制指定图像;drawableTop是在文本框内文本的顶端绘制指定图像;drawablePadding设置文本框内文本与图像之间的间距。示例代码:

android:drawableBottom=”@drawable/sidai”

插入图片后的显示效果如下:





六十九、资源plurals表示数量的各种方式,

比如:一个教室有多少学生。考虑下面的例子:
there is 1 student;
there are 2 students;
there are 50 students;
显然对于2,50句子格式是一样的,对于1不同,Android支持将这种变体表示为plurals资源。

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <string name="hello">Hello World, Resource_Plurals!</string>  
  4.     <string name="app_name">Resource_Plurals</string>  
  5.     <plurals name="student">  
  6.         <item quantity="one">There is 1 student</item>  
  7.         <item quantity="other">There are %d  students</item>  
  8.     </plurals>  
  9. </resources>  
在Java代码中获取定义的plurals资源
[java]  view plain copy
  1. public class Resource_Plurals extends Activity {  
  2.     /** Called when the activity is first created. */  
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.main);  
  7.           
  8.         Resources r = getResources();  
  9.         String s1 = r.getQuantityString(R.plurals.student, 1,1);  
  10.         Log.i("plurals", s1);  
  11.         String s2 = r.getQuantityString(R.plurals.student, 2,2);  
  12.         Log.i("plurals", s2);  
  13.         String s3 = r.getQuantityString(R.plurals.student, 50,50);  
  14.         Log.i("plurals", s3);  
  15.           
  16.     }  
  17. }  


七十、Android 自定义json解析类

 
 
[java] view plain copy
  1. import java.lang.reflect.Method;  
  2. import java.util.Collection;  
  3. import java.util.Map;  
  4. import java.util.Set;  
  5. public final class JsonUtil{  
  6. /** 
  7. * 把对象封装为JSON格式 
  8. * 
  9. * @param o 
  10. * 对象 
  11. * @return JSON格式 
  12. */  
  13. @SuppressWarnings"unchecked")  
  14. public static String toJson(final Object o){  
  15. if (o == null){  
  16. return "null";  
  17. }  
  18. if (o instanceof String) //String{  
  19. return string2Json((String) o);  
  20. }  
  21. if (o instanceof Boolean) //Boolean{  
  22. return boolean2Json((Boolean) o);  
  23. }  
  24. if (o instanceof Number) //Number{  
  25. return number2Json((Number) o);  
  26. }  
  27. if (o instanceof Map) //Map{  
  28. return map2Json((Map<String, Object>) o);  
  29. }  
  30. if (o instanceof Collection) //List Set{  
  31. return collection2Json((Collection) o);  
  32. }  
  33. if (o instanceof Object[]) //对象数组{  
  34. return array2Json((Object[]) o);  
  35. }  
  36. if (o instanceof int[])//基本类型数组  
  37. {  
  38. return intArray2Json((int[]) o);  
  39. }  
  40. if (o instanceof boolean[])//基本类型数组  
  41. {  
  42. return booleanArray2Json((boolean[]) o);  
  43. }  
  44. if (o instanceof long[])//基本类型数组  
  45. {  
  46. return longArray2Json((long[]) o);  
  47. }  
  48. if (o instanceof float[])//基本类型数组  
  49. {  
  50. return floatArray2Json((float[]) o);  
  51. }  
  52. if (o instanceof double[])//基本类型数组  
  53. {  
  54. return doubleArray2Json((double[]) o);  
  55. }  
  56. if (o instanceof short[])//基本类型数组  
  57. {  
  58. return shortArray2Json((short[]) o);  
  59. }  
  60. if (o instanceof byte[])//基本类型数组  
  61. {  
  62. return byteArray2Json((byte[]) o);  
  63. }  
  64. if (o instanceof Object) //保底收尾对象  
  65. {  
  66. return object2Json(o);  
  67. }  
  68. throw new RuntimeException("不支持的类型: " + o.getClass().getName());  
  69. }  
  70. /** 
  71. * 将 String 对象编码为 JSON格式,只需处理好特殊字符 
  72. * 
  73. * @param s 
  74. * String 对象 
  75. * @return JSON格式 
  76. */  
  77. static String string2Json(final String s)  
  78. {  
  79. final StringBuilder sb = new StringBuilder(s.length() + 20);  
  80. sb.append('\"');  
  81. for (int i = 0; i < s.length(); i++)  
  82. {  
  83. final char c = s.charAt(i);  
  84. switch (c)  
  85. {  
  86. case '\"':  
  87. sb.append("\\\"");  
  88. break;  
  89. case '\\':  
  90. sb.append("\\\\");  
  91. break;  
  92. case '/':  
  93. sb.append("\\/");  
  94. break;  
  95. case '\b':  
  96. sb.append("\\b");  
  97. break;  
  98. case '\f':  
  99. sb.append("\\f");  
  100. break;  
  101. case '\n':  
  102. sb.append("\\n");  
  103. break;  
  104. case '\r':  
  105. sb.append("\\r");  
  106. break;  
  107. case '\t':  
  108. sb.append("\\t");  
  109. break;  
  110. default:  
  111. sb.append(c);  
  112. }  
  113. }  
  114. sb.append('\"');  
  115. return sb.toString();  
  116. }  
  117. /** 
  118. * 将 Number 表示为 JSON格式 
  119. * 
  120. * @param number 
  121. * Number 
  122. * @return JSON格式 
  123. */  
  124. static String number2Json(final Number number)  
  125. {  
  126. return number.toString();  
  127. }  
  128. /** 
  129. * 将 Boolean 表示为 JSON格式 
  130. * 
  131. * @param bool 
  132. * Boolean 
  133. * @return JSON格式 
  134. */  
  135. static String boolean2Json(final Boolean bool)  
  136. {  
  137. return bool.toString();  
  138. }  
  139. /** 
  140. * 将 Collection 编码为 JSON 格式 (List,Set) 
  141. * 
  142. * @param c 
  143. * @return 
  144. */  
  145. static String collection2Json(final Collection<Object> c)  
  146. {  
  147. final Object[] arrObj = c.toArray();  
  148. return toJson(arrObj);  
  149. }  
  150. /** 
  151. * 将 Map<String, Object> 编码为 JSON 格式 
  152. * 
  153. * @param map 
  154. * @return 
  155. */  
  156. static String map2Json(final Map<String, Object> map)  
  157. {  
  158. if (map.isEmpty())  
  159. {  
  160. return "{}";  
  161. }  
  162. final StringBuilder sb = new StringBuilder(map.size() << 4); //4次方  
  163. sb.append('{');  
  164. final Set<String> keys = map.keySet();  
  165. for (final String key : keys)  
  166. {  
  167. final Object value = map.get(key);  
  168. sb.append('\"');  
  169. sb.append(key); //不能包含特殊字符  
  170. sb.append('\"');  
  171. sb.append(':');  
  172. sb.append(toJson(value)); //循环引用的对象会引发无限递归  
  173. sb.append(',');  
  174. }  
  175. // 将最后的 ',' 变为 '}':  
  176. sb.setCharAt(sb.length() - 1, '}');  
  177. return sb.toString();  
  178. }  
  179. /** 
  180. * 将数组编码为 JSON 格式 
  181. * 
  182. * @param array 
  183. * 数组 
  184. * @return JSON 格式 
  185. */  
  186. static String array2Json(final Object[] array)  
  187. {  
  188. if (array.length == 0)  
  189. {  
  190. return "[]";  
  191. }  
  192. final StringBuilder sb = new StringBuilder(array.length << 4); //4次方  
  193. sb.append('[');  
  194. for (final Object o : array)  
  195. {  
  196. sb.append(toJson(o));  
  197. sb.append(',');  
  198. }  
  199.   
  200. // 将最后添加的 ',' 变为 ']':  
  201. sb.setCharAt(sb.length() - 1, ']');  
  202. return sb.toString();  
  203. }  
  204. static String intArray2Json(final int[] array)  
  205. {  
  206. if (array.length == 0)  
  207. {  
  208. return "[]";  
  209. }  
  210. final StringBuilder sb = new StringBuilder(array.length << 4);  
  211. sb.append('[');  
  212. for (final int o : array)  
  213. {  
  214. sb.append(Integer.toString(o));  
  215. sb.append(',');  
  216. }  
  217. // set last ',' to ']':  
  218. sb.setCharAt(sb.length() - 1, ']');  
  219. return sb.toString();  
  220. }  
  221. static String longArray2Json(final long[] array)  
  222. {  
  223. if (array.length == 0)  
  224. {  
  225. return "[]";  
  226. }  
  227. final StringBuilder sb = new StringBuilder(array.length << 4);  
  228. sb.append('[');  
  229. for (final long o : array)  
  230. {  
  231. sb.append(Long.toString(o));  
  232. sb.append(',');  
  233. }  
  234. // set last ',' to ']':  
  235. sb.setCharAt(sb.length() - 1, ']');  
  236. return sb.toString();  
  237. }  
  238. static String booleanArray2Json(final boolean[] array)  
  239. {  
  240. if (array.length == 0)  
  241. {  
  242. return "[]";  
  243. }  
  244. final StringBuilder sb = new StringBuilder(array.length << 4);  
  245. sb.append('[');  
  246. for (final boolean o : array)  
  247. {  
  248. sb.append(Boolean.toString(o));  
  249. sb.append(',');  
  250. }  
  251. // set last ',' to ']':  
  252. sb.setCharAt(sb.length() - 1, ']');  
  253. return sb.toString();  
  254. }  
  255. static String floatArray2Json(final float[] array)  
  256. {  
  257. if (array.length == 0)  
  258. {  
  259. return "[]";  
  260. }  
  261. final StringBuilder sb = new StringBuilder(array.length << 4);  
  262. sb.append('[');  
  263. for (final float o : array)  
  264. {  
  265. sb.append(Float.toString(o));  
  266. sb.append(',');  
  267. }  
  268. // set last ',' to ']':  
  269. sb.setCharAt(sb.length() - 1, ']');  
  270. return sb.toString();  
  271. }  
  272. static String doubleArray2Json(final double[] array)  
  273. {  
  274. if (array.length == 0)  
  275. {  
  276. return "[]";  
  277. }  
  278. final StringBuilder sb = new StringBuilder(array.length << 4);  
  279. sb.append('[');  
  280. for (final double o : array)  
  281. {  
  282. sb.append(Double.toString(o));  
  283. sb.append(',');  
  284. }  
  285. // set last ',' to ']':  
  286. sb.setCharAt(sb.length() - 1, ']');  
  287. return sb.toString();  
  288. }  
  289. static String shortArray2Json(final short[] array)  
  290. {  
  291. if (array.length == 0)  
  292. {  
  293. return "[]";  
  294. }  
  295. final StringBuilder sb = new StringBuilder(array.length << 4);  
  296. sb.append('[');  
  297. for (final short o : array)  
  298. {  
  299. sb.append(Short.toString(o));  
  300. sb.append(',');  
  301. }  
  302. // set last ',' to ']':  
  303. sb.setCharAt(sb.length() - 1, ']');  
  304. return sb.toString();  
  305. }  
  306. static String byteArray2Json(final byte[] array)  
  307. {  
  308. if (array.length == 0)  
  309. {  
  310. return "[]";  
  311. }  
  312. final StringBuilder sb = new StringBuilder(array.length << 4);  
  313. sb.append('[');  
  314. for (final byte o : array)  
  315. {  
  316. sb.append(Byte.toString(o));  
  317. sb.append(',');  
  318. }  
  319. // set last ',' to ']':  
  320. sb.setCharAt(sb.length() - 1, ']');  
  321. return sb.toString();  
  322. }  
  323. public static String object2Json(final Object bean)  
  324. {  
  325. //数据检查  
  326. if (bean == null)  
  327. {  
  328. return "{}";  
  329. }  
  330. final Method[] methods = bean.getClass().getMethods(); //方法数组  
  331. final StringBuilder sb = new StringBuilder(methods.length << 4); //4次方  
  332. sb.append('{');  
  333. for (final Method method : methods)  
  334. {  
  335. try  
  336. {  
  337. final String name = method.getName();  
  338. String key = "";  
  339. if (name.startsWith("get"))  
  340. {  
  341. key = name.substring(3);  
  342. //防死循环  
  343. final String[] arrs =  
  344. "Class" };  
  345. boolean bl = false;  
  346. for (final String s : arrs)  
  347. {  
  348. if (s.equals(key))  
  349. {  
  350. bl = true;  
  351. continue;  
  352. }  
  353. }  
  354. if (bl)  
  355. {  
  356. continue; //防死循环  
  357. }  
  358. }  
  359. else if (name.startsWith("is"))  
  360. {  
  361. key = name.substring(2);  
  362. }  
  363. if (key.length() > 0 && Character.isUpperCase(key.charAt(0)) && method.getParameterTypes().length == 0)  
  364. {  
  365. if (key.length() == 1)  
  366. {  
  367. key = key.toLowerCase();  
  368. }  
  369. else if (!Character.isUpperCase(key.charAt(1)))  
  370. {  
  371. key = key.substring(0, 1).toLowerCase() + key.substring(1);  
  372. }  
  373. final Object elementObj = method.invoke(bean);  
  374. //System.out.println("###" + key + ":" + elementObj.toString());  
  375. sb.append('\"');  
  376. sb.append(key); //不能包含特殊字符  
  377. sb.append('\"');  
  378. sb.append(':');  
  379. sb.append(toJson(elementObj)); //循环引用的对象会引发无限递归  
  380. sb.append(',');  
  381. }  
  382. }  
  383. catch (final Exception e)  
  384. {  
  385. //e.getMessage();  
  386. throw new RuntimeException("在将bean封装成JSON格式时异常:" + e.getMessage(), e);  
  387. }  
  388. }  
  389. if (sb.length() == 1)  
  390. {  
  391. return bean.toString();  
  392. }  
  393. else  
  394. {  
  395. sb.setCharAt(sb.length() - 1, '}');  
  396. return sb.toString();}  
  397. }  
  398. private JsonUtil(){  
  399. }  
  400. }  
  401. 七十一、android自动跳转

           有些时候需要类似这样的功能,在一个页面停留2秒后,跳转到另外一个页面!

    第一种方法:

    [java]  view plain copy
    1. Timer timer = new Timer();  
    2.   
    3. TimerTask timerTask = new TimerTask() {  
    4.          
    5.         @Override  
    6.         public void run() {  
    7.                 // 你要干的活  
    8.                  
    9.         }  
    10. };  
    11. timer.schedule(timerTask, 1000 * 2); //2秒后执行  

    在run()方法里面写上你的跳转就可以了。

    第二种方法:

    [java]  view plain copy
    1. private final int SPLASH_DISPLAY_LENGHT = 2000;  
    2.   
    3.         @Override  
    4.         public void onCreate(Bundle savedInstanceState) {  
    5.                 super.onCreate(savedInstanceState);  
    6.                 this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,    
    7.                 WindowManager.LayoutParams.FLAG_FULLSCREEN);    
    8.                 setContentView(R.layout.splash);  
    9.                 new Handler().postDelayed(new Runnable() {  
    10.                         @Override  
    11.                         public void run() {  
    12.                                 Intent intent = new Intent(Splash.this, XXX.class);  
    13.                                 Splash.this.startActivity(intent);  
    14.                                 overridePendingTransition(R.anim.fade_in, R.anim.fade_out);  
    15.                                 Splash.this.finish();  
    16.                         }  
    17.   
    18.                 }, SPLASH_DISPLAY_LENGHT);  
    19.         }  

    使用handler延迟2秒后跳转。

        七十二、Gally选中高亮状态

        没有选中,在GalleryActivity中,设置gallery.setUnselectedAlpha(0.3f); 透明度为0.3

        选中,在ImageAdapter的getView(int position, View convertView, ViewGroup parent)中,设置imageview.setBackgroundColor(Color.alpha(1)); 背景色为1  

        七十三、TextView颜色设置

    [html]  view plain copy
    1. android:textColor                    //设置文本颜色  
    2.   
    3. android:textColorHighlight           //被选中文字的底色,默认为蓝色  
    4.   
    5. android:textColorHint                //设置提示信息文字的颜色,默认为灰色。与hint一起使用。  


        七十四、Button使用Shape

    [java]  view plain copy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <selector  
    3.     xmlns:android="http://schemas.android.com/apk/res/android">  
    4.     <item android:state_pressed="true" >  
    5.         <shape>  
    6.             <gradient  
    7.                 android:startColor="#ff8c00"  
    8.                 android:endColor="#FFFFFF"  
    9.                 android:angle="270" />  
    10.             <stroke  
    11.                 android:width="2dp"  
    12.                 android:color="#dcdcdc" />  
    13.             <corners  
    14.                 android:radius="2dp" />  
    15.             <padding  
    16.                 android:left="10dp"  
    17.                 android:top="10dp"  
    18.                 android:right="10dp"  
    19.                 android:bottom="10dp" />  
    20.         </shape>  
    21.     </item>     <item android:state_focused="true" >  
    22.         <shape>  
    23.             <gradient  
    24.                 android:startColor="#ffc2b7"  
    25.                 android:endColor="#ffc2b7"  
    26.                 android:angle="270" />  
    27.             <stroke  
    28.                 android:width="2dp"  
    29.                 android:color="#dcdcdc" />  
    30.             <corners  
    31.                 android:radius="2dp" />  
    32.             <padding  
    33.                 android:left="10dp"  
    34.                 android:top="10dp"  
    35.                 android:right="10dp"  
    36.                 android:bottom="10dp" />  
    37.         </shape>  
    38.     </item>     <item>        
    39.         <shape>  
    40.             <gradient  
    41.                 android:startColor="#ff9d77"  
    42.                 android:endColor="#ff9d77"  
    43.                 android:angle="270" />  
    44.             <stroke  
    45.                 android:width="2dp"  
    46.                 android:color="#fad3cf" />  
    47.             <corners  
    48.                 android:radius="2dp" />  
    49.             <padding  
    50.                 android:left="10dp"  
    51.                 android:top="10dp"  
    52.                 android:right="10dp"  
    53.                 android:bottom="10dp" />  
    54.         </shape>  
    55.     </item>  
    56. </selector>  

    七十五、Android Drawable叠加处理方法

    大家可能知道Bitmap的叠加处理在Android平台中可以通过Canvas一层一层的画就行了,而Drawable中如何处理呢? 除了使用BitmapDrawable的getBitmap方法将Drawable转换为Bitmap外,今天Android123给大家说下好用简单的LayerDrawable类,LayerDrawable顾名思义就是层图形对象。下面直接用一个简单的代码表示:  

    [java]  view plain copy
    1. Bitmap bm = BitmapFactory.decodeResource(getResources(),R.drawable.cwj);  
    2.  Drawable[] array = new Drawable[3];      array[0] = new PaintDrawable(Color.BLACK); //黑色  
    3.   array[1] = new PaintDrawable(Color.WHITE); //白色  
    4.   array[2] = new BitmapDrawable(bm); //位图资源  
    5.  LayerDrawable ld = new LayerDrawable(array); //参数为上面的Drawable数组  
    6.      ld.setLayerInset(11111);  //第一个参数1代表数组的第二个元素,为白色  
    7.      ld.setLayerInset(22222); //第一个参数2代表数组的第三个元素,为位图资源  
    8.  mImageView.setImageDrawable(ld);   

      上面的方法中LayerDrawable是关键,Android开发网提示setLayerInset方法原型为public void setLayerInset (int index, int l, int t, int r, int b) 其中第一个参数为层的索引号,后面的四个参数分别为left、top、right和bottom。对于简单的图片合成我们可以将第一和第二层的PaintDrawable换成BitmapDrawable即可实现简单的图片合成。

    七十六、Android发信息时观察者

    发信息大致的流程是:

    观察者,ContentObserver

    观察信息变化,它只能观察所有  就是 :Uri:content://sms/

          你点击了发送按钮后,状态还是正在发送,这时这条信息已在你不注意时插入到发件箱中(调用 onChange一次,你可以查一下outbox的内容),当发送成功后(就会打发件箱的临时信息删除 又调用一次 onChange),成功后插入到已发信息sent(这是又会调用 onChange),它会调用三次,所以你们在观察发送信息时会出现onChange出现三次,这个解决方案我暂时只想到两种方案:

    [java]  view plain copy
    1. 1:就是在contetnobserver类里定义一个变量 int count=0;  
    2.   
    3.      @Override  
    4.   
    5. public void onChange(boolean selfChange) {  
    6.   
    7.   count++;  
    8.   
    9. //调用第三次才是已发信息  
    10.   
    11.   if(count==3){  
    12.   
    13. //代表发送了一条信息  
    14.   
    15. Log.i("wet""发送了一条信息");  
    16.   
    17. count=0;//以便第下次用  
    18.   
    19. }  
    20.   
    21.    
    22.   
    23. 2:还有一个是:  
    24.   
    25.    记录  context.getContentResolver().query(Uri.parse("content://sms/sent"), nullnullnullnull);  
    26.   
    27. 首先记录它上次的条数  
    28.   
    29. 然后再记录它这次的条数,如果改变了,那就代表它改变了  

    七十七、Android屏幕解锁和点亮屏幕

    最近在做一个闹钟的项目,当闹钟响起的时候需要用到自动解锁和点亮屏幕,因此记录一下解屏幕锁与点亮屏幕的代码:

    [java]  view plain copy
    1. KeyguardManager  km= (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); //得到键盘锁管理器对象  
    2. KeyguardLock kl = km.newKeyguardLock("unLock"); //参数是LogCat里用的Tag  
    3.   
    4. kl.disableKeyguard(); //解锁  
    5.   
    6. PowerManager pm=(PowerManager) getSystemService(Context.POWER_SERVICE);//获取电源管理器对象  
    7. PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK, "bright");  
    8. //获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是LogCat里用的Tag  
    9. wl.acquire();//点亮屏幕  
    10. wl.release();//释放  
    11.   
    12. 要实现自动解锁和点亮屏幕的功能则需要在AndroidManifest.xml添加权限:  
    13.   
    14. <uses-permission android:name="android.permission.WAKE_LOCK" />  
    15.  <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />  

    七十八、去掉listView中间隔断线

    [java]  view plain copy
    1. 方法1:listView.setDividerHeight(0);   
    2. 方法2this.getListView().setDivider(null);  
    3. 方法3:android:divider="@null"  
    4.   
    5. android:cacheColorHint="#00000000" 设置其为透明!! 默认为黑色!!!!!  


    七十九、仿iphone的icon的效果

    [java]  view plain copy
    1. public static Bitmap toRoundCorner(Bitmap bitmap, int pixels)  
    2. {  
    3. Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);  
    4. Canvas canvas = new Canvas(output);  
    5.   
    6. final int color = 0xff424242;  
    7. final Paint paint = new Paint();  
    8. final Rect rect = new Rect(00, bitmap.getWidth(), bitmap.getHeight());  
    9. final RectF rectF = new RectF(rect);  
    10. final float roundPx = pixels;  
    11.   
    12. paint.setAntiAlias(true);  
    13. canvas.drawARGB(0000);  
    14. paint.setColor(color);  
    15. canvas.drawRoundRect(rectF, roundPx, roundPx, paint);  
    16.   
    17. paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));  
    18. canvas.drawBitmap(bitmap, rect, rect, paint);  
    19.   
    20. return output;  
    21. }   

     八十、android背景图圆角等处理

    [java]  view plain copy
    1. public static Bitmap toRoundCorner(Bitmap bitmap, int pixels)  
    2. {  
    3. Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);  
    4. Canvas canvas = new Canvas(output);  
    5.   
    6. final int color = 0xff424242;  
    7. final Paint paint = new Paint();  
    8. final Rect rect = new Rect(00, bitmap.getWidth(), bitmap.getHeight());  
    9. final RectF rectF = new RectF(rect);  
    10. final float roundPx = pixels;  
    11.   
    12. paint.setAntiAlias(true);  
    13. canvas.drawARGB(0000);  
    14. paint.setColor(color);  
    15. canvas.drawRoundRect(rectF, roundPx, roundPx, paint);  
    16.   
    17. paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));  
    18. canvas.drawBitmap(bitmap, rect, rect, paint);  
    19.   
    20. return output;  
    21. }   


    八十一、http连接

    [java]  view plain copy
    1. String  httpUrl = "www.baidu.com";   
    2.                 HttpClient httpClient = new DefaultHttpClient();  
    3.                 HttpGet httpRequest = new HttpGet(httpUrl);  
    4.                 try {  
    5.                     HttpResponse httpResponse =httpClient.execute(httpRequest);  
    6.                     if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){  
    7.                         String strResult = EntityUtils.toString(httpResponse.getEntity());  
    8.   
    9.                     }  
    10.                 } catch (ClientProtocolException e) {  
    11.                     // TODO Auto-generated catch block  
    12.                     e.printStackTrace();  
    13.                 } catch (IOException e) {  
    14.                     // TODO Auto-generated catch block  
    15.                     e.printStackTrace();  
    16.                 }  
    17.                   


    post:

    [java]  view plain copy
    1. HttpClient httpClient = null  
    2. null;  
    3. HttpPost httpRequest = null  
    4. null;  
    5. HttpResponse httpResponse = null  
    6. null;  
    7. try {  
    8. httpUrl = "http://192.168.1.7:8080/exa/index.jsp";  
    9. // 取得默认的 HttpClient  
    10. httpClient = new DefaultHttpClient();  
    11. // HttpPost 连接对象  
    12. httpRequest = new HttpPost(httpUrl);  
    13. // 使用 NameValuePair 来保存要传递的 Post 参数  
    14. List<NameValuePair> params = new ArrayList<NameValuePair>();  
    15. // 添加要传递的参数  
    16. new  
    17. params.add(new BasicNameValuePair("testParam1""110"));  
    18. // 设置字符集  
    19. HttpEntity httpentity = new UrlEncodedFormEntity(params, "gb2312");  
    20. // 请求 httpRequest  
    21. httpRequest.setEntity(httpentity);  
    22. // 取得 HttpResponse  
    23. httpResponse = httpClient.execute(httpRequest);  
    24. // HttpStatus.SC_OK 表示连接成功  
    25. if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {  
    26. // 取得返回的字符串  
    27. String strResult = EntityUtils.toString(httpResponse  
    28. .getEntity());  
    29. textView_1.setText(strResult);  
    30. }  
    31. catch (Exception e) {  
    32. e.printStackTrace();  
    33. finally {  
    34. }  


    八十二、

    android里图片下载工具类AsyncImageLoader分析

    八十三、

    Android 实现 按钮从两边移到中间动画效果


    八十四、实现listview 飞入效果

    [java]  view plain copy
    1. private LayoutAnimationController getListAnim() {  
    2. AnimationSet set = new AnimationSet(true);  
    3. Animation animation = new AlphaAnimation(0.0f, 1.0f);  
    4. animation.setDuration(300);  
    5. set.addAnimation(animation);  
    6.   
    7. animation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f,  
    8. Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF,  
    9. -1.0f, Animation.RELATIVE_TO_SELF, 0.0f);  
    10. animation.setDuration(500);  
    11. set.addAnimation(animation);  
    12. LayoutAnimationController controller = new LayoutAnimationController(  
    13. set, 0.5f);  
    14. return controller;  
    15. }  
    16.   
    17.   
    18.   
    19. listView.setLayoutAnimation(getListAnim());  


    八十五Gallery只滑动一张照片

    [java]  view plain copy
    1. private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2) {    
    2.         return e2.getX() > e1.getX();    
    3.     }    
    4.     
    5.     @Override    
    6.     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {    
    7.         // e1是按下的事件,e2是抬起的事件    
    8.         int keyCode;    
    9.         if (isScrollingLeft(e1, e2)) {    
    10.             keyCode = KeyEvent.KEYCODE_DPAD_LEFT;    
    11.         } else {    
    12.             keyCode = KeyEvent.KEYCODE_DPAD_RIGHT;    
    13.         }    
    14.         onKeyDown(keyCode, null);    
    15.         return true;    
    16.     }    

    重写的意思:把onFling里面的滑动转换为了点击物理左右方向键。

    八十六、活动解锁

    http://www.eoeandroid.com/thread-175883-1-1.html

    八十七

    在TextView中自定义链接

    如果只是简单需要textview在显示时候将网址、邮件地址、电话号码识别出来并且带上超链接,只需要在xml将textview的属性添加一个autoLink="all"即可。但是如果希望在文字中定义更复杂的超链接,比如:点击特定文字后跳转到某个activity,则需要自定义Html类对于tag的解析方法。整个处理流程思路如下:

    1. TextView的文字使用带html tag的字符串,如:<a href=\"http://www.diandian.com\">android</a>其实并不难;
    2. 为要做除了网址链接、邮件链接、电话链接之外的超链接自己确定一个tag名字,加入到字符串中,如:<a href=\"http://www.diandian.com\">android</a>其实并不难<mention>哪里哪里</mention>;
    3. 自定义一个静态类,并且实现TagHandler接口,以识别自定义的tag类型

      [java]  view plain copy
      1. public static class LinkHandler implements TagHandler  
      2.     {         
      3.         private int startIndex = 0;            
      4.         private int stopIndex = 0;  
      5.         private Context ctx;  
      6.           
      7.         public LinkHandler(Context ctx)  
      8.         {  
      9.             super();  
      10.             this.ctx=ctx;  
      11.         }  
      12.   
      13. //识别自定义标签的起始和终止位置  
      14.         public void handleTag(boolean opening, String tag, Editable output,  
      15.                 XMLReader xmlReader) {  
      16.             if(tag.toLowerCase().equals(" mention"))  
      17.             {  
      18.                  if (opening) {    
      19.                          startTxt(tag, output, xmlReader);    
      20.                     } else {    
      21.                         endTxt(tag, output, xmlReader);    
      22.                     }  
      23.             }  
      24.         }  
      25.           
      26.         public void startTxt(String tag, Editable output, XMLReader xmlReader) {    
      27.             startIndex = output.length();    
      28.         }    
      29.         
      30.         public void endTxt(String tag, Editable output, XMLReader xmlReader) {    
      31.             stopIndex = output.length();    
      32.             output.setSpan(new TagSpan(output.toString().substring(startIndex,stopIndex)), startIndex, stopIndex,    
      33.                         Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);    
      34.         }    
      35.           
      36. //继承ClickableSpan类自定义类TagSpan实现OnClickListener接口,以此决定被识别出来的链接被点击后做什么  
      37.         private class TagSpan extends ClickableSpan implements OnClickListener {    
      38.                 
      39.             String s;  
      40.             public TagSpan(String s)  
      41.             {  
      42.                 this.s=s;  
      43.             }  
      44.             @Override    
      45.             public void onClick(View v) {    
      46.                 // 跳转某页面,将自定义tag对应的文字参数传递过去   
      47.                 NetActivity.pd.show();  
      48.                 getUid(s);  
      49.             }  
      50.          }          
      51.   
      52.     }  
      53.   
      54. //在原始文本中提取@用户名 方式的文字出来,加上自定义的tag  
      55. public static String addTagsToString(String s)  
      56.     {  
      57.         //对@添加tag  
      58.         Pattern p=Pattern.compile("@[\\S&&[^@]]+");  
      59.         Matcher m=p.matcher(s);  
      60.         while(m.find()){  
      61.             s=s.replace(m.group(), "<mention>"+m.group()+"</mention>");  
      62.         }          
      63.         s="<a>"+s+"</a>"//此处一定要在前后加上一个<a>标签,否则@用户名之后若还有文字,会被一起加入到mention标签之中,这个问题还没搞清楚是为什么,至少目前加上<a>标签后不会有问题  
      64.         return s;  
      65.     }  

    4. 然后在activity中为textview设定文字
    tv.setText(Html.fromHtml(addTagsToString(s),null,new LinkHandler(ctx)));
    tv.setMovementMethod(LinkMovementMethod.getInstance())

    八十八、

    模仿通讯录按字母分类显示,汉字,英文自动按英文字母分类显示,滑动时用气泡显示最上面的汉字首字母提示,右侧字母栏点击快速定位


    八十九listView Item里面存在Button 

    在button对应的view处加

    [java]  view plain copy
    1. android:focusable="false"  
    2. android:clickable="false"  
    3. android:focusableInTouchMode="false"  
    或者在 Item Layout的根控件设置其android:descendantFocusability=”blocksDescendants”

    九十、自定义progressBar样式

    在XML文件中分别定义进度条背景、第一进度颜色、第二进度颜色,然后在ProgressBar的android:progressDrawable属性应用即可。 先在drawable下建立progressbar_style.xml文件,内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    [xml]  view plain copy
    1. <span style="color:#009900;"><span style="color:#000000;"><strong><?xml</strong></span> <span style="color:#000066;">version</span>=<span style="color:#ff0000;">"1.0"</span> <span style="color:#000066;">encoding</span>=<span style="color:#ff0000;">"UTF-8"</span><span style="color:#000000;"><strong>?></strong></span></span>  
    2. <span style="color:#009900;"><span style="color:#000000;"><strong><layer-list</strong></span></span>  
    3. <span style="color:#009900;">  <span style="color:#000066;">xmlns:android</span>=<span style="color:#ff0000;">"http://schemas.android.com/apk/res/android"</span><span style="color:#000000;"><strong>></strong></span></span>  
    4.     <span style="color:#009900;"><span style="color:#000000;"><strong><item</strong></span> <span style="color:#000066;">android:id</span>=<span style="color:#ff0000;">"@android:id/background"</span><span style="color:#000000;"><strong>></strong></span></span>  
    5.         <span style="color:#009900;"><span style="color:#000000;"><strong><shape<span style="color:#000000;"><strong>></strong></span></strong></span></span>  
    6.             <span style="color:#009900;"><span style="color:#000000;"><strong><corners</strong></span> <span style="color:#000066;">android:radius</span>=<span style="color:#ff0000;">"5.0dip"</span> <span style="color:#000000;"><strong>/></strong></span></span>  
    7.             <span style="color:#009900;"><span style="color:#000000;"><strong><gradient</strong></span> <span style="color:#000066;">android:startColor</span>=<span style="color:#ff0000;">"#656666"</span> <span style="color:#000066;">android:endColor</span>=<span style="color:#ff0000;">"#dbdedf"</span> <span style="color:#000066;">android:angle</span>=<span style="color:#ff0000;">"270.0"</span> <span style="color:#000066;">android:centerY</span>=<span style="color:#ff0000;">"0.75"</span> <span style="color:#000066;">android:centerColor</span>=<span style="color:#ff0000;">"#bbbbbc"</span> <span style="color:#000000;"><strong>/></strong></span></span>  
    8.         <span style="color:#009900;"><span style="color:#000000;"><strong></shape<span style="color:#000000;"><strong>></strong></span></strong></span></span>  
    9.     <span style="color:#009900;"><span style="color:#000000;"><strong></item<span style="color:#000000;"><strong>></strong></span></strong></span></span>  
    10.     <span style="color:#009900;"><span style="color:#000000;"><strong><item</strong></span> <span style="color:#000066;">android:id</span>=<span style="color:#ff0000;">"@android:id/secondaryProgress"</span><span style="color:#000000;"><strong>></strong></span></span>  
    11.         <span style="color:#009900;"><span style="color:#000000;"><strong><clip<span style="color:#000000;"><strong>></strong></span></strong></span></span>  
    12.             <span style="color:#009900;"><span style="color:#000000;"><strong><shape<span style="color:#000000;"><strong>></strong></span></strong></span></span>  
    13.                 <span style="color:#009900;"><span style="color:#000000;"><strong><corners</strong></span> <span style="color:#000066;">android:radius</span>=<span style="color:#ff0000;">"8.0dip"</span> <span style="color:#000000;"><strong>/></strong></span></span>  
    14.                 <span style="color:#009900;"><span style="color:#000000;"><strong><gradient</strong></span> <span style="color:#000066;">android:startColor</span>=<span style="color:#ff0000;">"#e71a5e"</span> <span style="color:#000066;">android:endColor</span>=<span style="color:#ff0000;">"#6c213a"</span> <span style="color:#000066;">android:angle</span>=<span style="color:#ff0000;">"90.0"</span> <span style="color:#000066;">android:centerY</span>=<span style="color:#ff0000;">"0.75"</span> <span style="color:#000066;">android:centerColor</span>=<span style="color:#ff0000;">"#ac6079"</span> <span style="color:#000000;"><strong>/></strong></span></span>  
    15.             <span style="color:#009900;"><span style="color:#000000;"><strong></shape<span style="color:#000000;"><strong>></strong></span></strong></span></span>  
    16.         <span style="color:#009900;"><span style="color:#000000;"><strong></clip<span style="color:#000000;"><strong>></strong></span></strong></span></span>  
    17.     <span style="color:#009900;"><span style="color:#000000;"><strong></item<span style="color:#000000;"><strong>></strong></span></strong></span></span>  
    18.     <span style="color:#009900;"><span style="color:#000000;"><strong><item</strong></span> <span style="color:#000066;">android:id</span>=<span style="color:#ff0000;">"@android:id/progress"</span><span style="color:#000000;"><strong>></strong></span></span>  
    19.         <span style="color:#009900;"><span style="color:#000000;"><strong><clip<span style="color:#000000;"><strong>></strong></span></strong></span></span>  
    20.             <span style="color:#009900;"><span style="color:#000000;"><strong><shape<span style="color:#000000;"><strong>></strong></span></strong></span></span>  
    21.                 <span style="color:#009900;"><span style="color:#000000;"><strong><corners</strong></span> <span style="color:#000066;">android:radius</span>=<span style="color:#ff0000;">"8.0dip"</span> <span style="color:#000000;"><strong>/></strong></span></span>  
    22.                 <span style="color:#009900;"><span style="color:#000000;"><strong><gradient</strong></span> <span style="color:#000066;">android:startColor</span>=<span style="color:#ff0000;">"#464647"</span> <span style="color:#000066;">android:endColor</span>=<span style="color:#ff0000;">"#2d9ae7"</span> <span style="color:#000066;">android:angle</span>=<span style="color:#ff0000;">"270.0"</span> <span style="color:#000000;"><strong>/></strong></span></span>  
    23.             <span style="color:#009900;"><span style="color:#000000;"><strong></shape<span style="color:#000000;"><strong>></strong></span></strong></span></span>  
    24.         <span style="color:#009900;"><span style="color:#000000;"><strong></clip<span style="color:#000000;"><strong>></strong></span></strong></span></span>  
    25.     <span style="color:#009900;"><span style="color:#000000;"><strong></item<span style="color:#000000;"><strong>></strong></span></strong></span></span>  
    26. <span style="color:#009900;"><span style="color:#000000;"><strong></layer-list<span style="color:#000000;"><strong>></strong></span></strong></span></span>  

    分别定义背景,第一进度颜色,第二进度颜色
    gradient是渐变,前面已经说过,corners定义的是圆角
    布局中:

    1
    2
    3
    4
    
    [xml]  view plain copy
    1. <span style="color:#009900;"><span style="color:#000000;"><strong><ProgressBar</strong></span> <span style="color:#000066;">android:id</span>=<span style="color:#ff0000;">"@+id/progressBar1"</span> <span style="color:#000066;">android:layout_width</span>=<span style="color:#ff0000;">"fill_parent"</span> <span style="color:#000066;">android:layout_height</span>=<span style="color:#ff0000;">"wrap_content"</span></span>  
    2. <span style="color:#009900;"><span style="color:#000066;">style</span>=<span style="color:#ff0000;">"?android:attr/progressBarStyleHorizontal"</span> <span style="color:#000066;">android:progressDrawable</span>=<span style="color:#ff0000;">"@drawable/progressbar_style"</span></span>  
    3. <span style="color:#009900;"><span style="color:#000066;">android:progress</span>=<span style="color:#ff0000;">"50"</span> <span style="color:#000066;">android:max</span>=<span style="color:#ff0000;">"100"</span> <span style="color:#000066;">android:secondaryProgress</span>=<span style="color:#ff0000;">"70"</span></span>  
    4. <span style="color:#009900;"><span style="color:#000000;"><strong>></strong></span><span style="color:#000000;"><strong></ProgressBar<span style="color:#000000;"><strong>></strong></span></strong></span></span>  

    九十一、

    android自定义ProgressBar(仿淘宝)的加载效果

    九十二、

    android仿微信的开门效果


    九十三、Activity中ConfigChanges属性配置描述

    [plain]  view plain copy
    1. “mcc” The IMSI mobile country code (MCC) has changed — that is, a SIM hasbeen detected and updated the MCC.移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家。  
    2. “mnc“ The IMSI mobile network code (MNC) has changed — that is, a SIM hasbeen detected and updated the MNC.移动网号,在一个国家或者地区中,用于区分手机用户的服务商。  
    3. “locale“ The locale has changed — for example, the user has selected a new language that text should be displayed in.用户所在地区发生变化。  
    4. “touchscreen“ The touchscreen has changed. (This should never normally happen.)  
    5. “keyboard“ The keyboard type has changed — for example, the user has plugged in an external keyboard.键盘模式发生变化,例如:用户接入外部键盘输入。  
    6. “keyboardHidden“ The keyboard accessibility has changed — for example, the user has slid the keyboard out to expose it.用户打开手机硬件键盘  
    7. “navigation“ The navigation type has changed. (This should never normally happen.)  
    8. “orientation“ The screen orientation has changed — that is, the user has rotated the device.设备旋转,横向显示和竖向显示模式切换。  
    9. “fontScale“ The font scaling factor has changed — that is, the user has selected a new global font size.全局字体大小缩放发生改变   


    "screenSize"   The current available screen size has changed. This represents a change in the currently available size, relative to the current aspect ratio, so will change when the user switches between landscape and portrait. However, if your application targets API level 12 or lower, then your activity always handles this configuration change itself (this configuration change does not restart your activity, even when running on an Android 3.2 or higher device).
    Added in API level 13.

                当前可用的屏幕尺寸发生改变。这代表了一个改变目前可用大小,相对于当前的长宽比例,当用户横竖屏切换时会发生改变。然而,如果您的应用程序的API级别是12或更低,那么你的Activity会自己处理这个配置变化(在Android 3.2或更高的版本,这个配置更改不会重启你的activity)。

    九十四、

    android ---- ImageUtil工具类


    九十五、判断wifi是否打开:

    [java]  view plain copy
    1. public boolean isWiFiActive() {        
    2.         ConnectivityManager connectivity = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);        
    3.         if (connectivity != null) {        
    4.             NetworkInfo[] infos = connectivity.getAllNetworkInfo();        
    5.             if (infos != null) {        
    6.                 for(NetworkInfo ni : infos){    
    7.                     if(ni.getTypeName().equals("WIFI") && ni.isConnected()){    
    8.                         return true;    
    9.                     }    
    10.                 }    
    11.             }        
    12.         }        
    13.         return false;        
    14.     }     
    15. // .........    
    16. }    

    2、

    [java]  view plain copy
    1. private boolean checkWifi() {    
    2.     boolean isWifiConnect = true;    
    3.     ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);    
    4. [java] view plaincopyprint?  
    5. //check the networkInfos numbers    
    6. NetworkInfo[] networkInfos = cm.getAllNetworkInfo();    
    7. for (int i = 0; i<networkInfos.length; i++) {    
    8.     if (networkInfos[i].getState() == NetworkInfo.State.CONNECTED) {    
    9.        if(networkInfos[i].getType() == cm.TYPE_MOBILE) {    
    10.            isWifiConnect = false;    
    11.        }    
    12.        if(networkInfos[i].getType() == cm.TYPE_WIFI) {    
    13.            isWifiConnect = true;    
    14.        }    
    15.     }    
    16. }    
    17. return isWifiConnect;  

九十六、利用反射获取图片资源

  1. // 用反射机制来获取资源中的图片ID和尺寸  
  2.             Field[] fields = R.drawable.class.getDeclaredFields();  
  3.             for (Field field : fields) {  
  4.                 if (!"icon".equals(field.getName()))// 除了icon之外的图片  
  5.                 {  
  6.                     int index = 0;  
  7.                     try {  
  8.                         index = field.getInt(R.drawable.class);  
  9.                     } catch (IllegalArgumentException e) {  
  10.                         // TODO Auto-generated catch block  
  11.                         e.printStackTrace();  
  12.                     } catch (IllegalAccessException e) {  
  13.                         // TODO Auto-generated catch block  
  14.                         e.printStackTrace();  
  15.                     }  
  16.                     // 保存图片ID  
  17.                     imgList.add(index);  
  18.                 }  
  19.             }  
  20.             // 取得图像大小  
  21.             Bitmap bmImg = BitmapFactory.decodeResource(getResources(),  
  22.                     imgList.get(0));  
  23.             imgWidth = bmImg.getWidth();  
  24.             imgHeight = bmImg.getHeight();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值