Изменить шрифт тоста

В настоящее время я пытаюсь разработать приложение. и я не знаю, как изменить шрифт Toast. .

 final OnClickListener clickListener = new OnClickListener() {

    public void onClick(View v) {
            try {
                Toast.makeText(nova.this,"Hello", 500000).show();
            }
            catch (Exception e) {
                Toast.makeText(nova.this,"Exception:" +e, 500000);
            }
        }
    };

Я хочу изменить текст «Привет» с помощью пользовательского шрифта, который я пробовал с TypeFace.

а затем я хочу установить переменную в месте "TextClicked". Я пробовал с локальной переменной.. но это не работает

любая помощь с исходным кодом примера будет для меня действительно полезной.


person Ye Lin Aung    schedule 30.05.2010    source источник


Ответы (6)


Из официальной документации:

Создайте собственный ToastView

Если простого текстового сообщения недостаточно, вы можете создать собственный макет всплывающего уведомления. Чтобы создать собственный макет, определите макет представления в XML или в коде приложения и передайте корневой объект представления методу setView(View).

По ссылке на официальную документацию Google будут приведены примеры.

person RoflcoptrException    schedule 30.05.2010

Ответ здесь: https://stackoverflow.com/a/13231981

После небольшого рефакторинга:

    Toast toast = Toast.makeText(context, R.string.yummyToast, Toast.LENGTH_SHORT);
    LinearLayout toastLayout = (LinearLayout) toast.getView();
    TextView toastTV = (TextView) toastLayout.getChildAt(0);
    toastTV.setTextSize(30);
    toast.show();

Это сработало для меня как шарм!

person DritanX    schedule 29.03.2013
comment
Лучший и красивый ... . - person mghhgm; 19.10.2016
comment
Это рискованно. Если Google когда-нибудь решит изменить макет, чтобы первым дочерним элементом не был TextView, вы получите исключение ClassCastException. - person Marty Miller; 10.05.2017
comment
красиво и аккуратно...! - person inverted_index; 28.10.2017
comment
@MartyMiller, есть ли способ использовать здесь iterator? Я имею в виду, чтобы получить ребенка в int i, когда я ‹ totalChildLength, а затем проверить, является ли это текстовым или нет - person exploitr; 22.05.2018
comment
НЕ РАБОТАЕТ в Android 11 developer.android .com/about/versions/11/ - person Ali Zarei; 18.01.2021

Вы можете использовать SpannableString для установки шрифта:

Typeface font = Typeface.createFromAsset(getAssets(), "fonts/ATaha.ttf");
SpannableString efr = new SpannableString("Toast font changed!");
efr.setSpan(new TypefaceSpan(font), 0, efr.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Toast.makeText(this, efr, Toast.LENGTH_SHORT).show();

Пользовательский класс Span с определенным набором шрифтов:

public class TypefaceSpan extends MetricAffectingSpan {
    private Typeface mTypeface;
    public TypefaceSpan(Typeface typeface) {
        mTypeface = typeface;
    }

    @Override
    public void updateMeasureState(TextPaint p) {
        p.setTypeface(mTypeface);
        p.setFlags(p.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);
    }

    @Override
    public void updateDrawState(TextPaint tp) {
        tp.setTypeface(mTypeface);
        tp.setFlags(tp.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);
    }
}
person hamidfzm    schedule 13.05.2014
comment
Я думаю, что это самый правильный способ установить шрифт Toast и сохранить системный стиль Toast. - person Nik; 30.07.2014
comment
у меня не сработало - person Ali Zarei; 11.02.2021

К сожалению, код на странице Java содержит ошибки. Вот ссылка на рабочую функцию, которую вы можете реализовать, которая дает вам текст (я знаю, потому что я ее тестировал), и с небольшой изобретательностью ее можно расширить, чтобы передать аргументы для размера, цвета и т. д.

Функция размера шрифта Toast здесь

person MontyThreeCard    schedule 20.02.2013

Котлин функция:

fun makeLargeTextToast(text: CharSequence): Toast {
    return Toast.makeText(applicationContext, text, Toast.LENGTH_LONG).also {
        val toastLayout = it.view as LinearLayout
        val toastTV = toastLayout.getChildAt(0) as TextView
        toastTV.textSize = 30f
    }
}

Используйте его как:

makeLargeTextToast("text message").show()
person naXa    schedule 26.03.2019

Я использовал это решение в котлине

в пользовательском представлении или фрагменте

 fun persianToast(message: String): Toast {
    return Toast.makeText(context, message, Toast.LENGTH_SHORT).also {
        val view = it.view as LinearLayout
        val tv = view.getChildAt(0) as TextView
        val typeFace = Typeface.createFromAsset(context?.assets, MyApplication.getFont(MyApplication.LIGHT_FONT))
        tv.typeface = typeFace
    }
 }

Класс MyApplication:

class MyApplication : Application() {
companion object {
     const val NORMAL_FONT = 0
     const val BOLD_FONT = 1
     const val MEDIUM_FONT = 2
     const val LIGHT_FONT = 3
     const val ULTRA_LIGHT_FONT = 4

    @JvmStatic
    fun getFont(type: Int): String {
        return when (type) {
            LIGHT_FONT -> "font/fontLight.ttf"
            BOLD_FONT -> "font/fontBold.ttf"
            MEDIUM_FONT -> "font/fontMedium.ttf"
            ULTRA_LIGHT_FONT -> "font/fontUltraLight.ttf"
            else -> "font/fontNormal.ttf"
        }
    }
}

используется во фрагменте:

  override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        Toast(context)
        persianToast("javid sattar").show()
}

удачи!!

person Javid Sattar    schedule 09.09.2020