Установка пользовательского шрифта для диалога - PullRequest
2 голосов
/ 01 апреля 2019

Мы пытаемся установить заголовок диалогового окна, чтобы иметь собственный шрифт, поэтому мы попытались создать тему со следующим:

<style name="DialogTheme" parent="Theme.AppCompat.Dialog.Alert">
  <item name="android:windowTitleStyle">@style/Dialog.Title</item>
</style>


<style name="Dialog.Title" parent="RtlOverlay.DialogWindowTitle.AppCompat">
  <item name="android:textAppearance">@style/Dialog.TextAppearance.Title</item>
</style>


<style name="Dialog.TextAppearance.Title" parent="TextAppearance.AppCompat.Title">
  <item name="fontFamily">@font/custom_font</item>
</style>

И мы создаем конструктор диалогов следующим образом:

AlertDialog.Builder(ContextThemeWrapper(context, R.style.DialogTheme), R.style.DialogTheme)

Стиль и внешний вид текста полностью игнорируются.Для других стилей это, кажется, работает.

Нам удалось заставить его работать, скопировав макет, используемый AppCompat, и добавив его в качестве пользовательского заголовка:

<?xml version="1.0" encoding="utf-8"?>
<!-- modified from AppCompat's abc_alert_dialog_title_material.xml -->
<FrameLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:gravity="center_vertical|start|left"
  android:paddingLeft="?attr/dialogPreferredPadding"
  android:paddingRight="?attr/dialogPreferredPadding"
  android:paddingTop="@dimen/abc_dialog_padding_top_material">

  <TextView
    android:id="@+id/alertTitle"
    style="@style/Dialog.Title"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ellipsize="end"
    android:singleLine="true"
    android:textAlignment="viewStart"
    tools:text="Some title" />

</FrameLayout>

На основеthis: abc_alert_dialog_title_material.xml

Вместо использования DialogTitle здесь мы используем TextView.Что DialogTitle перегружает Memeasure следующим:

final Layout layout = getLayout();
if (layout != null) {
    final int lineCount = layout.getLineCount();
    if (lineCount > 0) {
        final int ellipsisCount = layout.getEllipsisCount(lineCount - 1);
        if (ellipsisCount > 0) {
            setSingleLine(false);
            setMaxLines(2);
            final TypedArray a = getContext().obtainStyledAttributes(null,
                    R.styleable.TextAppearance,
                    android.R.attr.textAppearanceMedium,
                    android.R.style.TextAppearance_Medium);
            final int textSize = a.getDimensionPixelSize(
                    R.styleable.TextAppearance_android_textSize, 0);
            if (textSize != 0) {
                // textSize is already expressed in pixels
                setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
            }
            a.recycle();
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }
}

Мы думаем, что это связано с настройкой размера текста, но мы не уверены.У нас есть рабочий хак (с скопированной версткой).Однако мы бы предпочли знать, как заставить его работать со стилями и темами xml, а не менять поведение по умолчанию.

1 Ответ

0 голосов
/ 28 апреля 2019

Из моего ответа на другой вопрос, который я недавно опубликовал, я смог программно установить шрифт всех атрибутов AlertDialog. Надеюсь, это работает для вас.

Typeface semibold = ResourcesCompat.getFont(this, R.font.product_bold);
Typeface regular = ResourcesCompat.getFont(this, R.font.product_regular);
AlertDialog myDialog = new AlertDialog.Builder(this).setTitle("Your title")
        .setMessage("Your message.")
        .setPositiveButton("Your button", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //your code
            }
        }).show();
int titleText = getResources().getIdentifier("alertTitle", "id", "android");
((TextView) myDialog.getWindow().findViewById(titleText)).setTypeface(semibold);
TextView dialogMessage = myDialog.getWindow().findViewById(android.R.id.message);
Button dialogButton = myDialog.getWindow().findViewById(android.R.id.button1);
dialogMessage.setTypeface(regular);
dialogButton.setTypeface(semibold);

Подтверждено, что работает на Android 9.0, не может претендовать на то, что он работает на более старых API.

Еще один метод программной установки заголовка с помощью TextView, вот как я это делал:

TextView alertTitle = findViewById(R.id.alertTextTemp);
if (alertTitle.getParent() != null) {
    ((ViewGroup) alertTitle.getParent()).removeView(alertTitle);
}
alertTitle.setText("Warning");
alertTitle.setVisibility(View.VISIBLE);
alertTitle.setTypeface(semibold);

Затем, когда вы создаете свой диалог, вы устанавливаете пользовательский заголовок с помощью:

new AlertDialog.Builder(MainActivity.this).setCustomTitle(alertTitle)...

alertTitle - это TextView в вашем activity_main.xml файле:

<TextView
    android:id="@+id/alertTextTemp"
    android:visibility="gone"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="22sp"
    android:paddingLeft="23dp"
    android:paddingTop="22dp"
    android:textColor="#000000" />

Эти атрибуты в TextView Я должен был настроить так, чтобы он был как можно ближе к полям заголовка по умолчанию и размеру, насколько это возможно, вы можете убедиться, что он работает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...