Android Tricks-阿里云开发者社区

开发者社区> 开发与运维> 正文

Android Tricks

简介:

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

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

 

[c-sharp] view plaincopy
  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我希望设置它为透明,偶然在源码中发现,就是以下这段代码:

  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的使用

  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 plaincopy
  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.         />  

这样就可以使用了。

效果如下图所示:












版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章