Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android AlertDialog對話框自定義風格的另類實現

Android AlertDialog對話框自定義風格的另類實現

編輯:關於Android編程

一、引子
學過Android的同學都知道,對話框的重要程度非常高,任何一款 app幾乎都離不開對話框,值得慶幸的是,對話框的運用在Android中還是相對比較容易的。雖然很簡單,但我在項目中還是碰到些問題,比如,如何實現自定義的對話框NegativeButton的點擊效果、如何改變標題的字體大小和顏色等。

二、分析和實現
下面來看一下下面那張效果圖,微信長按通訊錄時彈出的對話框。
這裡寫圖片描述
我相信,只要是有了一定Android基礎的同學都能實現此功能,就算一時忘記了,稍微google下也是能做出來的;根據效果圖可以看到,系統自帶的alertDialog肯定無法實現這樣的效果,所以得通過自定義xml來實現布局,並在AlertDialog.Builder中調用AlertDialog.Builder.setView(View view)把自定義的布局文件塞進去,代碼也很簡單,直接貼出來。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+MaGid2VjaGF0X2RpYWxvZy54bWw8L3A+CjxwcmUgY2xhc3M9"brush:java;">

在MainActivity中調用

public static void showWeChatTitleDialog(Context context){
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context) ;
        dialogBuilder.create() ;
        LayoutInflater inflater = LayoutInflater.from(context) ;
        View view = inflater.inflate(R.layout.wechat_dialog, null) ;
       dialogBuilder.setView(view) ;
       dialogBuilder.show() ;
}

運行效果就是上圖的效果。到這裡為止,不能說明任何問題,最多只能說明AlertDialog使用起來並不復雜,接下來才是重點;還是先來看一張效果圖
這裡寫圖片描述
也許你會說,這個也很簡單,跟前面那張圖的實現方式一樣,自己寫一個布局,然後通過 setView 把布局設置進去,沒錯,我相信很多人都是這樣實現的。但是我告訴大家,這裡的實現方式不是通過 setView()的方式來實現的,而是通過修改 Android 系統原生的 AlertDialog 中的控件來達到我們想要的效果。這樣做的好處是什麼呢?我們知道,如果是我們自己寫布局文件肯定是需要為最下方的兩個按鈕設置點擊事件,這樣代碼量就非常大;而 AlertDialog 的NegativeButton和PositiveButton已經為我們提供了點擊事件的接口,使用起來非常簡單。
先來看看如何修改NegativeButton的字體顏色?
1、毫無疑問第一步我們先要獲取Button,在 AlertDialog 中有這樣一個方法

public Button getButton(int whichButton) {
        return mAlert.getButton(whichButton);
}

所以 可以通過以下代碼獲取

Button mNegativeButton = mAlertDialog.getButton(AlertDialog.BUTTON_NEGATIVE) ;

2、設置Button的字體顏色為綠色,同時也可以設置點擊狀態

mNegativeButton.setTextColor(0xff45c01a);
mNegativeButton.setBackgroundResource(R.drawable.button_selector);

Button的效果已經實現了,同理另一個按鈕也可以實現,再來看看 title 的字體顏色, 當然也希望能像獲取 Button 一樣,獲取 title,進入 AlertDialog.java找啊,找啊,結果翻了個底朝天,硬是沒有這樣的方法。那怎麼辦?這時候就需要用到 Resources下的一個方法

    public int getIdentifier(String name, String defType, String defPackage) {
        if (name == null) {
            throw new NullPointerException(name is null);
        }
        try {
            return Integer.parseInt(name);
        } catch (Exception e) {
            // Ignore
        }
        return mAssets.getResourceIdentifier(name, defType, defPackage);
    }

這個方法的作用是什麼呢?根據方法名可知,獲取 Identifier,就是獲取識別碼,也就是代碼中唯一的 Id。那這個方法的三個參數又分別代表什麼東西呢?
name:資源文件中所需要操作的名稱
defType:資源文件中操作的類型
defPackage:資源文件所在的包名
這樣說比較難理解,還是舉個例子,如果 defType 類型為 id,那麼 name 就是android:id=”@+id/id_title”中的id_title
接下來就來看看怎麼通過這個方法獲取 alertDialog 的 title
1、獲取 AlertDialog 中的 title

final int titleId = mContext.getResources().getIdentifier(alertTitle,id,android) ;
        TextView titleTxt = (TextView) mAlertDialog.findViewById(titleId);

“alertTitle”為系統alert_dialog.xml布局文件中title控件的 id 名稱android:id=”@+id/alertTitle”,”id”代表獲取的是 id,”android”為系統包名

2、設置 title 的字體顏色為綠色

titleTxt.setTextColor(0xff45c01a);

既然拿到了 title 的 View,就可以隨心所欲的根據我們需求來設置效果。
再來看看這條綠色的線條和中間內容區域的設置

        final int titleDivider = mContext.getResources().getIdentifier(titleDivider,id,android) ;
        View titleDividerImg =  mAlertDialog.findViewById(titleDivider);
        titleDividerImg.setVisibility(View.VISIBLE);
titleDividerImg.setBackgroundColor(0xff45c01a);
        final int contentPanel = mContext.getResources().getIdentifier(contentPanel,id,android) ;
        LinearLayout contentPanelLayout = (LinearLayout) mAlertDialog.findViewById(contentPanel);
        contentPanelLayout.setVisibility(View.VISIBLE);
        final int message = mContext.getResources().getIdentifier(message,id,android) ;
        TextView messageTextView = (TextView) mAlertDialog.findViewById(message);
        messageTextView.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,20,mContext.getResources().getDisplayMetrics()));
        messageTextView.setPadding(20,20,20,20);
        messageTextView.setVisibility(View.VISIBLE);

我們回到獲取NegativeButton的代碼中,其實既然 title 和 titleDivider能通過getIdentifier獲取,button 同樣能通過getIdentifier來獲取,具體實現代碼如下:

        final int button1 = mContext.getResources().getIdentifier(button1,id,android) ;
        Button negativeButton = (Button) mAlertDialog.findViewById(button1);
        negativeButton.setBackgroundResource(R.drawable.button_selector);
        negativeButton.setVisibility(View.VISIBLE);
        negativeButton.setTextColor(0xff45c01a);
        final int button2 = mContext.getResources().getIdentifier(button2,id,android) ;
        Button positiveButton = (Button) mAlertDialog.findViewById(button2);
        positiveButton.setBackgroundResource(R.drawable.button_selector);
        positiveButton.setVisibility(View.VISIBLE);
        positiveButton.setTextColor(0xff45c01a);

可以看到,第二張效果圖,完全是使用的系統自帶的對話框布局實現。
三、歸納
可以看到整篇文章的核心就是

public int getIdentifier(String name, String defType, String defPackage)

掌握了這個方法,對於修改 AlertDialog 就不在話下,當然此方法的用處在這裡只能算的上是冰上一腳。
需要對 AlertDialog 的各個控件熟練運用就必須知道系統的alert_dialog.xml定義了那些 View,alert_dialog.xml的路徑是
//device/apps/common/res/layout/alert_dialog.xml。
四、alert_dialog.xml的源碼


 
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved