4

我正在使用Android Support Library的修訂版26.0.1在我的應用程序中設置自定義字體。在我的應用程序的主題,我說:如何使用支持庫在AlertDialog中設置自定義字體26

<item name="android:fontFamily">@font/my_font</item> 

它的工作就像一個魅力,轉換文本在我的整個應用程序到我的自定義字體。除了我的對話 - 特別是他們的頭銜,消息,還有他們的NumberPickers。在那些地方,字體沒有更新。 (單選按鈕和複選框起作用;「是」/「否」按鈕也一樣)

有沒有什麼我忘記添加到我的主題或樣式中?或者,這僅僅是不被支持庫支持?

更多一點細節:我使用AppCompatDialogFragment來實現我所有的對話框。在他們的onCreateDialog()方法中,我使用AlertDialog.Builder創建一個對話框,然後將其返回。

感謝您的幫助!

+1

我認爲這是在支持庫中的錯誤申請標題自定義視圖。在Android 26上,如果我爲主要主題同時指定了android:fontFamily和app:fontFamily,它將起作用。低於26的對話標題字體不會改變。我已使用支持庫版本27.0.2進行了測試。 – devconsole

回答

1

謝謝大家誰回答,但不幸的是沒有這些解決方案爲我工作。我希望他們會爲別人工作。

我已經斷定這是支持庫中的一個錯誤,希望Google能夠修復。在此期間,我開發了這個哈克解決方法:

public static void applyCustomFontToDialog(Context context, Dialog dialog) { 
    Typeface font = ResourcesCompat.getFont(context, R.font.my_font); 
    if (font != null) { 
     TextView titleView = dialog.findViewById(android.support.v7.appcompat.R.id.alertTitle); 
     TextView messageView = dialog.findViewById(android.R.id.message); 
     if (titleView != null) titleView.setTypeface(font, Typeface.BOLD); 
     if (messageView != null) messageView.setTypeface(font); 
    } 
} 

此作品通過掃描對話框的視圖樹由支持庫讓他們的ID標題和消息的看法。如果支持庫改變這些ID,這將不再起作用(這就是爲什麼它是hacky)。希望谷歌修復這個問題,我不再需要這樣做了。

+0

什麼的哈克解決方案:d –

-1

您可以使用自定義Alert Dialog並使用Typeface設置字體。看看下面的代碼片段。

AlertDialog dg = new AlertDialog.Builder(this).setMessage("Your Message").show(); 
TextView tv = (TextView) dg.findViewById(android.R.id.message); // Your TextView of custom Alert Dialog 
Typeface fc=Typeface.createFromAsset(getAssets(),"fonts/FONT"); // This is your font file name. 
tv.setTypeface(fc); 
-1

您可以在對話框中膨脹的自定義佈局是這樣的:

final android.support.v7.app.AlertDialog.Builder alertDialogBuilder = new android.support.v7.app.AlertDialog.Builder(context, 
R.style.LimitAlertDialogStyle); 
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View alertLayout = layoutInflater.inflate(R.layout.date_layout, null); 
TextView tv= (TextView) alertLayout.findViewById(R.id.tv); 

Typeface fc=Typeface.createFromAsset(getAssets(),"fonts/FONT"); 
tv.setTypeface(fc); 
0

創建對話框生成器時,應使用一個ContextThemeWrapper。像這樣

ContextThemeWrapper wrappedContext = new ContextThemeWrapper(context, R.style.mystyle); 
AlertDialog.Builder builder = new AlertDialog.Builder(wrappedContext); 

如果您僅支持SDK 11及以上,你可能需要使用

ContextThemeWrapper wrappedContext = new ContextThemeWrapper(context, R.style.mystyle); 
AlertDialog.Builder builder = new AlertDialog.Builder(wrappedContext, R.style.mystyle); 
1

我發現每次創建AlertDialog時都只需要對Java代碼進行單行更改。

步驟1

創建自定義,含有正確的字體集一個TextView可重複使用的佈局。把它叫做alert_dialog。XML:

<?xml version="1.0" encoding="utf-8"?> 
<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    style="@style/SomeStyleWithDesiredFont" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:padding="@dimen/spacing_2x" /> 

步驟2

創建一個可重複使用的輔助函數的地方,會誇大這種佈局和文本設置爲你想要的字符串

public static TextView createMessageView(String message, Context context) { 
    TextView messageView = (TextView) LayoutInflater.from(context).inflate(R.layout.alert_dialog, null, false); 
    messageView.setText(message); 
    return messageView; 
} 

步驟3

在代碼中的每個AlertDialog.Builder鏈中,替換此行:

.setMessage(messageString) 

這一行:

.setView(createMessageView(messageString, context)) 

(請注意,同樣的做法應該爲標題TextView的工作。你可以在你的建設者調用setCustomTitle())

+0

謝謝!我認爲這個解決方案不如我的哈克:) – yuval

相關問題