Android常用实用功能代码片大全

转: http://www.it165.NET/pro/html/201504/38370.html?bsh_bid=950898232


  • 一、 获取系统版本号:

     

     

    1. PackageInfo info = this.getPackageManager().getPackageInfo(this.getPackageName(), 0);
    2. int versionCode=nfo.versionCode
    3. string versionName=info.versionNam

     

     

    二、获取系统信息:
    01. String archiveFilePath="sdcard/download/Law.apk";//安装包路径
    02. PackageManager pm = getPackageManager();
    03. PackageInfo info = pm.getPackageArchiveInfo(archiveFilePath, PackageManager.GET_ACTIVITIES);
    04. if(info != null){
    05. ApplicationInfo appInfo = info.applicationInfo;
    06. String appName = pm.getApplicationLabel(appInfo).toString();
    07. String packageName = appInfo.packageName; //得到安装包名称
    08. String version=info.versionName; //得到版本信息
    09. 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);


     

    三、获取安装路径和已安装程序列表
    1. android中获取当前程序路径
    2. getApplicationContext().getFilesDir().getAbsolutePath()
    3. (2)android取已安装的程序列表
    4. List<PackageInfo> packageInfoList = getPackageManager().getInstalledPackages(0);

     

    四、获取图片、应用名、包名
    01. PackageManager pManager = MessageSendActivity.this.getPackageManager();
    02. List<PackageInfo> appList = Utils.getAllApps(MessageSendActivity.this);
    03. for(int i=0;i<appList.size();i++) {
    04. PackageInfo pinfo = appList.get(i);
    05. ShareItemInfo shareItem = new ShareItemInfo();
    06. //set Icon
    07. shareItem.setIcon(pManager.getApplicationIcon(pinfo.applicationInfo));
    08. //set Application Name shareItem.setLabel(pManager.getApplicationLabel(pinfo.applicationInfo).toString());
    09. //set Package Name shareItem.setPackageName(pinfo.applicationInfo.packageName);
    10. }


     

     

    五、解决listview上 Item上有按钮时 item本身不能点击的问题
    1. 1. 在item试图上面添加代码: android:descendantFocusability="blocksDescendants"
    2. 2.在listview里 添加代码 android:focusable="true"

     

     

    六、不让文本框输入中文:
    1. android:digits="1234567890qwertyuiopasdfghjklzxcvbnm`-=[];,./~!@#$%^*()_+}{:?&<>"'"
    2. 这样就不会输入中文了。

    七、获取屏幕宽高
    1. DisplayMetrics displayMetrics = new DisplayMetrics();
    2. this.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    3. int height = displayMetrics.heightPixels;
    4. int width = displayMetrics.widthPixels;

     

     

    八、将TabWidget显示在屏幕下方
    1. 设置TabWidget的属性 android:layout_alignParentBottom="true"

     

     

    九、获取线程ID和线程名称:
    1. Log.v("@@@@@@@@@@",Thread.currentThread().getId()+" "+Thread.currentThread().getName());

     

     

    十、android中调用其它android应用
    1. 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);

    十一、禁止软键盘弹出

     

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

    1. InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
    2. imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

    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)时,虚拟键盘还是不会显示的。

     

     

    十二、模拟器的各种规格与分辨率对照:
    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
    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(其中“apk”为你要安装的那个文件)

     

     

    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);


     

    十六、获取设备型号、SDK版本及系统版本
    1. String device_model = Build.MODEL; // 设备型号 
    2. String version_sdk = Build.VERSION.SDK; // 设备SDK版本 
    3. String version_release = Build.VERSION.RELEASE; // 设备的系统版本

     

    十七、图片分析功能

     

     

    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命令

     

    01. Shutdown命令:
    02. 语法:shutdown[-t秒][-arkhncfF]时间 警告消息
    03. -t:后面加描述表示过几秒之后关机。
    04. -k:不是真的关机,仅仅发出警告消息。
    05. -r:将系统服务停掉之后重启。
    06. -h:将系统服务停掉之后立即关机。
    07. -f:关机并开机之后,强制跳过fsck的磁盘检查。
    08. -F:系统重启之后,强制进行fsck的磁盘检查。
    09. -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掉
    可以在frameworksaseservicesjavacomandroidserveramActivityManagerService.java这个类的forceStopPackage中加一个条件:

     

     

    01. public void forceStopPackage(final String packageName) {
    02. if (checkCallingPermission(android.Manifest.permission.FORCE_STOP_PACKAGES)
    03. != PackageManager.PERMISSION_GRANTED) {
    04. String msg = "Permission Denial: forceStopPackage() from pid="
    05. + Binder.getCallingPid()
    06. ", uid=" + Binder.getCallingUid()
    07. " requires " + android.Manifest.permission.FORCE_STOP_PACKAGES;
    08. Slog.w(TAG, msg);
    09. 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获取焦点:
    1. EditText.requestFoucus()

     

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

     

    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

     

     

    二十二、在Activity里面播放背景音乐
    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文件里面

     

     

    1. <activity 
    2. android:screenOrientation="portrait"
    3. </activity>

     

    第二种,在代码里面

     

    1. setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

     

     

    二十四、使activity全屏显示

     

     

    1. requestWindowFeature(Window.FEATURE_NO_TITLE); 
    2. getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,WindowManager.LayoutParams. FLAG_FULLSCREEN);

     

     

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

     

     

    1. RelativeLayout 里面加上android:clickable="true"

     

     

    二十六、显示或隐藏虚拟键盘
    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);

     

     

    二十七、退出程序时清除通知中信息
    1. NotificationManager nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); 
    2. nm.cancelAll();

     

     

    二十八、创建快捷方式
    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, "点击启动哥的程序");            //设置点击快键图标的响应操作

     

     

    1. intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(this,MainActivity.class)); 
    2. //传递Intent对象给系统 
    3. setResult(RESULT_OK, intent); 
    4. finish();

     

    二十九、获取文件中的类名:
    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()的另外一种形式,可以指定单位

     

    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阴影字体设置

     

    01. <TextView 
    02. android:id="@+id/tvText1"  
    03. android:layout_width="wrap_content"  
    04. android:layout_height="wrap_content"  
    05. android:text="text1"  
    06. android:textSize="30sp"  
    07. android:textStyle="bold"  
    08. android:textColor="#FFFFFF"  
    09. android:shadowColor="#ff0000ff" 
    10. android:shadowDx="5" 
    11. android:shadowDy="5"      
    12. android:shadowRadius="10"/>

    android:shadowColor 阴影颜色

    android:shadowDx 阴影的水平偏移量

    android:shadowDy 阴影的垂直偏移量

    android:shadowRadius 阴影的范围


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

     

    01. <?xml version="1.0" encoding="utf-8"?> 
    02. <resources> 
    03. <style name="textstyle">        
    04. <item name="android:shadowColor">#ff0000ff</item> 
    05. <item name="android:shadowRadius">10</item> 
    06. <item name="android:shadowDx">5</item> 
    07. <item name="android:shadowDy">5</item>      
    08. </style> 
    09. </resources>

    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实现手机震动功能(这个还可以创建一个数组来控制震动,达到震动几秒然后再震动几秒,,你懂得)

     

     

    01. import android.app.Activity; 
    02. import android.app.Service; 
    03. import android.os.Vibrator; 
    04.  
    05. public class TipHelper {  
    06. public static void Vibrate(final Activity activity, long milliseconds) { 
    07. Vibrator vib = (Vibrator) activity.getSystemService(Service.VIBRATOR_SERVICE); 
    08. vib.vibrate(milliseconds); 
    09.
    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 中添加震动权限:

     

     

    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下添加

    1. android:windowSoftInputMode="adjustPan"

       

       

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

       

       

      1. android:descendantFocusability="blocksDescendants"

       

       

      三十九、获取移动设备的IP地址:
      01. public class Tools { 
      02. public static String getLocalIpAddress() {   
      03. try {   
      04. for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {   
      05. NetworkInterface intf = en.nextElement();   
      06. for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {   
      07. InetAddress inetAddress = enumIpAddr.nextElement();   
      08. if (!inetAddress.isLoopbackAddress()) {   
      09. 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进行拖动

       

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

      01. windowParams = new WindowManager.LayoutParams(); 
      02.   windowParams.gravity = Gravity.TOP | Gravity.LEFT; 
      03.   windowParams.x = x - itemWidth / 2
      04.   windowParams.y = y - itemHeight / 2
      05.   windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT; 
      06.   windowParams.width = WindowManager.LayoutParams.WRAP_CONTENT; 
      07.   ImageView iv = new ImageView(getContext()); 
      08.   iv.setImageBitmap(bm); 
      09.   windowManager = (WindowManager) getContext().getSystemService( 
      10.   Context.WINDOW_SERVICE);// "window" 
      11.   windowManager.addView(iv, windowParams);

      拖动效果:

       

      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.   }

       

       

      四十一、数据库写入图片信息:
      01. 数据库中的字段设置为 binary类型
      02. Bitmap bitmap = BitmapFactory.decodeFile(path);
      03. ByteArrayOutputStream baos = new ByteArrayOutputStream();
      04. bitmap.compress(CompressFormat.JPEG, 50, baos);
      05. String sql = "insert into pic_info(pic_data, pic_name,pic_size,send_date,is_success) " +"values(?,?,?,?,?)";
      06. Object[] args = new Object[]{baos.toByteArray(), name, size, now, isSucess};
      07. db.insert(sql, args);
      08. 读取数据库的图片信息:
      09. byte[] picData = cursor.getBlob(cursor.getColumnIndex("pic_data"));
      10. bitmap.setImageBitmap(BitmapFactory.decodeByteArray(picData, 0, picData.length));


       

       

       
      四十二、listView的addView的问题。

       

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

       

       

      四十三、progressBar修改颜色

       

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

      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"/>

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

      先看下效果图:

      \\

      第一种效果:

      在styles.xml中定义

      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方法里面添加:
      1. getWindow().setFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND,WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
      2. setContentView(R.layout.translucent_background);

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

       

       

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

       

      我们都知道EditText与TextView是Android的文本输入框和文本显示框,但是基于手机屏幕的大小因素,如果在需要输入较多文字或者显示较多内容的时候,手机屏幕是远远不够的,因此让文本框具有滚动条的功能是手机上必备的,要加上滚动条,其实很简单,只需要在文本输入框或者文本显示框上面加上滚动条控件即可,该控件名字为ScrollView,以下我们对比下(以TextView举例)。

       

      01. <ScrollView
      02. android:id="@+id/scrollView"
      03. android:layout_width="fill_parent"
      04. android:layout_height="200px"
      05. android:scrollbarStyle="outsideOverlay" android:background="@android:drawable/edit_text">
      06. <TextView
      07. android:layout_width="fill_parent"
      08. android:layout_height="wrap_content"
      09. android:id="@+id/textView"
      10. />
      11. </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文件:
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文件

 

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代码里面:

 

 

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键非退出隐藏到后台

 

 

01. public boolean onKeyDown(int keyCode, KeyEvent event) { 
02. if (keyCode == KeyEvent.KEYCODE_BACK) { 
03. Intent intent = new Intent(Intent.ACTION_MAIN); 
04. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
05. intent.addCategory(Intent.CATEGORY_HOME); 
06. startActivity(intent); 
07. return true
08.
09. return super.onKeyDown(keyCode, event); 
10. }

 

 

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

 

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

 

五十七、获取view在屏幕中的位置:
1. int[] points = { 00 };
2. view.getLocationInWindow(points);

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

 

 

五十八、在图形中添加文字
01. @Override
02. protected synchronized void onDraw(Canvas canvas) {
03. super.onDraw(canvas);
04. Rect rect = new Rect();
05. this.mPaint.getTextBounds(this.text, 0this.text.length(), rect);
06. int x = (getWidth() / 2) - rect.centerX();
07. int y = (getHeight() / 2) - rect.centerY();
08. canvas.drawText(this.text, x, y, this.mPaint);
09. }


 

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

 

01. @Override
02. public boolean onTouchEvent(MotionEvent event) {
03.  
04. if(event.getAction() == MotionEvent.ACTION_DOWN){
05. vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
06. long[] pattern = {80040,40030}; // OFF/ON/OFF/ON...
07. vibrator.vibrate(pattern, 2);//-1不重复,非-1为从pattern的指定下标开始重复
08. }
09. return super.onTouchEvent(event);
10. }

 

 

 

六十、界面重绘

 

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

 

六十一、Android创建桌面快捷方式:
01. /**
02. * 为程序创建桌面快捷方式
03. */
04. private void addShortcut(){ 
05. Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT"); 
06.  
07. //快捷方式的名称 
08. shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name)); 
09. 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. }

 

需要声明权限

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.FILTE

 

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

 

 

01. public class SDFileExplorer extends Activity{
02. ListView listView;
03. TextView textView;
04. // 记录当前的父文件夹
05. File currentParent;
06. // 记录当前路径下的所有文件的文件数组
07. File[] currentFiles;
08.  
09. @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
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全选内容

 

01. percent.setOnTouchListener(this);
02.  
03. @Override
04. public boolean onTouch(View v, MotionEvent event) {
05. if(v.getId()==R.id.seekPercent) {
06. percent.selectAll();
07. InputMethodManager imm = (InputMethodManager)
08. context.getSystemService(Context.INPUT_METHOD_SERVICE);
09. imm.showSoftInput(v, 0);
10. return true;
11. }
12. return false;
13. }

 

六十六、Android设置图片圆角
01. /**
02. * 将图片设置为圆角
03. */
04. public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {
05. Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
06. bitmap.getHeight(), Config.ARGB_8888);
07. Canvas canvas = new Canvas(output);
08. final int color = 0xff424242;
09. 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. }

 

 

六十七、把图片转换成圆形
01. bitmap = ((BitmapDrawable)imageView1.getDrawable()).getBitmap();
02. bitmap = getRoundedCornerBitmap(bitmap);
03. imageView1.setImageBitmap(bitmap);
04.  
05. public static Bitmap getRoundedCornerBitmap(Bitmap bitmap) {
06. Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
07. bitmap.getHeight(), Config.ARGB_8888);
08. Canvas canvas = new Canvas(output);
09.  
10. final int color = 0xff424242;
11. final Paint paint = new Paint();
12. final Rect rect = new Rect(00, 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(0000);
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资源。

01. <pre name="code" class="html">    <?xml version="1.0" encoding="utf-8"?> 
02. <resources> 
03. <string name="hello">Hello World, Resource_Plurals!</string> 
04. <string name="app_name">Resource_Plurals</string> 
05. <plurals name="student"
06. <item quantity="one">There is 1 student</item> 
07. <item quantity="other">There are %d  students</item> 
08. </plurals> 
09. </resources>



在Java代码中获取定义的plurals资源

 

01. public class Resource_Plurals extends Activity { 
02. /** Called when the activity is first created. */ 
03. @Override 
04. public void onCreate(Bundle savedInstanceState) { 
05. super.onCreate(savedInstanceState); 
06. setContentView(R.layout.main); 
07.  
08. Resources r = getResources(); 
09. 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解析类
001. import java.lang.reflect.Method; 
002. import java.util.Collection; 
003. import java.util.Map; 
004. import java.util.Set; 
005. public final class JsonUtil{ 
006. /**
007. * 把对象封装为JSON格式
008. *
009. * @param o
010. * 对象
011. * @return JSON格式
012. */ 
013. @SuppressWarnings"unchecked") 
014. public static String toJson(final Object o){ 
015. if (o == null){ 
016. return "null"; 
017.
018. if (o instanceof String) //String{ 
019. return string2Json((String) o); 
020.
021. if (o instanceof Boolean) //Boolean{ 
022. return boolean2Json((Boolean) o); 
023.
024. if (o instanceof Number) //Number{ 
025. return number2Json((Number) o); 
026.
027. if (o instanceof Map) //Map{ 
028. return map2Json((Map<String, Object>) o); 
029.
030. if (o instanceof Collection) //List Set{ 
031. return collection2Json((Collection) o); 
032.
033. if (o instanceof Object[]) //对象数组{ 
034. return array2Json((Object[]) o); 
035.
036. if (o instanceof int[])//基本类型数组 
037.
038. return intArray2Json((int[]) o); 
039.
040. if (o instanceof boolean[])//基本类型数组 
041.
042. return booleanArray2Json((boolean[]) o); 
043.
044. if (o instanceof long[])//基本类型数组 
045.
046. return longArray2Json((long[]) o); 
047.
048. if (o instanceof float[])//基本类型数组 
049.
050. return floatArray2Json((float[]) o); 
051.
052. if (o instanceof double[])//基本类型数组 
053.
054. return doubleArray2Json((double[]) o); 
055.
056. if (o instanceof short[])//基本类型数组 
057.
058. return shortArray2Json((short[]) o); 
059.
060. if (o instanceof byte[])//基本类型数组 
061.
062. return byteArray2Json((byte[]) o); 
063.
064. if (o instanceof Object) //保底收尾对象 
065.
066. return object2Json(o); 
067.
068. throw new RuntimeException("不支持的类型: " + o.getClass().getName()); 
069.
070. /**
071. * 将 String 对象编码为 JSON格式,只需处理好特殊字符
072. *
073. * @param s
074. * String 对象
075. * @return JSON格式
076. */ 
077. static String string2Json(final String s) 
078.
079. final StringBuilder sb = new StringBuilder(s.length() + 20); 
080. sb.append('"'); 
081. for int i = 0; i < s.length(); i++) 
082.
083. final char c = s.charAt(i); 
084. switch (c) 
085.
086. case '"': 
087. sb.append("\""); 
088. break; 
089. case '\': 
090. sb.append("\\"); 
091. break; 
092. case '/': 
093. sb.append("\/"); 
094. break; 
095. case '': 
096. sb.append("\b"); 
097. break; 
098. case ' ': 
099. sb.append("\f"); 
100. break; 
101. case '
102. ': 
103. sb.append("\n"); 
104. break; 
105. case '
106. ': 
107. sb.append("\r"); 
108. break; 
109. case '  ': 
110. sb.append("\t"); 
111. break; 
112. default: 
113. sb.append(c); 
114.
115.
116. sb.append('"'); 
117. return sb.toString(); 
118.
119. /**
120. * 将 Number 表示为 JSON格式
121. *
122. * @param number
123. * Number
124. * @return JSON格式
125. */ 
126. static String number2Json(final Number number) 
127.
128. return number.toString(); 
129.
130. /**
131. * 将 Boolean 表示为 JSON格式
132. *
133. * @param bool
134. * Boolean
135. * @return JSON格式
136. */ 
137. static String boolean2Json(final Boolean bool) 
138.
139. return bool.toString(); 
140.
141. /**
142. * 将 Collection 编码为 JSON 格式 (List,Set)
143. *
144. * @param c
145. * @return
146. */ 
147. static String collection2Json(final Collection<Object> c) 
148.
149. final Object[] arrObj = c.toArray(); 
150. return toJson(arrObj); 
151.
152. /**
153. * 将 Map<String, Object> 编码为 JSON 格式
154. *
155. * @param map
156. * @return
157. */ 
158. static String map2Json(final Map<String, Object> map) 
159.
160. if (map.isEmpty()) 
161.
162. return "{}"; 
163.
164. final StringBuilder sb = new StringBuilder(map.size() << 4); //4次方 
165. sb.append('{'); 
166. final Set<String> keys = map.keySet(); 
167. for final String key : keys) 
168.
169. final Object value = map.get(key); 
170. sb.append('"'); 
171. sb.append(key); //不能包含特殊字符 
172. sb.append('"'); 
173. sb.append(':'); 
174. sb.append(toJson(value)); //循环引用的对象会引发无限递归 
175. sb.append(','); 
176.
177. // 将最后的 ',' 变为 '}': 
178. sb.setCharAt(sb.length() - 1, '}'); 
179. return sb.toString(); 
180.
181. /**
182. * 将数组编码为 JSON 格式
183. *
184. * @param array
185. * 数组
186. * @return JSON 格式
187. */ 
188. static String array2Json(final Object[] array) 
189.
190. if (array.length == 0) 
191.
192. return "[]"; 
193.
194. final StringBuilder sb = new StringBuilder(array.length << 4); //4次方 
195. sb.append('['); 
196. for final Object o : array) 
197.
198. sb.append(toJson(o)); 
199. sb.append(','); 
200.
201.  
202. // 将最后添加的 ',' 变为 ']': 
203. sb.setCharAt(sb.length() - 1, ']'); 
204. return sb.toString(); 
205.
206. static String intArray2Json(final int[] array) 
207.
208. if (array.length == 0) 
209.
210. return "[]"; 
211.
212. final StringBuilder sb = new StringBuilder(array.length << 4); 
213. sb.append('['); 
214. for final int o : array) 
215.
216. sb.append(Integer.toString(o)); 
217. sb.append(','); 
218.
219. // set last ',' to ']': 
220. sb.setCharAt(sb.length() - 1, ']'); 
221. return sb.toString(); 
222.
223. static String longArray2Json(final long[] array) 
224.
225. if (array.length == 0) 
226.
227. return "[]"; 
228.
229. final StringBuilder sb = new StringBuilder(array.length << 4); 
230. sb.append('['); 
231. for final long o : array) 
232.
233. sb.append(Long.toString(o)); 
234. sb.append(','); 
235.
236. // set last ',' to ']': 
237. sb.setCharAt(sb.length() - 1, ']'); 
238. return sb.toString(); 
239.
240. static String booleanArray2Json(final boolean[] array) 
241.
242. if (array.length == 0) 
243.
244. return "[]"; 
245.
246. final StringBuilder sb = new StringBuilder(array.length << 4); 
247. sb.append('['); 
248. for final boolean o : array) 
249.
250. sb.append(Boolean.toString(o)); 
251. sb.append(','); 
252.
253. // set last ',' to ']': 
254. sb.setCharAt(sb.length() - 1, ']'); 
255. return sb.toString(); 
256.
257. static String floatArray2Json(final float[] array) 
258.
259. if (array.length == 0) 
260.
261. return "[]"; 
262.
263. final StringBuilder sb = new StringBuilder(array.length << 4); 
264. sb.append('['); 
265. for final float o : array) 
266.
267. sb.append(Float.toString(o)); 
268. sb.append(','); 
269.
270. // set last ',' to ']': 
271. sb.setCharAt(sb.length() - 1, ']'); 
272. return sb.toString(); 
273.
274. static String doubleArray2Json(final double[] array) 
275.
276. if (array.length == 0) 
277.
278. return "[]"; 
279.
280. final StringBuilder sb = new StringBuilder(array.length << 4); 
281. sb.append('['); 
282. for final double o : array) 
283.
284. sb.append(Double.toString(o)); 
285. sb.append(','); 
286.
287. // set last ',' to ']': 
288. sb.setCharAt(sb.length() - 1, ']'); 
289. return sb.toString(); 
290.
291. static String shortArray2Json(final short[] array) 
292.
293. if (array.length == 0) 
294.
295. return "[]"; 
296.
297. final StringBuilder sb = new StringBuilder(array.length << 4); 
298. sb.append('['); 
299. for final short o : array) 
300.
301. sb.append(Short.toString(o)); 
302. sb.append(','); 
303.
304. // set last ',' to ']': 
305. sb.setCharAt(sb.length() - 1, ']'); 
306. return sb.toString(); 
307.
308. static String byteArray2Json(final byte[] array) 
309.
310. if (array.length == 0) 
311.
312. return "[]"; 
313.
314. final StringBuilder sb = new StringBuilder(array.length << 4); 
315. sb.append('['); 
316. for final byte o : array) 
317.
318. sb.append(Byte.toString(o)); 
319. sb.append(','); 
320.
321. // set last ',' to ']': 
322. sb.setCharAt(sb.length() - 1, ']'); 
323. return sb.toString(); 
324.
325. public static String object2Json(final Object bean) 
326.
327. //数据检查 
328. if (bean == null) 
329.
330. return "{}"; 
331.
332. final Method[] methods = bean.getClass().getMethods(); //方法数组 
333. final StringBuilder sb = new StringBuilder(methods.length << 4); //4次方 
334. sb.append('{'); 
335. for final Method method : methods) 
336.
337. try 
338.
339. final String name = method.getName(); 
340. String key = ""; 
341. if (name.startsWith("get")) 
342.
343. key = name.substring(3); 
344. //防死循环 
345. final String[] arrs = 
346. "Class" }; 
347. boolean bl = false; 
348. for final String s : arrs) 
349.
350. if (s.equals(key)) 
351.
352. bl = true; 
353. continue; 
354.
355.
356. if (bl) 
357.
358. continue; //防死循环 
359.
360.
361. else if (name.startsWith("is")) 
362.
363. key = name.substring(2); 
364.
365. if (key.length() > 0 && Character.isUpperCase(key.charAt(0)) && method.getParameterTypes().length == 0) 
366.
367. if (key.length() == 1) 
368.
369. key = key.toLowerCase(); 
370.
371. else if (!Character.isUpperCase(key.charAt(1))) 
372.
373. key = key.substring(0, 1).toLowerCase() + key.substring(1); 
374.
375. final Object elementObj = method.invoke(bean); 
376. //System.out.println("###" + key + ":" + elementObj.toString()); 
377. sb.append('"'); 
378. sb.append(key); //不能包含特殊字符 
379. sb.append('"'); 
380. sb.append(':'); 
381. sb.append(toJson(elementObj)); //循环引用的对象会引发无限递归 
382. sb.append(','); 
383.
384.
385. catch final Exception e) 
386.
387. //e.getMessage(); 
388. throw new RuntimeException("在将bean封装成JSON格式时异常:" + e.getMessage(), e); 
389.
390.
391. if (sb.length() == 1) 
392.
393. return bean.toString(); 
394.
395. else 
396.
397. sb.setCharAt(sb.length() - 1, '}'); 
398. return sb.toString();} 
399.
400. private JsonUtil(){ 
401.
402. }

 

 

