1. 程式人生 > >android 設定系統dialog 樣式

android 設定系統dialog 樣式

 1、編寫一個文字樣式。
  DIALOG的標題是一個textview,在sytles.xml中,新增如下程式碼來設定你自己的文字樣式:
  ?

  <style name="DialogWindowTitle">
  <item name="android:textSize">22sp</item>
  <item name="android:textColor">@color/font_dark_grey</item>
  </style>
  2、設定對話方塊的標題主題。
  
  上面的標題文字並不能直接設定為對話方塊的標題樣式。 我們還需要編寫一個表示標題的主題的style,在這裡指定標題的文字樣式。程式碼如下:
  
  ?

  <style name="

DialogWindowTitle.DeviceDefault">
  <item name="android:maxLines">1</item>
  <item name="android:scrollHorizontally">true</item>
  <item name="android:textAppearance">@style/DialogWindowTitle</item>
  </style>

  3、設定對話方塊主題。
  
  接下來,我們編寫我們的對話方塊主題,在這裡指定標題的主題。由於一些屬性並不是public的,所以我們需要繼承自原來的某個style,程式碼如下:
  
  ?

  <!--Dialog主題-->
  <style name="Theme.DeviceDefault.Dialog" parent="@android:style/Theme.DeviceDefault.Light.Dialog">
  <item name="android:windowTitleStyle">@style/DialogWindowTitle.DeviceDefault</item>
  </style>

  4、自定義App的主題。
  
  接下來,我們需要在我們的App theme中指定我們的對話方塊使用這種主題,所以需要定義一個App theme。同樣由於App theme的許多屬性並不是public的(比如下面要提到的標題下面的那條藍線),所以我們要繼承自一個原生的style。這裡我根據程式需要選擇了Theme.Holo.Light.NoActionBar,程式碼如下:
  
  ?

  <style name="ParkingTheme" parent="@android:style/Theme.Holo.Light.NoActionBar">
  <item name="android:dialogTheme">@style/Theme.DeviceDefault.Dialog</item>
  </style>
  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為例,程式碼如下:

  <!--AlderDialog主題-->
  <style name="Theme.DeviceDefault.Dialog.Alert" parent="@android:style/Theme.Holo.Light.Dialog">
  <item name="android:windowBackground">@android:color/transparent</item>
  <item name="android:windowTitleStyle">@style/DialogWindowTitle.DeviceDefault</item>
  <item name="android:windowContentOverlay">@null</item>
  <item name="android:windowMinWidthMajor">@android:dimen/dialog_min_width_major</item>
  <item name="android:windowMinWidthMinor">@android:dimen/dialog_min_width_minor</item>
  </style>

  在這裡我參考了原生的alertDialog的style,設定了視窗背景為透明,以及windowContentOverlay為null這兩個重要屬性,否則你會看到在AlertDialog下面還有一層對話方塊的背景,或者是對話方塊的背景遮住了所有內容這樣的問題存在。
  

  8、指定AlertDialog的主題。

  我們需要在第4步所說的自定義的AppTheme中,新增一行程式碼來指定要使用的AlertDialog的style,程式碼如下:

  ?
   <item name="android:alertDialogTheme">@style/Theme.DeviceDefault.Dialog.Alert</item>

  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()方法被呼叫之後才可以去呼叫,否則會報錯。

附 修改  標題和線 顏色 方法  裡面的color自己定義

//修改預設AlertDialog的標題顏色 和 下面藍色線的顏色
	 public static void dialogTitleLineColor(Dialog dialog,Context context) {
		 
		 //獲取標題textView 並設定顏色
		 try {
			 Field mAlert = AlertDialog.class.getDeclaredField("mAlert");  
			 mAlert.setAccessible(true);  
		     Object alertController = mAlert.get(dialog);  
		     Field mTitleView = alertController.getClass().getDeclaredField("mTitleView");  
		     mTitleView.setAccessible(true);  
		     TextView title = (TextView) mTitleView.get(alertController);
		     title.setTextColor(context.getResources().getColor(R.color.country_standard_defaulg));
		} catch (Exception e) {
			
		}
		 //獲取下面線物件view 並設定顏色
		 
		 int divierId = context.getResources().getIdentifier("android:id/titleDivider", null, null);
		 View divider = dialog.findViewById(divierId);
		 divider.setBackgroundColor(context.getResources().getColor(R.color.country_standard_defaulg));
	 }