利用反射機制修改Dialog的各文字元件的顏色、字型大小等屬性
作為程式設計師,要想讓元件有與眾不同的效果,必須學會編寫自定義View。
這次我就先從自定義Dialog中元件的基本屬性開始學習。
- 一個最基本的Dialog:
乍一看視覺效果還可以,但當我們想改變一下標題的文字顏色或者按鈕顏色應該怎麼做呢?
- 檢視原始碼
public class AlertDialog extends Dialog implements DialogInterface {
private AlertController mAlert;
......
}
AlertDialog
類中並沒有直接定義控制元件,而是通過AlertController
然而在android studio中無法直接檢視該類原始碼,因為部分原始碼的標籤是
@hide
的,即使檔案存在但編輯器也不會顯示,所以需要通過另外的軟體來檢視原始碼。
有條件的朋友還可以在AndroidXRef網站上直接檢視,裡面有各個版本的Android原始碼,但我因為訪問速度太慢就沒用這個看。
回到正題,在AlertController
類中,可以看到以下變數:
class AlertController {
......
private ImageView mIconView;
private TextView mTitleView;
private TextView mMessageView;
private View mCustomTitleView;
......
}
但由於我們無法直接訪問這些變數,回想起上學期學習的高階Java,其中學到的反射機制終於可以派上用場了!
- 修改文字顏色、大小
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle("標題")
.setMessage("內容")
.setPositiveButton("確定" ,null)
.setNegativeButton("取消",null)
.create();
dialog.show();
try {
Field mAlert = AlertDialog.class.getDeclaredField("mAlert");
mAlert.setAccessible(true);
Object mAlertController = mAlert.get(dialog);
Field mMessage = mAlertController.getClass().getDeclaredField("mMessageView");
mMessage.setAccessible(true);
TextView mMessageView = (TextView) mMessage.get(mAlertController);
mMessageView.setTextColor(你要設定的顏色);
mTitleView.setTextSize(你要設定的文字大小);
Field mTitle = mAlertController.getClass().getDeclaredField("mTitleView");
mTitle.setAccessible(true);
TextView mTitleView = (TextView) mTitle.get(mAlertController);
mTitleView.setTextColor(你要設定的顏色);
mTitleView.setTextSize(你要設定的文字大小);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
- 修改按鈕顏色
同樣,我們可以通過反射機制修改,也可以直接使用AlertDialog
類中提供的方法:
/**
* Gets one of the buttons used in the dialog. Returns null if the specified
* button does not exist or the dialog has not yet been fully created (for
* example, via {@link #show()} or {@link #create()}).
*
* @param whichButton The identifier of the button that should be returned.
* For example, this can be
* {@link DialogInterface#BUTTON_POSITIVE}.
* @return The button from the dialog, or null if a button does not exist.
*/
public Button getButton(int whichButton) {
return mAlert.getButton(whichButton);
}
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle("標題")
.setMessage("內容")
.setPositiveButton("確定",null)
.setNegativeButton("取消",null)
.create();
dialog.show();
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(你要設定的顏色);
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextSize(你要設定的文字大小);
附上一張修改後的效果圖:
至此,我們就可以用反射機制修改Dialog中各控制元件的各個屬性(又如gravity等,但經過實踐發現Title無法設定Gravity屬性???Message卻又可以???暫留一個未解之謎),需要用到的時候再探索就好了。
注意
反射方法必須在dialog.show()方法後執行,不然會報錯。
相關推薦
利用反射機制修改Dialog的各文字元件的顏色、字型大小等屬性
作為程式設計師,要想讓元件有與眾不同的效果,必須學會編寫自定義View。 這次我就先從自定義Dialog中元件的基本屬性開始學習。 一個最基本的Dialog: 乍一看視覺效果還可以,但當我們想改變一下標題的文字顏色或者按鈕顏色應該怎麼做呢? 檢
Katalon 校驗元素CSS樣式,如頁面元素的文字顏色、字型大小等【WebUI自動化測試】
當我們做UI自動化測試時,可能會有這樣的需求,檢驗某個元素的文字顏色、字型大小等等,我們可以用WebUI.getCSSValue(TestObject to, String css)方法,獲取一個元素物件的CSS樣式。 element_colour = WebUI.getCSSValue
利用反射機制,獲取類的欄位、方法、並實現簡單呼叫
這篇文章是為之後要介紹Android的ICO框架做預備的,所以,如果想最近學習Android的ICO框架的同學,可以稍微看一下。 首先,簡單介紹一下Java裡面的反射。 JAVA反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件
利用CSS設定小於12px的文字 解決常用瀏覽器字型大小
谷歌瀏覽器Chrome是Webkit的核心,之前,有一個 -webkit-text-size-adjust 的私有 CSS 屬性,通過它即可實現字型大小不隨終端裝置或瀏覽器影響。 CSS程式碼定義如下: -webkit-text-size-adjust:none; 但是
【Inno Setup】修改安裝分割線前面的文字並自定義風格(顏色、字型大小等等)
[Messages] BeveledLabel=少莫千華 [Code] procedure InitializeWizard(); begin WizardForm.BeveledLabel.
利用反射機制編寫校驗參數(對象及屬性)為空的情況
check 參數 lec reflect ram declare 異常 ase urn 2 3 import java.lang.reflect.Field; 4 import java.lang.reflect.InvocationTargetExcept
利用反射機制破壞單例(2)
前言 在部落格上看到一篇《防止單例模式被JAVA反射攻擊》的文章,通過一個靜態布林變數記錄下單例類是否是第一次初始化,然後在建構函式內丟擲異常來防止反射破壞。看起來合情合理,但細想,通過反射來修改那個靜態變數,再呼叫建構函式進行例項化,同樣可以破壞。按照上面的原理,我換了另一種方式實
利用反射機制破壞單例(1)
前言 突發奇想,既然單例類通過私有化建構函式來實現單例,而java中通過反射可以獲取類中任意的屬性和方法,那麼可以利用java反射機制獲取單例類的私有建構函式來例項化物件,從而獲取到新的物件。下面用程式碼進行實踐。 程式碼實現 單例類 Singleton : public
利用反射機制實現物件轉Map集合
分析問題 問題主要有以下幾點 如何獲取物件中的屬性的名稱? 如何獲取物件的屬性值?如何這個屬性被private修飾,該如何處理? 返回的是一個物件該如何獲取物件的屬性引數呢? 解決問題 問題1:可以使用反射來獲取POJO物件的get方法(
利用反射機制實現對象轉Map集合
public 方法 name lower pro eal param iter people 分析問題問題主要有以下幾點 如何獲取對象中的屬性的名稱?如何獲取對象的屬性值?如何這個屬性被private修飾,該如何處理?返回的是一個對象該如何獲取對象的屬性參數呢? 解決問題
利用反射機制建立工具類對資料進行加密和解密
對資料庫的資料進行加密,包括使用者資料、專案資料、聊天資料等,需要在插入表的的時候進行加密,查詢的時候進行解密。利用java的反射機制,建立以下工具類,對資料進行加解密。 public class CryptoUtil { /** * 加密、解密方法 * @param ob
利用反射機制獲得非靜態內部類之getConstructor的用法探索
來源: http://blog.163.com/[email protected]/blog/static/161553399201291311119821/ 提問關於反射機制拿到內部類的構造方法的問題。總結一下個人學習新東西的過程。 import java.
利用反射機制完成java物件與物件之間的轉換
在微服務架構的專案中,我們經常會遇到外觀模式設計,把核心的資料結構隱藏起來,暴露對外的request和response資料結構。如果巢狀的層級多了,層層的資料轉換將會增加大量程式碼,讓整個專案看起來臃腫不堪。例如: public void saveVisitStatInfo(VisitS
java利用反射機制獲取實體類屬性自定義註解說明
最近做專案,需要利用java反射機制,獲取實體類自定義註解的說明資訊 1.自定義註解 <strong>package com.bjhy.platform.criminal.search.c
利用反射機制實現工廠模式
//細節:命名規則類,介面名稱都得大寫; // 寫完程式碼記得格式化,就算是測試程式碼,貼出來也是給人看的。不能太水。 interface Fruit { //介面中的 public abstract 都是多餘的宣告,eclipse是發現不了的。 //若是有
利用反射機制來驗證上傳檔案的格式是否符合要求
public boolean validateFileType(String propertyName) throws Exception{ PropertyDescriptor[] propertydesc = Introspector.getBeanInfo(this.
PropertyUtils.getPropertyDescriptors利用反射機制獲取類中的屬性
第一步:建立java專案 第二步:建立兩個類 我建立的是一個bean.java類,和beanTest.java類,同目錄下 第三步:寫程式碼 bean.java public class bean { String name; String password
利用反射機制建立新類的兩種方式及比較
【0】README 【1】通過反射建立新的類示例,有兩種方式: 2.1)第一種方式: Class.newInstance() 2.2)第二種方式: Constructor.newInstance() 【2】以下對兩種呼叫方式給以比較說明:
利用反射機制獲取Enum屬性的name或者value
列舉類中新增方法 public Object searchName(){ return this.name == null ? this.name() : this.name; } public Object searchValue(){ return th
利用反射機制實現servlet的分派功能
package com.iflytek.utils; import java.io.IOException; import java.lang.reflect.Method; import javax.servlet.ServletException; import jav