七十一、android自动跳转

 

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

第一种方法:

 

01. Timer timer = new Timer();
02.  
03. TimerTask timerTask = new TimerTask() {
04.  
05. @Override
06. public void run() {
07. // 你要干的活
08.  
09. }
10. };
11. timer.schedule(timerTask, 1000 2); //2秒后执行

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

 

第二种方法:

01. private final int SPLASH_DISPLAY_LENGHT = 2000;
02.  
03. @Override
04. public void onCreate(Bundle savedInstanceState) {
05. super.onCreate(savedInstanceState);
06. this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
07. WindowManager.LayoutParams.FLAG_FULLSCREEN); 
08. setContentView(R.layout.splash);
09. 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颜色设置

 

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

 

 

七十四、Button使用Shape
01. <?xml version="1.0" encoding="utf-8"?>
02. <selector
04. <item android:state_pressed="true" >
05. <shape>
06. <gradient
07. android:startColor="#ff8c00"
08. android:endColor="#FFFFFF"
09. 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顾名思义就是层图形对象。下面直接用一个简单的代码表示:

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出现三次,这个解决方案我暂时只想到两种方案:

01. 1:就是在contetnobserver类里定义一个变量 int count=0;
02.  
03. @Override
04.  
05. public void onChange(boolean selfChange) {
06.  
07. count++;
08.  
09. //调用第三次才是已发信息
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屏幕解锁和点亮屏幕

 

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

01. KeyguardManager  km= (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); //得到键盘锁管理器对象
02. KeyguardLock kl = km.newKeyguardLock("unLock"); //参数是LogCat里用的Tag
03.  
04. kl.disableKeyguard(); //解锁
05.  
06. PowerManager pm=(PowerManager) getSystemService(Context.POWER_SERVICE);//获取电源管理器对象
07. PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK, "bright");
08. //获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是LogCat里用的Tag
09. 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中间隔断线
1. 方法1:listView.setDividerHeight(0);
2. 方法2this.getListView().setDivider(null);
3. 方法3:android:divider="@null"
4.  
5. android:cacheColorHint="#00000000" 设置其为透明!! 默认为黑色!!!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值