Android Tricks

简介:

Android Trick 1: 使用View来制作专业的分隔线

如果更高效简单的实现界面中的分隔线呢?

 

[c-sharp] view plain copy
  1. <View  
  2.     android:layout_width="fill_parent"  
  3.     android:layout_height="1px"  
  4.     android:background="?android:attr/listDivider"  
  5. />  

 

这是从Google的某些应用的源代码中发现的。



Android Trick 2: Android中的透明属性的设置

ui设计时,需要指定某个元素的drawable时,有时候需要告诉Android我希望设置它为透明,偶然在源码中发现,就是以下这段代码:

[xhtml] view plain copy
  1. android:background="@android:color/transparent"  


Android Trick 3: GridView动态加载数据情况下,选中状态的实现

GridView使用AdapterView动态加载数据情况下,无论是在onCreate、Onstart、OnResume方法中调用getChildCount()均为0,这说明数据并没有在Activity最初启动后立即加载为GridView的子View,那如果要把GridView实现为Tab风格的菜单,是必须要调用它的状态选中的,如果在Activity中调用的话就会抛nullpointerexception了,那要怎么操作呢?

 

  1. /** 
  2.  * 构造菜单Adapter 
  3.  * @param menuNameArray 名称 
  4.  * @param imageResourceArray 图片 
  5.  * @return FootBarAdapter 
  6.  */  
  7. private FootBarAdapter getMenuAdapter(String[] menuNameArray,  
  8.         int[] imageResourceArray) {  
  9.     ArrayList<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();  
  10.     for (int i = 0; i < menuNameArray.length; i++) {  
  11.         HashMap<String, Object> map = new HashMap<String, Object>();  
  12.         map.put("itemImage", imageResourceArray[i]);  
  13.         map.put("itemText", menuNameArray[i]);  
  14.         data.add(map);  
  15.     }  
  16.     FootBarAdapter footbarAdapter = new FootBarAdapter(this, data,  
  17.             R.layout.item_menu, new String[] { "itemImage""itemText" },  
  18.             new int[] { R.id.item_image, R.id.item_text });  
  19.     return footbarAdapter;  
  20. }  
  21.   
  22. public class FootBarAdapter extends SimpleAdapter {  
  23.     public FootBarAdapter(Context context,  
  24.             List<? extends Map<String, ?>> data, int resource,  
  25.             String[] from, int[] to) {  
  26.         super(context, data, resource, from, to);  
  27.     }  
  28.     @Override  
  29.     public View getView(int position, View convertView, ViewGroup parent) {  
  30.         View v =  super.getView(position, convertView, parent);  
  31.         if (position == TOOLBAR_ITEM_PAGEHOME) {  
  32.             v.setBackgroundResource(R.drawable.bg_toolbar_item_pressed);  
  33.         }  
  34.         return v;  
  35.     }  
  36. }  

 

我们继承了SimplerAdapter,然后Override getView方法,在里边进行选中状态的判断和置背景色为选中色。



Android Trick 5: 正则匹配任意字符,包括换行符的字符串

这是java正则的知识,最近开发android上也碰到了,

