android全局的dialog
㈠ android獲取當前頁面的dialog
android獲取當前頁面的dialog的方法。
1、AndroidSupportLibrary23.2里的DesignSupportLibrary新加了一個BottomSheets控制項,一個底部的Dialog表。
2、peekHeight是當BottomSheets關閉的時候,底部下表我們能看到的高度,hideable是當拖拽下拉的時候,bottomsheet是否能全部隱藏。
3、需要監聽BottomSheets回調的狀態,可以通過setBottomSheetCallback來實現,onSlide方法是拖拽中的回調,根據slideOffset可以做一些動畫onStateChanged方法可以監聽到狀態的改變,State總共有5種。
4、實現的思路是通過附加一個BottomSheetBehavior給CoordinatorLayout的子視圖,通過對其behavior的state進行設置更改不同的狀態。
㈡ Android 全局彈窗(Dialog)快速實現
項目中 雲信IM同一帳號,在多處登錄時,要實現互踢功能。
在收到被踢通知時,彈窗提示用戶被踢,點擊繼續跳轉到登錄界面,取消則關閉App
由於不知道用戶會在哪個界面操作時被踢,接受通知的那個Activity有可能已經失去上下文,導致空指針異常!從而無法 Toast 或 彈窗。
能實現 全局Dialog 就好了!
由於退出App的時候,要清除之前所有的Activity,其實就是退出登錄功能。
我採用 集合法 來實現的退出登錄 ,在BaseActivity中記錄所有打開過的Activity,然後遍歷清除。
然後在 BaseActivity 中調用 addActivity() ,不在贅述!
如果能獲取到用戶當前觀看的界面,然後將上下文傳過去,就可以實現全局Dialog
當前頁面也就是棧頂Activity,也就是最後添加的那個Activity。如下:
然後在使用的地方獲取
即:
注意:之所以返回AppCompatActivity,而不是Activity,
是因為彈出Dialog 需要 supportFragmentManager ,Activity 獲取不到
以上就可以實現全局Dialog了。
另外,上述Dialog是用DialogFragment寫的,感興趣可閱 《DialogFragment 去除內容區稜角背景(不規則圓角)》 ,附有工具類及用法。
㈢ 安卓怎麼修改系統「DIALOG」風格
1、編寫一個文本樣式。
DIALOG的標題是一個textview,在sytles.xml中,添加如下代碼來設置你自己的文本樣式:
?
2、設置對弊虛話框的標題主題。
上面的標題文本並不能直接設置為對話框的標題樣式。 我們還需要編寫一個表示標題的主題的style,在這里指定標題的文本樣式。代碼如下:
?
3、設置對話框主題。
接下來,我們編寫我們的對話框主題,在這里指定標題的主題。由於一些屬性並不是public的,所以我們需要繼承自原來的某個style,代碼如下:
?
4、自定義App的主題。
接下來,我們需要在我們的App theme中指定我們的對話框使用這種主題,所以需要定義一個App theme。同樣由於App theme的許多屬性並不是public的(比如下面要提到的標題下面的那條藍線),所以我們要繼承自一個原生的style。這里我根據程序需要選擇了Theme.Holo.Light.NoActionBar,代碼如下:
?
5、指定App主題。
最後一步,我們需要在AndroidManifest.xml文件中,指定我們的app主題。這步很簡單,只需要在application標簽中指定android:theme的值即可,如下:
?
android:theme="@style/ParkingTheme"
不過這只是指定了Dialog的主題。如果是通過AlertDialog創建出來的對話框,主題還是原來的。所以我們還需要以下步驟。
7、編寫AlertDialog主題。
我們無法直接繼承系統主題里的AlertDialog的style。如把parent指定為Theme.DeviceDefault.Dialog.Alert,Theme.Holo.Dialog.Alert,Theme.DeviceDefault.Light.Dialog.Alert或Theme.Holo.Light.Dialog.Alert,都會導致編譯不過。所以我們需要繼承自Dialog的style。在這里我以Theme.Holo.Light.Dialog為例,代碼如下:
在這里我參考了原生的alertDialog的style,設定了窗口背景為透明,以及windowContentOverlay為null這兩個重要屬性,否則你會看到在AlertDialog下面還有一層對話框的背景,或者是對話框的背景遮住了所有內容這樣的問題存在。
8、指定AlertDialog的主題。
我們需要在第4步所說的自定義的AppTheme中,添加一行代碼來指定要使用的AlertDialog的style,代碼如下:
?
9、修改標題下面的藍色線。
如果你修改了對話框的主題顏色,那麼標題下面的藍色的線肯定會讓你很郁悶。如果對話框較少,你可以選擇隱藏標題,然後自定義一個包含了標題的View來設置為對話框的內容。但是如果你的對話框有許多種,判悔而且本來都是可以調用原來的API就來生成的話,要去定義這么多個帶標題的view,這樣做下來心裡肯定是很糾結的。
標題下面的藍色的線,並不是在Dialog或AlertDialog中設置或通過它們的style中定義的。它是定義在各種風格的dialog的layout當中,然後再在AppTheme裡面指掘卜正定dialog的對應屬性。遺憾的是,目前我看到這幾個相關屬性還不是public的,不能自己設置,所以只有通過Java代碼來實現了。
表示這條藍色的線的叫做titleDivider,我們可以通過getResources()的API來獲取它的IP,然後設置顏色。代碼如下:
?
public static final void dialogTitleLineColor(Dialog dialog, int color) {
Context context = dialog.getContext();
int divierId = context.getResources().getIdentifier("android:id/titleDivider", null, null);
View divider = dialog.findViewById(divierId);
divider.setBackgroundColor(color);
}這行代碼對於自定義的Dialog,可以在setContentView之後調用。但是對於AlertDialog,必須在show()方法被調用之後才可以去調用,否則會報錯。
㈣ android中Dialog和PopupWindow的區別
1. Android的對話框有兩種:PopupWindow和AlertDialog。 它們的不同點在於:AlertDialog的位置固定,而PopupWindow的位置可以隨意 AlertDialog是非阻塞線程的,AlertDialog彈出的時候,後台可是還可以做其他事情的哦。 而PopupWindow是阻塞線程的, 這就意味著在我們退出這個彈出框之前,程序會一直等待 PopupWindow的位置按照有無偏移分,可以分為偏移和無偏移兩種;按照參照物的不同,可以分為相對於某個控制項(Anchor錨)和相對於父控制項。具體如下 showAsDropDown(View anchor):相對某個控制項的位置(正左下方),無偏移 showAsDropDown(View anchor, int xoff, int yoff):相對某個控制項的位置,有偏移 showAtLocation(View parent, int gravity, int x, int y):相對於父控制項的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以設置偏移或無偏移 LayoutInflater layoutInflater = LayoutInflater.from(this); View popupWindow = layoutInflater.inflate(R.layout.popup, null);
㈤ android中Dialog和PopupWindow的區別
Android中的對話框有兩種:PopupWindow和AlertDialog。它們都可以實現彈窗功能,但是他們之間有一些差別,下面總結了一點。 (1)Popupwindow在顯示之前一定要設置寬高,Dialog無此限制。 (2)Popupwindow默認不會響應物理鍵盤的back,除非顯示設置了popup.setFocusable(true);而在點擊back的時候,Dialog會消失。 (3)Popupwindow不會給頁面其他的部分添加蒙層,而Dialog會。 (4)Popupwindow沒有標題,Dialog默認有標題,可以通過dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);取消標題 (5)二者顯示的時候都要設置Gravity。如果不設置,Dialog默認是Gravity.CENTER。 (6)二者都有默認的背景,都可以通過setBackgroundDrawable(new ColorDrawable(android.R.color.transparent));去掉。 其中最本質的差別就是:AlertDialog是非阻塞式對話框:AlertDialog彈出時,後台還可以做事情;而PopupWindow是阻塞式對話框:PopupWindow彈出時,程序會等待,在PopupWindow退出前,程序一直等待,只有當我們調用了dismiss方法的後,PopupWindow退出,程序才會向下執行。這兩種區別的表現是:AlertDialog彈出時,背景是黑色的,但是當我們點擊背景,AlertDialog會消失,證明程序不僅響應AlertDialog的操作,還響應其他操作,其他程序沒有被阻塞,這說明了AlertDialog是非阻塞式對話框;PopupWindow彈出時,背景沒有什麼變化,但是當我們點擊背景的時候,程序沒有響應,只允許我們操作PopupWindow,其他操作被阻塞。 我們在寫程序的過程中可以根據自己的需要選擇使用Popupwindow或者是Dialog。
㈥ 【譯】Android材質組件的動手實踐:Dialogs
Android MDC 系列文章:
這篇文章將介紹 Dialogs 組件的功能和API。要了解如何處理Android的Material Components的初始設置(包括Gradle依賴關系和創建應用程序主題),請參閱我的原始文章:
為Android設置Material Components主題
對話框是組件,通常帶有模式窗口,顯示在應用程序內容的前面。它們用於告知用戶可能包含關鍵信息和/或需要做出決定的任務。它們有目的地打斷電流,並一直顯示在屏幕上,直到被解散或採取措施為止,因此應謹慎使用。
從設計的角度來看,可以在不同的場景中使用三種主要類型的對話框:
上面所有這些都具有共同的特徵:遮蓋應用程序內容的背景稀鬆布(可以選擇輕按以關閉對話框)和表面容器。
注意:存在第四種類型: 全屏對話框 。為此, 官方文檔 建議使用 *DialogFragment* 和資源限定符一起確定其顯示方式。這不在本文的討論范圍之內,因此不會涉及。
可以使用來實現所有上述對話框類型 MaterialAlertDialogBuilder 。該構建器類 AlertDialog 使用Material Design規范和主題來配置和實例化。
顯示對話框的基本方法如下:
配置更改(例如設備旋轉)後,上述方法將不會保留對話框。為了實現這一點,我們需要花一段 DialogFragment 時間使用 MaterialAlertDialogBuilder 來提供 Dialog :
DialogFragment 可以使用 導航體系結構組件 顯示,也可以通過 Fragment 或 Activity 通過以下方式手動顯示:
可以通過將參數傳遞給來實現上面(和更多)三種對話框中列出的所有特徵 MaterialAlertDialogBuilder 。下面列出了其中一些。
注意:在以下大多數情況下,將使用硬編碼值。該構建器還提供資源ID的重載。
注意:對話框的中間區域可以被支持文本或一組特定類型的項目佔用。這些不能合並。
存在幾個主題疊加層,用於更改對話框的總體布局。這些主題覆蓋變體繼承自 ThemeOverlay.MaterialComponents.MaterialAlertDialog ,每個都有一個可選的後綴:
實施全局自定義Material AlertDialog 主題疊加層時,請在您的應用程序主題中使用 materialAlertDialogTheme 屬性引用它。
另外,還有一個輔助 MaterialAlertDialogBuilder 構造函數,它接受覆蓋的主題資源ID:
可以使用三個「材料主題」子系統為主題設置「材料警報」對話框: 顏色 , 版式 和 形狀 。我們已經在上面的 「選擇主題疊加層」 部分中顯示了要使用 的主題疊加層 。除此之外, AlertDialog 可以通過擴展樣式並使用屬性 在 主題疊加層中引用自定義樣式。 MaterialAlertDialog.MaterialComponents``alertDialogStyle
有沒有具體的屬性自定義在一個對話框中使用的顏色,但 colorPrimary , colorSecondary , colorSurface 和各自的「關於」在您的應用程序使用的主題會自動調整對話框顏色顏色改變時。
對話框文本元素將採用 fontFamily 您在應用程序主題中定義的屬性。操作按鈕的樣式將根據 textAppearanceButton 您在應用主題中設置的樣式進行設置。
在主題疊加層中,您還可以使用 屬性為正文文本專門設置樣式。
可以使用該 shapeAppearance 屬性自定義對話框背景的形狀。默認為 。
我希望這篇文章對對話框以及如何在您的Android應用中使用對話框提供了一些見識。如果您有任何疑問,想法或建議,那麼我很樂意收到您的來信!
在Twitter上找到我 @ricknout