1. 程式人生 > >利用反射機制修改Dialog的各文字元件的顏色、字型大小等屬性

利用反射機制修改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