匹配任意字符,包括换行符的字符串,发现使用 [.//n]* 就是不行,查了相关资料,以下可以:

 

[//s//S]*

[//w//W]*

[//d//D]*

 


Android Trick 6: PendingIntent的重复问题,当新建的PendingIntent匹配上一个已经存在的PendingIntent时可能不会创建新的。

Android中默认对PendingIntent的创建(如通过PendingIntent.getActivity方式)会进行优化检测,默认的情况下,新创建的PendingIntent如果和原先的基本一样,那么就会使用原先的PendingIntent。

这就导致在目前的项目中,一定间隔的重复给用户发送某类通知,其中带的Intent里的Extra内容不同,但是通知点击后传到一个Activity里的extra消息还是原来的。那么出现做这种问题可以这样解决,在创建PendingIntent时,语句改成如下:

 

  1. PendingIntent contentIntent = PendingIntent.getActivity(this0,  
  2.                     notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);  

注意PendingIntent.FLAG_UPDATE_CURRENT这个参数,关键就是设置了这个参数,在extra发送变化时确定为新的PendingIntent。其他同类参数的用法可进一步参考API文档。

附上参考网站上发现的解决方法:

http://stackoverflow.com/questions/4340431/how-can-i-correctly-pass-unique-extras-to-a-pending-intent

http://stackoverflow.com/questions/4472447/confusing-behavior-when-starting-new-activity-with-pendingintent



Android Trick 7: 把TextView中的文字添加阴影效果及Style的使用

[xhtml] 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="28sp"   
  6.     android:textStyle="bold"   
  7.     android:textColor="#FFFFFF"   
  8.     android:shadowColor="#ff000000"  
  9.     android:shadowDx="2"  
  10.     android:shadowDy="2"       
  11.     android:shadowRadius="1"/>  
 

android:shadowColor 阴影颜色

android:shadowDx 阴影的水平偏移量

android:shadowDy 阴影的垂直偏移量

android:shadowRadius 阴影的范围

 

大多数情况下,某一类的TextView控件需要统一的风格,如加阴影等,那么可以使用style。

 

        <TextView style="@style/StyleBarTitle"
            android:id="@+id/txBarTitle1"
            android:text="资讯行情" />

 

然后在values文件夹下创建styles.xml文件,内容为:

 

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="StyleBarTitle">
        <item name="android:layout_gravity">center_vertical</item>
        <item name="android:layout_width">0dp</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_weight">1</item>
        <item name="android:gravity">center_horizontal</item>
        <item name="android:textSize">@dimen/text_size_vlarge</item>
        <item name="android:textStyle">bold</item>
        <item name="android:textColor">#FFFFFF</item>
        <item name="android:shadowColor">#ff000000</item>
        <item name="android:shadowDx">2</item>
        <item name="android:shadowDy">2</item>
        <item name="android:shadowRadius">1</item>
        <item name="android:background">@null</item>
    </style>
</resources>

 

这样的最大优点是减低代码冗余度,在需要更改某一类控件的样式时,不用一个一个的改过来,只需要更改styles文件中即可。


Android Trick 8: ProgressBar的圆形和长条形设置

默认的progresbar是圆形的旋转动画:

<ProgressBar    
    android:id="@+id/progress1"    
    style="?android:attr/progressBarStyleLarge"
    android:layout_width="fill_parent"    
    android:layout_height="wrap_content"        
/>

 

长条型的style设置:

<ProgressBar    
    android:id="@+id/progress1"    
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="fill_parent"    
    android:layout_height="wrap_content"        
/>

 

 

style还有以下几个选项:

style="?android:attr/progressBarStyleHorizontal"
style="?android:attr/progressBarStyleLarge"
style="?android:attr/progressBarStyleSmall"
style="?android:attr/progressBarStyleSmallTitle"

 

 

 

参考: Android预定义样式  http://apps.hi.baidu.com/share/detail/31068312



Android Trick 10: 一个Android应用的全局数据变量的访问..

在一个Android应用中,我们可以定义一个类,然后使用在类中定义静态成员的方式去创造全局能够访问的数据。如下代码所示:

  1. public class AERunTime {  
  2.     public static String text1 = "example";  
  3. }  

在Activity中就可以使用 AERuntime.text1 访问。这是Java的通用方式,也可以稍微改变一下,使用单例模式getInstance实现。

在Android中,也提供了一种全局数据的访问方式,可以这样实现:

  1. public class AERunTime extends Application {  
  2.     public String text1 = "none";  
  3. }  

然后在AndroidManifest.xml中的<application>标签中填入创建的AERunTime:

[c-sharp] view plain copy
  1. <application  
  2.     android:name=".buzi.AERunTime">  

那么,在程序的Activity中就可以如下方法调用:

  1. ((AERunTime)getApplication()).text1  

如果在通用的Activity中加入以下方法:

  1. protected AERunTime getRT() {  
  2.     return (AERunTime)getApplication();  
  3. }  

那么就可以使用getRT().text1得到。

Application在每次进程启动该应用时被创建。这样,就相当于Android系统中给出的单例模式的封装。


Android Trick 11: 对Android中的AsyncTask进行函数化的封装,简洁调用

为了使UI在数据获取时不僵死,数据获取需要在新开Worker线程中进行,然后将返回结果在UI线程中进行读取并渲染页面。面对这种异步处理,到底如何写才简洁,先后面临过三种实现方式。

首先是最原始的Java方式,new 一个Thread出来,将处理Runnable进去执行,执行完之后通过handler post到ui线程去更新界面。然后发现1.5后有了AsyncTask,非常好用,以后的项目中全部改成衍生出一个AsyncTask的子类,类中自然定义了运行前方法、运行中方法和运行后在ui中运行的方法。目前我做的项目中对AsyncTask做了封装,把它从原本的子类编写的过程,改成了函数调用方式,这就是目前正使用的第三种方法。

clip_image001

一个Android应用中,Activity通常可以建立以上层次关系。然后,在BaseActivity中对AsyncTask进行了封装,形成doAsync方法。方法体内创建一个新的AsyncTask并执行,由于AsyncTask是泛型参数,doAsync方法中传入的接口的参数也对应使用了泛型。至此,一个典型的异步调用的案例如下:

  1. this.doAsync(new Callable<String>() {  
  2.             // 希望异步加载的数据  
  3.             public String call() throws Exception {  
  4.                 String resu = NetworkTool.httpGetURL(  
  5.                              "http://www.baidu.com""GBK");  
  6.                 return resu;  
  7.             }  
  8.         }, new Callback<String>() {  
  9.             // 当加载完成后回调,在UI线程中的操作  
  10.             public void onCallback(final String resu) {  
  11.                 if (null != resu) {  
  12.                     tv_text1.setText(getRT().text1 + resu);  
  13.                 } else {  
  14.                     Tools.ShowNetErr(HomeActivity.this);  
  15.                 }  
  16.             }  
  17.         });  

这样,就从本来继承AsyncTask创建一个子类,然后初始化,然后运行的开发过程转变为了函数调用的过程。可以看到,调用可是简洁了很多!

为了实现它,我们附上BaseActivity中如下封装代码,需要说明的是这不是我的原创,我借鉴于Andengine引擎的实现代码进行的修改。

附源码:

  1. public class ActivityUtils {  
  2.     public static <T> void doAsync(final Context pContext, final int pTitleResID, final int pMessageResID, final Callable<T> pCallable, final Callback<T> pCallback) {  
  3.         ActivityUtils.doAsync(pContext, pTitleResID, pMessageResID, pCallable, pCallback, nullfalse);  
  4.     }  
  5.     public static <T> void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final Callable<T> pCallable, final Callback<T> pCallback) {  
  6.         ActivityUtils.doAsync(pContext, pTitle, pMessage, pCallable, pCallback, nullfalse);  
  7.     }  
  8.     public static <T> void doAsync(final Context pContext, final int pTitleResID, final int pMessageResID, final Callable<T> pCallable, final Callback<T> pCallback, final boolean pCancelable) {  
  9.         ActivityUtils.doAsync(pContext, pTitleResID, pMessageResID, pCallable, pCallback, null, pCancelable);  
  10.     }  
  11.     public static <T> void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final Callable<T> pCallable, final Callback<T> pCallback, final boolean pCancelable) {  
  12.         ActivityUtils.doAsync(pContext, pTitle, pMessage, pCallable, pCallback, null, pCancelable);  
  13.     }  
  14.     public static <T> void doAsync(final Context pContext, final int pTitleResID, final int pMessageResID, final Callable<T> pCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback) {  
  15.         ActivityUtils.doAsync(pContext, pTitleResID, pMessageResID, pCallable, pCallback, pExceptionCallback, false);  
  16.     }  
  17.     public static <T> void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final Callable<T> pCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback) {  
  18.         ActivityUtils.doAsync(pContext, pTitle, pMessage, pCallable, pCallback, pExceptionCallback, false);  
  19.     }  
  20.     public static <T> void doAsync(final Context pContext, final int pTitleResID, final int pMessageResID, final Callable<T> pCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback, final boolean pCancelable) {  
  21.         ActivityUtils.doAsync(pContext, pContext.getString(pTitleResID), pContext.getString(pMessageResID), pCallable, pCallback, pExceptionCallback, pCancelable);  
  22.     }  
  23.     public static <T> void doAsync(final Context pContext, final CharSequence pTitle, final CharSequence pMessage, final Callable<T> pCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback, final boolean pCancelable) {  
  24.         new AsyncTask<Void, Void, T>() {  
  25.             private ProgressDialog mPD;  
  26.             private Exception mException = null;  
  27.             @Override  
  28.             public void onPreExecute() {  
  29.                 this.mPD = ProgressDialog.show(pContext, pTitle, pMessage, true, pCancelable);  
  30.                 if(pCancelable) {  
  31.                     this.mPD.setOnCancelListener(new OnCancelListener() {  
  32.                         @Override  
  33.                         public void onCancel(final DialogInterface pDialogInterface) {  
  34.                             pExceptionCallback.onCallback(new CancelledException());  
  35.                             pDialogInterface.dismiss();  
  36.                         }  
  37.                     });  
  38.                 }  
  39.                 super.onPreExecute();  
  40.             }  
  41.             @Override  
  42.             public T doInBackground(final Void... params) {  
  43.                 try {  
  44.                     return pCallable.call();  
  45.                 } catch (final Exception e) {  
  46.                     this.mException = e;  
  47.                 }  
  48.                 return null;  
  49.             }  
  50.             @Override  
  51.             public void onPostExecute(final T result) {  
  52.                 try {  
  53.                     this.mPD.dismiss();  
  54.                 } catch (final Exception e) {  
  55.                     Log.e("Error", e.toString());  
  56.                 }  
  57.                 if(this.isCancelled()) {  
  58.                     this.mException = new CancelledException();  
  59.                 }  
  60.                 if(this.mException == null) {  
  61.                     pCallback.onCallback(result);  
  62.                 } else {  
  63.                     if(pExceptionCallback == null) {  
  64.                         if (this.mException != null)  
  65.                             Log.e("Error"this.mException.toString());  
  66.                     } else {  
  67.                         pExceptionCallback.onCallback(this.mException);  
  68.                     }  
  69.                 }  
  70.                 super.onPostExecute(result);  
  71.             }  
  72.         }.execute((Void[]) null);  
  73.     }  
  74.     public static <T> void doProgressAsync(final Context pContext, final int pTitleResID, final ProgressCallable<T> pCallable, final Callback<T> pCallback) {  
  75.         ActivityUtils.doProgressAsync(pContext, pTitleResID, pCallable, pCallback, null);  
  76.     }  
  77.     public static <T> void doProgressAsync(final Context pContext, final int pTitleResID, final ProgressCallable<T> pCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback) {  
  78.         new AsyncTask<Void, Integer, T>() {  
  79.             private ProgressDialog mPD;  
  80.             private Exception mException = null;  
  81.             @Override  
  82.             public void onPreExecute() {  
  83.                 this.mPD = new ProgressDialog(pContext);  
  84.                 this.mPD.setTitle(pTitleResID);  
  85.                 this.mPD.setIcon(android.R.drawable.ic_menu_save);  
  86.                 this.mPD.setIndeterminate(false);  
  87.                 this.mPD.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);  
  88.                 this.mPD.show();  
  89.                 super.onPreExecute();  
  90.             }  
  91.             @Override  
  92.             public T doInBackground(final Void... params) {  
  93.                 try {  
  94.                     return pCallable.call(new IProgressListener() {  
  95.                         @Override  
  96.                         public void onProgressChanged(final int pProgress) {  
  97.                             onProgressUpdate(pProgress);  
  98.                         }  
  99.                     });  
  100.                 } catch (final Exception e) {  
  101.                     this.mException = e;  
  102.                 }  
  103.                 return null;  
  104.             }  
  105.             @Override  
  106.             public void onProgressUpdate(final Integer... values) {  
  107.                 this.mPD.setProgress(values[0]);  
  108.             }  
  109.             @Override  
  110.             public void onPostExecute(final T result) {  
  111.                 try {  
  112.                     this.mPD.dismiss();  
  113.                 } catch (final Exception e) {  
  114.                     Log.e("Error", e.getLocalizedMessage());  
  115.                     /* Nothing. */  
  116.                 }  
  117.                 if(this.isCancelled()) {  
  118.                     this.mException = new CancelledException();  
  119.                 }  
  120.                 if(this.mException == null) {  
  121.                     pCallback.onCallback(result);  
  122.                 } else {  
  123.                     if(pExceptionCallback == null) {  
  124.                         Log.e("Error"this.mException.getLocalizedMessage());  
  125.                     } else {  
  126.                         pExceptionCallback.onCallback(this.mException);  
  127.                     }  
  128.                 }  
  129.                 super.onPostExecute(result);  
  130.             }  
  131.         }.execute((Void[]) null);  
  132.     }  
  133.     public static <T> void doAsync(final Context pContext, final int pTitleResID, final int pMessageResID, final AsyncCallable<T> pAsyncCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback) {  
  134.         final ProgressDialog pd = ProgressDialog.show(pContext, pContext.getString(pTitleResID), pContext.getString(pMessageResID));  
  135.         pAsyncCallable.call(new Callback<T>() {  
  136.             @Override  
  137.             public void onCallback(final T result) {  
  138.                 try {  
  139.                     pd.dismiss();  
  140.                 } catch (final Exception e) {  
  141.                     Log.e("Error", e.getLocalizedMessage());  
  142.                     /* Nothing. */  
  143.                 }  
  144.                 pCallback.onCallback(result);  
  145.             }  
  146.         }, pExceptionCallback);  
  147.     }  
  148.       
  149.     public static class CancelledException extends Exception {  
  150.         private static final long serialVersionUID = -78123211381435595L;  
  151.     }  
  152. }  

 

  1. public interface AsyncCallable<T> {  
  2.     // ===========================================================  
  3.     // Final Fields  
  4.     // ===========================================================  
  5.     // ===========================================================  
  6.     // Methods  
  7.     // ===========================================================  
  8.     /** 
  9.      * Computes a result asynchronously, return values and exceptions are to be handled through the callbacks. 
  10.      * This method is expected to return almost immediately, after starting a {@link Thread} or similar. 
  11.      * 
  12.      * @return computed result 
  13.      * @throws Exception if unable to compute a result 
  14.      */  
  15.     public void call(final Callback<T> pCallback, final Callback<Exception> pExceptionCallback);  
  16. }  

 

  1. public interface Callback<T> {  
  2.     // ===========================================================  
  3.     // Final Fields  
  4.     // ===========================================================  
  5.     // ===========================================================  
  6.     // Methods  
  7.     // ===========================================================  
  8.     /** 
  9.      * 当加载完成后回调,加载完毕的事后处理   
  10.      */  
  11.     public void onCallback(final T pCallbackValue);  
  12. }  

 

  1. public interface IProgressListener {  
  2.     // ===========================================================  
  3.     // Constants  
  4.     // ===========================================================  
  5.     // ===========================================================  
  6.     // Methods  
  7.     // ===========================================================  
  8.     /** 
  9.      * @param pProgress between 0 and 100. 
  10.      */  
  11.     public void onProgressChanged(final int pProgress);  
  12. }  

 

  1. public interface IProgressListener {  
  2.     // ===========================================================  
  3.     // Constants  
  4.     // ===========================================================  
  5.     // ===========================================================  
  6.     // Methods  
  7.     // ===========================================================  
  8.     /** 
  9.      * @param pProgress between 0 and 100. 
  10.      */  
  11.     public void onProgressChanged(final int pProgress);  
  12. }  

 

  1. public class BaseActivity extends Activity {  
  2.       
  3.     /** 
  4.      *  
  5.      * @param <T> 模板参数,操作时要返回的内容 
  6.      * @param pCallable 需要异步调用的操作 
  7.      * @param pCallback 回调 
  8.      */  
  9.     protected <T> void doAsync(final Callable<T> pCallable, final Callback<T> pCallback) {  
  10.         ActivityUtils.doAsync(thisnull"内容读取中,请稍等...", pCallable, pCallback, nullfalse);  
  11.     }  
  12.       
  13.     protected <T> void doAsync(final CharSequence pTitle, final CharSequence pMessage, final Callable<T> pCallable, final Callback<T> pCallback) {  
  14.         ActivityUtils.doAsync(this, pTitle, pMessage, pCallable, pCallback, nullfalse);  
  15.     }  
  16.       
  17.     /** 
  18.      * Performs a task in the background, showing a {@link ProgressDialog}, 
  19.      * while the {@link Callable} is being processed. 
  20.      *  
  21.      * @param <T> 
  22.      * @param pTitleResID 
  23.      * @param pMessageResID 
  24.      * @param pErrorMessageResID 
  25.      * @param pCallable 
  26.      * @param pCallback 
  27.      */  
  28.     protected <T> void doAsync(final int pTitleResID, final int pMessageResID, final Callable<T> pCallable, final Callback<T> pCallback) {  
  29.         this.doAsync(pTitleResID, pMessageResID, pCallable, pCallback, null);  
  30.     }  
  31.     /** 
  32.      * Performs a task in the background, showing a indeterminate {@link ProgressDialog}, 
  33.      * while the {@link Callable} is being processed. 
  34.      *  
  35.      * @param <T> 
  36.      * @param pTitleResID 
  37.      * @param pMessageResID 
  38.      * @param pErrorMessageResID 
  39.      * @param pCallable 
  40.      * @param pCallback 
  41.      * @param pExceptionCallback 
  42.      */  
  43.     protected <T> void doAsync(final int pTitleResID, final int pMessageResID, final Callable<T> pCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback) {  
  44.         ActivityUtils.doAsync(this, pTitleResID, pMessageResID, pCallable, pCallback, pExceptionCallback);  
  45.     }  
  46.     /** 
  47.      * Performs a task in the background, showing a {@link ProgressDialog} with an ProgressBar, 
  48.      * while the {@link AsyncCallable} is being processed. 
  49.      *  
  50.      * @param <T> 
  51.      * @param pTitleResID 
  52.      * @param pMessageResID 
  53.      * @param pErrorMessageResID 
  54.      * @param pAsyncCallable 
  55.      * @param pCallback 
  56.      */  
  57.     protected <T> void doProgressAsync(final int pTitleResID, final ProgressCallable<T> pCallable, final Callback<T> pCallback) {  
  58.         this.doProgressAsync(pTitleResID, pCallable, pCallback, null);  
  59.     }  
  60.     /** 
  61.      * Performs a task in the background, showing a {@link ProgressDialog} with a ProgressBar, 
  62.      * while the {@link AsyncCallable} is being processed. 
  63.      *  
  64.      * @param <T> 
  65.      * @param pTitleResID 
  66.      * @param pMessageResID 
  67.      * @param pErrorMessageResID 
  68.      * @param pAsyncCallable 
  69.      * @param pCallback 
  70.      * @param pExceptionCallback 
  71.      */  
  72.     protected <T> void doProgressAsync(final int pTitleResID, final ProgressCallable<T> pCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback) {  
  73.         ActivityUtils.doProgressAsync(this, pTitleResID, pCallable, pCallback, pExceptionCallback);  
  74.     }  
  75.     /** 
  76.      * Performs a task in the background, showing an indeterminate {@link ProgressDialog}, 
  77.      * while the {@link AsyncCallable} is being processed. 
  78.      *  
  79.      * @param <T> 
  80.      * @param pTitleResID 
  81.      * @param pMessageResID 
  82.      * @param pErrorMessageResID 
  83.      * @param pAsyncCallable 
  84.      * @param pCallback 
  85.      * @param pExceptionCallback 
  86.      */  
  87.     protected <T> void doAsync(final int pTitleResID, final int pMessageResID, final AsyncCallable<T> pAsyncCallable, final Callback<T> pCallback, final Callback<Exception> pExceptionCallback) {  
  88.         ActivityUtils.doAsync(this, pTitleResID, pMessageResID, pAsyncCallable, pCallback, pExceptionCallback);  
  89.     }  


Android Trick 12: 简单实现ImageView的加边框颜色的方法

对于一个ImageView,如果我们要加上边框,比如宽为3dp的灰色框,我们怎么做呢?

有种方法,是自己定义一个MyImageView类,继承自ImageView,在其onDraw方法中画canvas。

还有设置一个带有边框的背景图片的方法。


这里给出一种简单方法,既不需要创建衍生的类,也不需要准备图片。采用xml定义的方式实现。

背景定义xml: bg_border1.xml

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android">  
  3.   <solid android:color="#EEEEEE" />  
  4.   <stroke android:width="3dp" android:color="#EEEEEE" />  
  5.   <corners android:radius="0dp" />  
  6.   <padding android:left="0dp" android:top="0dp"   
  7.     android:right="0dp" android:bottom="0dp" />  
  8. </shape>  


在Imageview定义页面上使用代码:

  1. <ImageView android:id="@+id/iv_thumbnail"  
  2.            android:layout_height="63dp"   
  3.            android:layout_width="63dp"  
  4.            android:background="@drawable/bg_border1"  
  5.            android:padding="3dp"  
  6.         />  

这样就可以使用了。

效果如下图所示:












目录
相关文章
|
Android开发
Android 6.0 Marshmallow tips and tricks 棉花糖的技巧和窍门
Since you're reading these lines, chances are you're among the lucky 2 percent of Android users who happen to have Marshmallow running on their smartphone. You've either received an update t
1799 0
|
存储 缓存 数据库
Android develop tricks——整理自国外的一些Blog
ViewDragHelper ——视图拖动是一个比较复杂的问题。这个类可以帮助解决不少问题。如果你需要一个例子,DrawerLayout就是利用它实现扫滑。Flavient Laurent 还写了一些关于这方面的优秀文章。
974 0
|
Android开发
Android Develop Tricks—1
Android Develop Tricks 设置AlertDialog的大小: AlertDialog dialog = builder.setTitle("消息列表") .setView(layout) .create(); dialog.show(); //设置窗口的大小 dialog.getWindow().setLayout(300, 200); dialog.show();一定要放在dialog.getWindow().setLayout(300, 200);的前面,否则不起作用。
862 0
|
Android开发 前端开发 Shell
Android Studio 100 tips and tricks
关于本文 本文是想总结一些Android Studio的使用技巧,对于大多数习惯了使用eclipse的人来说,可能会需要一段时间,但是如果看过下面的一些介绍,你就能体会到Android Studio的强大之处了,不过本文列举的也只是冰山一角,深入了解后会有更多值得你发现的! ps:由于时间关系,...
797 0
|
5天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
10天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
12天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
14天前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
【10月更文挑战第35天】在数字化时代,安卓应用的开发成为了一个热门话题。本文旨在通过浅显易懂的语言,带领初学者了解安卓开发的基础知识,同时为有一定经验的开发者提供进阶技巧。我们将一起探讨如何从零开始构建第一个安卓应用,并逐步深入到性能优化和高级功能的实现。无论你是编程新手还是希望提升技能的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
12天前
|
存储 API 开发工具
探索安卓开发:从基础到进阶
【10月更文挑战第37天】在这篇文章中,我们将一起探索安卓开发的奥秘。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和建议。我们将从安卓开发的基础开始,逐步深入到更复杂的主题,如自定义组件、性能优化等。最后,我们将通过一个代码示例来展示如何实现一个简单的安卓应用。让我们一起开始吧!
|
13天前
|
存储 XML JSON
探索安卓开发:从新手到专家的旅程
【10月更文挑战第36天】在这篇文章中,我们将一起踏上一段激动人心的旅程,从零基础开始,逐步深入安卓开发的奥秘。无论你是编程新手,还是希望扩展技能的老手,这里都有适合你的知识宝藏等待发掘。通过实际的代码示例和深入浅出的解释,我们将解锁安卓开发的关键技能,让你能够构建自己的应用程序,甚至贡献于开源社区。准备好了吗?让我们开始吧!
24 2