閱讀134 返回首頁    go iPhone_iPad_Mac_apple


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文檔。

附上參考網站上發現的解決方法:

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

https://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
            android:
            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:    
    font-size:12px;">progressBarStyleLarge"
    android:layout_width="fill_parent"    
    android:layout_height="wrap_content"        
/>

 

長條型的style設置:

<ProgressBar    
    android:    
   
    android:layout_width="fill_parent"    
    android:layout_height="wrap_content"        
/>

 

 

style還有以下幾個選項:




 

 

 

參考: Android預定義樣式  https://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.                              "https://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="https://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.         />  

這樣就可以使用了。

效果如下圖所示:












最後更新:2017-04-03 12:55:19

  上一篇:go Android UI 優化——使用HierarchyViewer工具
  下一篇:go xWorks下的硬盤啟動方法