Android對話方塊_詳解
android中對話方塊是非常常用的控制元件之一, google也提供了各種自定義對話方塊. 我覺得好多人都太模糊. 所以我全面的總結下.
對話方塊的幾種實現方式:
- Activity
- Popwindow 這個我之前詳細講過可以去看. popwindow詳解
- Dialog
- Fragment
Dialog這個類的使用方式是由Activity來管理和建立. 但是其使用方法已經被廢棄. 所以現在一般直接使用其子類. (這一段我也不確定, 網上對於Dialog的講解很少). 所以Dialog我不講了.
關鍵類
- AlertDialog
- ProgressDialog
- DialogFragment
- Activity
[TOC]
示例
這裡有個關鍵類: AlertDialog.Builder. 屬於構造器模式用法.
這裡演示最簡單的對話方塊
程式碼
1234 | AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("標題"); builder.setMessage("資訊"); builder.show(); |
方法介紹
上面介紹了最基本的AlertDialog的使用. 但是在開發中需要更復雜的功能實現. 所以我會介紹下所有的方法
Builder是屬於AlertDialog的內部類. 負責建立AlertDiglog的構造器. 所以屬於鏈式程式設計.
正因為是構造器模式, AlertDialog的所有方法你都可以直接忽略, Builder已經實現了所有的功能. 並且AlertDialog是Protected許可權無法直接建立物件的.
確定和取消/中立按鈕
雖然叫做確定和取消按鈕, 不過你設定成別的名稱或者功能都可以.
12345678910111213 |
builder.setPositiveButton("確定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // 點選事件的回撥方法 |
左邊按鈕(取消)
12345 | AlertDialog.Builder setPositiveButton (int textId, // 字串陣列資源id DialogInterface.OnClickListener listener)AlertDialog.Builder setPositiveButton (CharSequence text, // 字串 DialogInterface.OnClickListener listener) |
右邊按鈕(確定)
12345 | AlertDialog.Builder setNegativeButton (CharSequence text, DialogInterface.OnClickListener listener)AlertDialog.Builder setNegativeButton (int textId, DialogInterface.OnClickListener listener) |
中立按鈕(隨便你寫啥). 這個按鈕位於取消和確定中間的一個.
12345 | AlertDialog.Builder setNeutralButton (CharSequence text, DialogInterface.OnClickListener listener)AlertDialog.Builder setNeutralButton (int textId, DialogInterface.OnClickListener listener) |
傳統選擇對話方塊
注意所有的條目選擇方法都不能和setMessage同時使用. 否則無效. 並且選中任何條目都將關閉對話方塊.
12345 | AlertDialog.Builder setItems (int itemsId, DialogInterface.OnClickListener listener)AlertDialog.Builder setItems (CharSequence[] items, DialogInterface.OnClickListener listener) |
MaterialDesign單選對話方塊
該對話方塊和傳統的單選對話方塊的區別是選中條目後可以不自動關閉對話方塊. 並且可以設定預設選中的條目.
12345678910111213141516 | AlertDialog.Builder setSingleChoiceItems (int itemsId, // 資源陣列id int checkedItem, // 選中狀態的條目索引. 如果預設不選中任何, 寫-1 DialogInterface.OnClickListener listener)AlertDialog.Builder setSingleChoiceItems (ListAdapter adapter, // 前面提過的介面卡 int checkedItem, DialogInterface.OnClickListener listener)AlertDialog.Builder setSingleChoiceItems (Cursor cursor, // 前面提過的遊標 int checkedItem, String labelColumn, DialogInterface.OnClickListener listener)AlertDialog.Builder setSingleChoiceItems (CharSequence[] items, // 字串陣列 int checkedItem, DialogInterface.OnClickListener listener) |
多選對話方塊
123456789101112 | AlertDialog.Builder setMultiChoiceItems (CharSequence[] items, // 條目陣列 boolean[] checkedItems, // 選擇狀態陣列 ,如果不想預設選中任何, 可寫null DialogInterface.OnMultiChoiceClickListener listener)AlertDialog.Builder setMultiChoiceItems (int itemsId, boolean[] checkedItems, DialogInterface.OnMultiChoiceClickListener listener)AlertDialog.Builder setMultiChoiceItems (Cursor cursor, // 採用遊標的方式 String isCheckedColumn, String labelColumn, DialogInterface.OnMultiChoiceClickListener listener) |
引數介紹:
- items : 沒什麼好講的. 條目的內容
- checkedItems 這是一個布林型別陣列. 對應items的選擇狀態
- listener 回撥監聽器
示例
1234567891011121314151617 | final String[] itemTitles = {"象拔蚌", "鮑魚", "壽桃包"};builder.setMultiChoiceItems(itemTitles, null, new DialogInterface.OnMultiChoiceClickListener() { /** * 在選中對話方塊條目的時候回撥 * @param dialog 對話方塊, 可用於在該回調方法內部呼叫dismiss關閉對話方塊 * @param which 當前被選中的條目索引 * @param isChecked 被選擇狀態 */ public void onClick(DialogInterface dialog, int which, boolean isChecked) { // 吐司 Toast.makeText(MainActivity.this, itemTitles[which], Toast.LENGTH_SHORT).show(); dialog.dismiss(); // 關閉對話方塊 }}); |
介面卡建立對話方塊
相當於使用ListView的介面卡ListAdapter來設定選擇條目的顯示內容. 可以顯示更加豐富的內容.
12 | AlertDialog.Builder setAdapter (ListAdapter adapter, DialogInterface.OnClickListener listener) |
遊標建立對話方塊
123 | AlertDialog.Builder setCursor (Cursor cursor, DialogInterface.OnClickListener listener, String labelColumn) |
建立和顯示
123 | AlertDialog create () // 建立只是返回一個AlertDialog物件. 並不會顯示該對話方塊AlertDialog show () // 直接顯示對話方塊 |
得到上下文
得到建立AlertDialog時所傳入的上下文物件.
1 | Context getContext () |
是否可取消
預設為true, 即點選對話方塊外部會關閉對話方塊. 如果false則不會關閉
1 | AlertDialog.Builder setCancelable (boolean cancelable) |
標題
123 | AlertDialog.Builder setTitle (CharSequence title)AlertDialog.Builder setTitle (int titleId) |
上面的方法標題只是文字的形式而已. 而下面的方法可以在標題的位置自定義任何view物件來顯示.
1 | AlertDialog.Builder setCustomTitle (View customTitleView) |
標題圖示
即在標題的左邊加上一個圖片作為圖示顯示
123 | AlertDialog.Builder setIcon (Drawable icon)AlertDialog.Builder setIcon (int iconId) |
還有一個通過主題的屬性來設定對話方塊圖示. 我不懂
1 | AlertDialog.Builder setIconAttribute (int attrId) |
自定義對話方塊顯示
可以自定義對話方塊顯示任何內容. 注意即使你自定義了對話方塊. 你使用設定確定和取消按鈕
123 | AlertDialog.Builder setView (int layoutResId) // 佈局檔案即可AlertDialog.Builder setView (View view) // View物件 |
監聽器
取消監聽器
取消監聽器是點選對話方塊外部的方式關閉了對話方塊. 呼叫dismiss方法關閉的時候不會回撥
1 | AlertDialog.Builder setOnCancelListener (DialogInterface.OnCancelListener onCancelListener) |
關閉監聽器
該監聽器是在AlertDialog呼叫了dismiss()方法或者點選了對話方塊外部都會回撥的監聽器.
1 | AlertDialog.Builder setOnDismissListener (DialogInterface.OnDismissListener onDismissListener) |
ListAdapter條目監聽器
該方法是你將ListAdapter設為對話方塊條目顯示的時候使用的方法
1 | AlertDialog.Builder setOnItemSelectedListener (AdapterView.OnItemSelectedListener listener) |
按鍵監聽器
可以接受按鍵的事件. 可用於在彈出對話方塊後遮蔽按鍵.
1 | AlertDialog.Builder setOnKeyListener (DialogInterface.OnKeyListener onKeyListener) |
進度對話方塊
除了以上的警示對話方塊的使用外. 還提供一種單獨的對話方塊樣式. 進度條對話方塊. 進度條是計算機應用歷史上一個偉大的發明.
1234 | ProgressDialog progressDialog = new ProgressDialog(this);// 建立進度對話方塊物件progressDialog.setTitle("標題"); // 設定標題progressDialog.setMessage("載入中..."); // 設定訊息progressDialog.show(); // 顯示進度條 |
除了上面這種預設進度條樣式, Google還提供設定樣式水平進度條
12 | progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//ProgressDialog.STYLE_SPINNER 旋轉進度條, 預設就是這種樣式 |
方法介紹
ProgressDialog是AlertDialog的子類. 繼承了其所有方法. 所以這裡我只講新增的方法.
進度設定
既然是進度對話方塊當然提供設定進度的方法, 預設的旋轉進度條樣式是無法設定進度的. 該方法必須在show()後面執行才生效.
123 | int getProgress ()void setProgress (int value) |
最大進度
123 | void setMax (int max)int getMax () |
顯示
可以用父類的show()
方法. 也可以用ProgressDialog新增的靜態方法直接一行程式碼顯示.類似於Toast的用法.
123456789101112131415161718192021 | ProgressDialog show (Context context, // 上下文 CharSequence title, // 標題 CharSequence message) // 訊息內容ProgressDialog show (Context context, CharSequence title, CharSequence message, boolean indeterminate)ProgressDialog show (Context context, CharSequence title, CharSequence message, boolean indeterminate, boolean cancelable)ProgressDialog show (Context context, CharSequence title, CharSequence message, boolean indeterminate, boolean cancelable, DialogInterface.OnCancelListener cancelListener) |
次要進度
類似於你看視訊的時候的快取進度條. 比主進度條的顏色淺一些.
123 | void setSecondaryProgress (int secondaryProgress)int getSecondaryProgress () |
增長進度
和setProgress的區別是該修改是在原有的進度基礎上增加或者減少. 並且不需要在乎在show()方法之前還是之後.
123 | void incrementProgressBy (int diff)void incrementSecondaryProgressBy (int diff) |
不確定狀態進度條
該效果只針對水平進度條. 進度條的狀態顯示在不斷地變化.
12345 | void setIndeterminate (boolean indeterminate) // 預設為false. true開啟效果boolean isIndeterminate () // 是否處於不確定狀態void setIndeterminateDrawable (Drawable d) // 設定一個圖片作為不確定進度的顯示 |
進度樣式
1 | void setProgressStyle (int style) |
包括兩個引數:
- STYLE_HORIZONTAL 水平進度條
- STYLE_SPINNER 環形進度條
設定進度圖片
該方法只有在ProgressDialog為水平樣式時才有效.
1 | void setProgressDrawable (Drawable d) |
格式化
123 | void setProgressNumberFormat (String format)void setProgressPercentFormat (NumberFormat format) |
ProgressBar
ProgressBar是作為控制元件使用的進度條. 且只能寫在佈局檔案中使用. ProgressDialog的實現原理就是建立一個包含了ProgressDialog的View顯示.
進度條對話方塊還可以在佈局檔案中直接寫入作為控制元件, 同時該類只可以在佈局中使用才會顯示. 系統提供的水平進度樣式. StyleProgressBar.Horizontal
12345678 | <ProgressBar style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal" android:progress="50" android:max="100" android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content"//> |
順帶一提, 進度條不能在子執行緒開啟(show)但是可以在子執行緒關閉(dismiss).
DialogFragment
該類屬於Fragment的子類, 也是官方推薦的對話方塊.
由於Dialog物件沒有生命週期方法, 所以在橫豎屏切換等會導致重建生命週期的情況出現時會丟失對話方塊.
如果沒有以上要求建議還是Dialog對話方塊. 因為更加方便簡單.
和一般的Fragment一樣用法.
12345678910111213141516171819202122232425262728 | public class CustomDialogFragment extends DialogFragment { /** * 和一般Fragment的onCreate方法一樣 * * @param inflater * @param container * @param savedInstanceState * @return 返回View物件 */ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return super.onCreateView(inflater, container, savedInstanceState); } /** * 用於在Fragment裡面巢狀Dialog, 和上面的方法兩選一實現即可. * 如果兩個都寫了只有這個方法生效 * * @param savedInstanceState * @return 返回Dialog物件 */ public Dialog onCreateDialog(Bundle savedInstanceState) { return super.onCreateDialog(savedInstanceState); }} |
在Activity裡面顯示
1 | new Dialog().show(getSupportFragmentManager(), "bag"); |
宣告週期方法
這裡介紹的都是用於重寫的週期回撥方法. 注意DialogFragment是Fragment的子類. 包括Fragment的所有生命週期
關閉
當dismiss方法關閉對話方塊時回撥該方法
1 | void onDismiss (DialogInterface dialog) |
取消
點選DialogFragment外部取消對話方塊回撥的方法
1 | void onCancel (DialogInterface dialog) |
呼叫方法
用於呼叫的方法
顯示對話方塊
- 一般的用法顯示DialogFragment, 會作為一般的Fragment巢狀在Activity中
- 使用以下方法將把DialogFragment作為對話方塊彈窗顯示
12345 | void show (FragmentManager manager, String tag) // 標籤. 這些引數其實只要會Fragment都能看懂.int show (FragmentTransaction transaction, String tag) |
關閉對話方塊
1 | void dismiss () |
是否可取消
即點選對話方塊外部是否可以關閉對話方塊
12 | void setCancelable (boolean cancelable)boolean isCancelable () |
得到對話方塊物件
1 | Dialog getDialog () // 得到onCreateDialog方法返回的Dialog物件 |
是否作為對話方塊顯示
如果設為false則將和Fragment一樣建立佈局而不是對話方塊. 這個方法需要在onCreateDialog方法之前執行才有效. 推薦onCreate方法裡面執行 . 不過如果你設為false, DialogFragment的show方法將無效.
該方法沒啥卵用.
123 |
boolean getShowsDialog ()void
相關推薦Android對話方塊_詳解android中對話方塊是非常常用的控制元件之一, google也提供了各種自定義對話方塊. 我覺得好多人都太模糊. 所以我全面的總結下. 對話方塊的幾種實現方式: ActivityPopwindow 這個我之前詳細講過可以去看. popwindow詳解DialogFragmentDialog這個類的使用方 Android中的多種對話方塊樣式詳解轉載於:http://bbs.itheima.com/thread-219659-1-1.html 在Android應用開發中,程式與使用者互動的方式會直接影響到使用者的使用體驗,一直是產品經理們最為注重的部分,而對話方塊又是與使用者互動必不可少的部分。我們經常會需要 Android自定義view詳解this boolean mar 處理 都是 並且 jdk text 命名 從繼承開始 懂點面向對象語言知識的都知道:封裝,繼承和多態,這是面向對象的三個基本特征,所以在自定義View的時候,最簡單的方法就是繼承現有的View 通過上面這段代碼,我定義了一個Ske Android MVC開發框架詳解div ada 2-2 展示 gpo lose 回調接口 cycle recycler 1、目錄根據需要自行添加 adapter 用於RecyclerView、ListView 等各種適配器 fragment 存放fragment model 【轉】Android Camera 相機開發詳解exc troy start 當前 container rac google getconf 對比度 在Android 5.0(SDK 21)中,Google使用Camera2替代了Camera接口。Camera2在接口和架構上做了巨大的變動, 但是基於眾所周知的原因 Android Parcel對象詳解行數 ado state on() 直接 之一 一起 sharp mar 關於Parcel的使用 在分析Parcel之前,首先按照分析流程,介紹下關於Parcel的相關常規使用。 首先是關於Parcel的獲取: Parcel parcle = Parcel.Obtain() Android EventBus3.x 使用詳解(一)led AC target 分解 感覺 div activit .org android事 ?(^∇^*) 五一假期在家無事,新項目中用的是RxJava2+EventBus感覺還不錯,趁這閑暇總結下EventBus 一、概要簡述 EventBus Android-系統/proc目錄詳解/proc是一個虛擬檔案系統,其下面的檔案不是真實存在的,不佔用實際儲存空間。 /proc/cmdline:顯示核心啟動的命令列。 /proc/cpuinfo:顯示系統cpu的資訊。 /proc/filesystems,顯示當前註冊了的檔案系統列表,nodev表示為虛擬檔案系統。 Android FileProvider 屬性配置詳解及FileProvider多節點問題眾所周知在android7.0,修改了對私有儲存的限制,導致在獲取資源的時候,不能通過Uri.fromFile來獲取uri了我們需要適配7.0+的機型需要這樣寫: 1:程式碼適配 if (Build.VERSION.SDK_INT > 23) {// Android 常用的Context詳解1.Context概述 Context是一個抽象類,其通用實現在ContextImpl類中。它的主要作用是一個訪問application環境全域性資訊的介面,通過它可以訪問application的資源和相關的類,其主要功能如下: 啟動Activity android中wifi原理詳解(轉)二:Wifi模組的初始化:: 在 SystemServer 啟動的時候,會生成一個ConnectivityService的例項, try { Log.i(TAG, "Starting Connectivity Service."); ServiceManager.addService(Con android狀態機statemachine詳解分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!   Android小知識-ActivityManagerService詳解(APP啟動過程)前言 AMS(ActivityManagerService)的啟動是在SystemServer程序中啟動的,它的職責是用於和所有APP的四大元件進行通訊,Activity的啟動過程就是APP端與AMS端進行通訊,首先理解的一點是APP端與AMS是在兩個不同的程序中,因此APP端與AMS是通過跨程序通訊的。 Android原始碼目錄結構詳解轉自:http://blog.csdn.net/xiangjai/article/details/9012387 在學習Android的過程中,學習寫應用還好,一開始不用管太多程式碼,直接呼叫函式就可以了,但是工作中卻需要修改到framework之類的東東 所以感覺開始糾結了,又是 Android Butter Knife使用詳解1. 簡介 2. 使用場景程式碼示例 2.1 Activity下使用Butter Knife 2.2 資源類繫結 2.3 非Activity場景——Fragment中繫結 Android中JNI使用詳解(4)---Java與C之間資料型別轉換Jni中基本型別轉換對應的表格 Java型別 本地型別 說明 boolean jboolean 無符號,8位 byte jbyte Android中JNI使用詳解(3)---Android Studio中SO檔案生成Android中JNI使用詳解(2)---Android Studio中SO檔案生成 上一篇寫到過在Android Studio中配置NDK環境地址:Android Studio中NDK環境配置 這篇文章講解在Android Studio中 Android中JNI使用詳解(2)---Android Studio中NDK環境配置Android Studio中的NDK環境配置 1、下載NKD 在Android Studio中選擇File----Settings----Appearance&Behavior---System Settings----Andr Android中JNI使用詳解(1)---Eclipse中NDK配置So檔案生成1、NDK下載和配置 NDK下載地址:http://www.androiddevtools.cn/ NDK下載完成後,選擇Eclipse上方Window選單Preferences - Android - NDK 在NDK&nb Android螢幕適配詳解本篇文章將解釋什麼是螢幕適配,為什麼要螢幕適配,螢幕適配的本質,和如何解決螢幕適配上的問題。(小白也能看懂哦) 什麼是螢幕適配? 螢幕適配就是讓某一個元素或者是APP中的UI介面在不同解析度、不同尺寸的螢幕上展示出同樣的顯示效果,這就是螢幕適配。 為什麼要 |