Как установить пользовательский шрифт в заголовке ActionBar?

257

Как (если возможно) я могу установить собственный шрифт в тексте заголовка ActionBar (только - не текст вкладки) с помощью шрифта в папке с активами? Я не хочу использовать вариант Android: логотип.

vidstige
источник

Ответы:

211

Я согласен, что это не полностью поддерживается, но вот что я сделал. Вы можете использовать пользовательский вид для своей панели действий (она будет отображаться между вашим значком и вашими элементами действий). Я использую пользовательский вид, и у меня отключен собственный заголовок. Все мои действия наследуются от одного действия, которое имеет этот код в onCreate:

this.getActionBar().setDisplayShowCustomEnabled(true);
this.getActionBar().setDisplayShowTitleEnabled(false);

LayoutInflater inflator = LayoutInflater.from(this);
View v = inflator.inflate(R.layout.titleview, null);

//if you need to customize anything else about the text, do it here.
//I'm using a custom TextView with a custom font in my layout xml so all I need to do is set title
((TextView)v.findViewById(R.id.title)).setText(this.getTitle());

//assign the view to the actionbar
this.getActionBar().setCustomView(v);

И мой макет xml (R.layout.titleview в приведенном выше коде) выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent" >

<com.your.package.CustomTextView
        android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginLeft="10dp"
            android:textSize="20dp"
            android:maxLines="1"
            android:ellipsize="end"
            android:text="" />
</RelativeLayout>
Сэм Дозор
источник
1
Это прекрасно работает для заголовка, но если вы хотите заголовок и вкладки, он размещает пользовательский вид справа от вкладок, а не слева, как заголовок. Я хотел бы иметь возможность изменить фактическое название.
Драксия
2
Отличное решение. Если вам нужен собственный класс текстового представления, который позволяет указывать шрифт в XML, попробуйте мой! github.com/tom-dignan/nifty - это очень просто.
Томас Диньян
Этот код должен быть в onCreate ()? Мне нужно установить его динамически вне моей деятельности ...
Игорь Ганапольский
вам нужно динамически менять шрифт? или вы просто хотите изменить заголовок после того, как шрифт уже настроен?
Сэм Дозор
2
Это работает, но это способ много работать. Плюс: вы теряете некоторые функции стандартного заголовка, такие как выделение его при нажатии на значок ... Пользовательские заголовки не предназначены для повторного создания стандартного макета заголовка только для изменения шрифтов ...
Zordid
422

Вы можете сделать это с помощью пользовательского TypefaceSpanкласса. Он превосходит customViewподход, указанный выше, потому что он не ломается при использовании других элементов панели действий, таких как расширение видов действий.

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

SpannableString s = new SpannableString("My Title");
s.setSpan(new TypefaceSpan(this, "MyTypeface.otf"), 0, s.length(),
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

// Update the action bar title with the TypefaceSpan instance
ActionBar actionBar = getActionBar();
actionBar.setTitle(s);

Пользовательскому TypefaceSpanклассу передается ваш контекст Activity и имя гарнитуры в вашем assets/fontsкаталоге. Он загружает файл и кэширует новый Typefaceэкземпляр в памяти. Полная реализация на TypefaceSpanудивление проста:

/**
 * Style a {@link Spannable} with a custom {@link Typeface}.
 * 
 * @author Tristan Waddington
 */
public class TypefaceSpan extends MetricAffectingSpan {
      /** An <code>LruCache</code> for previously loaded typefaces. */
    private static LruCache<String, Typeface> sTypefaceCache =
            new LruCache<String, Typeface>(12);

    private Typeface mTypeface;

    /**
     * Load the {@link Typeface} and apply to a {@link Spannable}.
     */
    public TypefaceSpan(Context context, String typefaceName) {
        mTypeface = sTypefaceCache.get(typefaceName);

        if (mTypeface == null) {
            mTypeface = Typeface.createFromAsset(context.getApplicationContext()
                    .getAssets(), String.format("fonts/%s", typefaceName));

            // Cache the loaded Typeface
            sTypefaceCache.put(typefaceName, mTypeface);
        }
    }

    @Override
    public void updateMeasureState(TextPaint p) {
        p.setTypeface(mTypeface);

        // Note: This flag is required for proper typeface rendering
        p.setFlags(p.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);
    }

    @Override
    public void updateDrawState(TextPaint tp) {
        tp.setTypeface(mTypeface);

        // Note: This flag is required for proper typeface rendering
        tp.setFlags(tp.getFlags() | Paint.SUBPIXEL_TEXT_FLAG);
    }
}

Просто скопируйте приведенный выше класс в свой проект и внедрите его в onCreateметод вашей деятельности, как показано выше.

twaddington
источник
20
Хороший ответ. Приятно видеть, что вы также показали способ кэширования элемента гарнитуры.
Ананд Сайнат
6
Это отлично. Одна ошибка - если для textAllCapsатрибута установлено значение true в базовом TextView (например, через тему), то пользовательский шрифт не появится. Это было проблемой для меня, когда я применил эту технику к элементам панели действий.
Джеймс
4
Обратите внимание, что эта реализация класса предполагает, что вы поместили свои файлы шрифтов в assets/fonts/. Если вы просто выбросить файлы .ttf / .OTF под активы , а не в папке, вы должны изменить следующую строку кода соответственно: String.format("fonts/%s", typefaceName). Я потерял хорошие 10 минут, пытаясь понять это. Если вы этого не сделаете, вы получитеjava.lang.RuntimeException: Unable to start activity ComponentInfo{com.your.pckage}: java.lang.RuntimeException: native typeface cannot be made
Джунейт
1
В момент запуска приложения стиль заголовка по умолчанию становится видимым, и примерно через 1 секунду появляется пользовательский стиль. Плохой интерфейс ...
Upvote
2
Это отличный ответ и выручил меня за тонну. Одним из улучшений, которое я бы добавил, было бы перемещение механизма кэширования в его собственный класс за пределами TypefaceSpan. Я столкнулся с другими ситуациями, когда я использовал гарнитуру без промежутка, и это позволило мне также использовать кеш в этих ситуациях.
Джастин
150
int titleId = getResources().getIdentifier("action_bar_title", "id",
            "android");
    TextView yourTextView = (TextView) findViewById(titleId);
    yourTextView.setTextColor(getResources().getColor(R.color.black));
    yourTextView.setTypeface(face);
цифра
источник
2
Это должно быть предпочтительным ответом на вопрос. Прекрасно работает, также с "action_bar_subtitle"! Спасибо!
Зордид
20
если разработчики Android в более новой версии изменят идентификатор ресурса с «action_bar_title» на другое имя, то ничего из этого не будет работать. вот почему это не так проголосовало.
Диого Бенто
6
Работает на api> 3.0, но не в 2.x для appcompat
Аман Сингхал
1
Это меняет шрифт и все. Но когда я перехожу к следующему действию и нажимаю назад, шрифт возвращается. Я думаю, это как-то связано со свойствами ActionBar.
Пранав Махаджан
11
@Digit: Это отлично сработало для "The Holo Theme", но не для "Theme Theme" (android L). Идентификатор titleId найден, но текстовое представление равно нулю. Есть идеи, как это исправить? Спасибо!
Майкл Д.
34

Начиная с версии библиотеки поддержки Android v26 + Android Studio 3.0 этот процесс стал простым!

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

  1. Прочитайте загружаемые шрифты и выберите любой шрифт из списка ( моя рекомендация ) или загрузите собственный шрифт res > fontв соответствии со шрифтами в XML
  2. В res > values > stylesвставьте следующее ( используйте ваше воображение здесь! )

    <style name="TitleBarTextAppearance" parent="android:TextAppearance">
        <item name="android:fontFamily">@font/your_desired_font</item>
        <item name="android:textSize">23sp</item>
        <item name="android:textStyle">bold</item>
        <item name="android:textColor">@android:color/white</item>
    </style>
  3. Вставьте новую строку в свойствах панели инструментов, app:titleTextAppearance="@style/TextAppearance.TabsFont"как показано ниже

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:titleTextAppearance="@style/TitleBarTextAppearance"
        app:popupTheme="@style/AppTheme.PopupOverlay"/>
  4. Наслаждайтесь пользовательским стилем заголовка Actionbar!

Мухаммед Мухтар
источник
2
Это отлично подходит для панелей инструментов. Есть ли способ сделать это для всего приложения, например, когда у вас есть панель приложения по умолчанию в новом действии?
Джордан Х
14

Библиотека каллиграфии позволяет вам установить собственный шрифт через тему приложения, которая также будет применяться к панели действий.

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
<item name="android:textViewStyle">@style/AppTheme.Widget.TextView</item>
</style>

<style name="AppTheme.Widget"/>

<style name="AppTheme.Widget.TextView" parent="android:Widget.Holo.Light.TextView">
   <item name="fontPath">fonts/Roboto-ThinItalic.ttf</item>
</style>

Все, что нужно, чтобы активировать Каллиграфию, это присоединить ее к контексту вашей Деятельности:

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(new CalligraphyContextWrapper(newBase));
}

Пользовательский атрибут по умолчанию - это fontPath, но вы можете предоставить свой собственный атрибут для пути, инициализируя его в своем классе Application с помощью CalligraphyConfig.Builder. Использование android:fontFamilyне рекомендуется.

thoutbeckers
источник
Мин API 16 для этого решения
Сами Эльтамави,
minSdk 7 в соответствии с файлом сборки проекта, но я использую это в проекте minSdk 18 и больше не проверял. Какой метод используется?
thoutbeckers
Его минимальное API 7, просто пример API16. он поддерживает appcompat-v7 +
Chris.Jenkins
11

Это ужасный хак, но вы можете сделать это следующим образом (поскольку action_bar_title скрыт):

    try {
        Integer titleId = (Integer) Class.forName("com.android.internal.R$id")
                .getField("action_bar_title").get(null);
        TextView title = (TextView) getWindow().findViewById(titleId);
        // check for null and manipulate the title as see fit
    } catch (Exception e) {
        Log.e(TAG, "Failed to obtain action bar title reference");
    }

Этот код предназначен для устройств после GINGERBREAD, но его можно легко расширить для работы с Actionbar Sherlock.

PS На основе комментария @pjv есть лучший способ найти идентификатор заголовка панели действий.

final int titleId = 
    Resources.getSystem().getIdentifier("action_bar_title", "id", "android");
Bostone
источник
4
Я предпочитаю ответ dtmilano в в stackoverflow.com/questions/10779037/... . Это похоже, но чуть больше в будущем.
PJV
1
@pjv - согласился. Кажется менее "хакерским". Я изменил свой ответ
Бостоне
1
Так что вопрос о заказном шрифте. Это ответ, как получить текстовое представление панели действий по умолчанию .
Алик Эльзин-килака
@kilaka - идея заключалась в том, что, если вы получите текстовое представление, настройка пользовательского шрифта будет тривиальной. Это старый пост, хотя, я думаю, что ответ Таддингтон гораздо предпочтительнее
Бостоне
8

Следующий код будет работать для всех версий. Я проверил это на устройстве с пряниками, а также на устройстве JellyBean

 private void actionBarIdForAll()
    {
        int titleId = 0;

        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB)
        {
            titleId = getResources().getIdentifier("action_bar_title", "id", "android");
        }
        else
        {
          // This is the id is from your app's generated R class when ActionBarActivity is used for SupportActionBar

            titleId = R.id.action_bar_title;
        }

        if(titleId>0)
        {
            // Do whatever you want ? It will work for all the versions.

            // 1. Customize your fonts
            // 2. Infact, customize your whole title TextView

            TextView titleView = (TextView)findViewById(titleId);
            titleView.setText("RedoApp");
            titleView.setTextColor(Color.CYAN);
        }
    }
Napolean
источник
Это работает для меня как на ActionBar, так и на AppCompat ActionBar. Но последний работает, только если я пытаюсь найти представление заголовка после onCreate (), поэтому, например, размещение его в onPostCreate () делает свое дело.
Харри
8

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

Раздувание Textview не является хорошим вариантом, попробуйте Spannable String builder

Typeface font2 = Typeface.createFromAsset(getAssets(), "fonts/<your font in assets folder>");   
SpannableStringBuilder SS = new SpannableStringBuilder("MY Actionbar Tittle");
SS.setSpan (new CustomTypefaceSpan("", font2), 0, SS.length(),Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
actionBar.setTitle(ss);

скопировать ниже класса

public class CustomTypefaceSpan extends TypefaceSpan{

    private final Typeface newType;

    public CustomTypefaceSpan(String family, Typeface type) {
        super(family);
        newType = type;
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        applyCustomTypeFace(ds, newType);
    }

    @Override
    public void updateMeasureState(TextPaint paint) {
        applyCustomTypeFace(paint, newType);
    }

    private static void applyCustomTypeFace(Paint paint, Typeface tf) {
        int oldStyle;
        Typeface old = paint.getTypeface();
        if (old == null) {
            oldStyle = 0;
        } else {
            oldStyle = old.getStyle();
        }

        int fake = oldStyle & ~tf.getStyle();
        if ((fake & Typeface.BOLD) != 0) {
            paint.setFakeBoldText(true);
        }

        if ((fake & Typeface.ITALIC) != 0) {
            paint.setTextSkewX(-0.25f);
        }

        paint.setTypeface(tf);
    }

}
Jinu
источник
7
    ActionBar actionBar = getSupportActionBar();
    TextView tv = new TextView(getApplicationContext());
    Typeface typeface = ResourcesCompat.getFont(this, R.font.monotype_corsiva);
    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.MATCH_PARENT, // Width of TextView
            RelativeLayout.LayoutParams.WRAP_CONTENT); // Height of TextView
    tv.setLayoutParams(lp);
    tv.setText("Your Text"); // ActionBar title text
    tv.setTextSize(25);
    tv.setTextColor(Color.WHITE);
    tv.setTypeface(typeface, typeface.ITALIC);
    actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
    actionBar.setCustomView(tv);
kapsid
источник
Отлично Это работает отлично, как я могу получить эту панель приложения в центре?
Прасат
работаешь как шарм .. просто заменить typeface.ITALICс Typeface.ITALICне иметь никакого предупреждения статического члена
Zain
3

Если вы хотите установить гарнитуру для всех TextViews во всей Деятельности, вы можете использовать что-то вроде этого:

public static void setTypefaceToAll(Activity activity)
{
    View view = activity.findViewById(android.R.id.content).getRootView();
    setTypefaceToAll(view);
}

public static void setTypefaceToAll(View view)
{
    if (view instanceof ViewGroup)
    {
        ViewGroup g = (ViewGroup) view;
        int count = g.getChildCount();
        for (int i = 0; i < count; i++)
            setTypefaceToAll(g.getChildAt(i));
    }
    else if (view instanceof TextView)
    {
        TextView tv = (TextView) view;
        setTypeface(tv);
    }
}

public static void setTypeface(TextView tv)
{
    TypefaceCache.setFont(tv, TypefaceCache.FONT_KOODAK);
}

И TypefaceCache:

import java.util.TreeMap;

import android.graphics.Typeface;
import android.widget.TextView;

public class TypefaceCache {

    //Font names from asset:
    public static final String FONT_ROBOTO_REGULAR = "fonts/Roboto-Regular.ttf";
    public static final String FONT_KOODAK = "fonts/Koodak.ttf";

    private static TreeMap<String, Typeface> fontCache = new TreeMap<String, Typeface>();

    public static Typeface getFont(String fontName) {
        Typeface tf = fontCache.get(fontName);
        if(tf == null) {
            try {
                tf = Typeface.createFromAsset(MyApplication.getAppContext().getAssets(), fontName);
            }
            catch (Exception e) {
                return null;
            }
            fontCache.put(fontName, tf);
        }
        return tf;
    }

    public static void setFont(TextView tv, String fontName)
    {
        tv.setTypeface(getFont(fontName));
    }
}
user2136334
источник
3

Я просто сделал следующее внутри функции onCreate ():

TypefaceSpan typefaceSpan = new TypefaceSpan("font_to_be_used");
SpannableString str = new SpannableString("toolbar_text");
str.setSpan(typefaceSpan,0, str.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
getSupportActionBar().setTitle(str);

Я использую библиотеки поддержки, если вы их не используете, я думаю, вам следует переключиться на getActionBar () вместо getSupportActionBar ().

В Android Studio 3 вы можете добавить пользовательские шрифты, следуя этой инструкции https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html, а затем использовать свой недавно добавленный шрифт в " font_to_be_used»

Семь
источник
1

Чтобы добавить ответ @ Sam_D, я должен был сделать это, чтобы он работал:

this.setTitle("my title!");
((TextView)v.findViewById(R.id.title)).setText(this.getTitle());
TextView title = ((TextView)v.findViewById(R.id.title));
title.setEllipsize(TextUtils.TruncateAt.MARQUEE);
title.setMarqueeRepeatLimit(1);
// in order to start strolling, it has to be focusable and focused
title.setFocusable(true);
title.setSingleLine(true);
title.setFocusableInTouchMode(true);
title.requestFocus();

Это кажется излишним - ссылка на v.findViewById (R.id.title)) дважды - но это единственный способ, который позволил бы мне это сделать.

IgorGanapolsky
источник
1

Чтобы обновить правильный ответ.

во-первых: установите заголовок в false, потому что мы используем пользовательский вид

    actionBar.setDisplayShowTitleEnabled(false);

во-вторых: создайте titleview.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@android:color/transparent" >

    <TextView
       android:id="@+id/title"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerVertical="true"
       android:layout_marginLeft="10dp"
       android:textSize="20dp"
       android:maxLines="1"
       android:ellipsize="end"
       android:text="" />

</RelativeLayout>

Наконец:

//font file must be in the phone db so you have to create download file code
//check the code on the bottom part of the download file code.

   TypeFace font = Typeface.createFromFile("/storage/emulated/0/Android/data/"   
    + BuildConfig.APPLICATION_ID + "/files/" + "font name" + ".ttf");

    if(font != null) {
        LayoutInflater inflator = LayoutInflater.from(this);
        View v = inflator.inflate(R.layout.titleview, null);
        TextView titleTv = ((TextView) v.findViewById(R.id.title));
        titleTv.setText(title);
        titleTv.setTypeface(font);
        actionBar.setCustomView(v);
    } else {
        actionBar.setDisplayShowTitleEnabled(true);
        actionBar.setTitle("  " + title); // Need to add a title
    }

СКАЧАТЬ ФАЙЛ: потому что я храню файл в облачном хранилище, поэтому у меня есть ссылка для его загрузки.

/**downloadFile*/
public void downloadFile(){
    String DownloadUrl = //url here
    File file = new File("/storage/emulated/0/Android/data/" + BuildConfig.APPLICATION_ID + "/files/");
    File[] list = file.listFiles();
    if(list == null || list.length <= 0) {
        BroadcastReceiver onComplete = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                try{
                    showContentFragment(false);
                } catch (Exception e){
                }
            }
        };

        registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(DownloadUrl));
        request.setVisibleInDownloadsUi(false);
        request.setDestinationInExternalFilesDir(this, null, ModelManager.getInstance().getCurrentApp().getRegular_font_name() + ".ttf");
        DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
        manager.enqueue(request);
    } else {
        for (File files : list) {
            if (!files.getName().equals("font_name" + ".ttf")) {
                BroadcastReceiver onComplete = new BroadcastReceiver() {
                    @Override
                    public void onReceive(Context context, Intent intent) {
                        try{
                            showContentFragment(false);
                        } catch (Exception e){
                        }
                    }
                };

                registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
                DownloadManager.Request request = new DownloadManager.Request(Uri.parse(DownloadUrl));
                request.setVisibleInDownloadsUi(false);
                request.setDestinationInExternalFilesDir(this, null, "font_name" + ".ttf");
                DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
                manager.enqueue(request);
            } else {
                showContentFragment(false);
                break;
            }
        }
    }
}
Андрей Индаянг
источник
1

Пользовательский просмотр текста не требуется!

Во-первых, отключите заголовок в toobar в своем коде Java: getSupportActionBar (). SetDisplayShowTitleEnabled (false);

Затем просто добавьте TextView внутри панели инструментов:

<android.support.v7.widget.Toolbar
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    app:popupTheme="@style/AppTheme.PopupOverlay">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/app_name"
        android:textSize="18sp"
        android:fontFamily="@font/roboto" />

    </android.support.v7.widget.Toolbar>
Апурва Торат
источник
Это не будет работать с последними библиотеками
Jetpack
1

Попробуйте использовать это

TextView headerText= new TextView(getApplicationContext());
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(ActionBar.LayoutParams.WRAP_CONTENT, ActionBar.LayoutParams.WRAP_CONTENT);
headerText.setLayoutParams(lp);
headerText.setText("Welcome!");
headerText.setTextSize(20);
headerText.setTextColor(Color.parseColor("#FFFFFF"));
Typeface tf = Typeface.createFromAsset(getAssets(), "fonts/wesfy_regular.ttf");
headerText.setTypeface(tf);
getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
getSupportActionBar().setCustomView(headerText);
Asendo
источник
0

Нам нужно использовать размышления для достижения этой цели

final int titleId = activity.getResources().getIdentifier("action_bar_title", "id", "android");

    final TextView title;
    if (activity.findViewById(titleId) != null) {
        title = (TextView) activity.findViewById(titleId);
        title.setTextColor(Color.BLACK);
        title.setTextColor(configs().getColor(ColorKey.GENERAL_TEXT));
        title.setTypeface(configs().getTypeface());
    } else {
        try {
            Field f = bar.getClass().getDeclaredField("mTitleTextView");
            f.setAccessible(true);
            title = (TextView) f.get(bar);
            title.setTextColor(Color.BLACK);
            title.setTypeface(configs().getTypeface());
        } catch (NoSuchFieldException e) {
        } catch (IllegalAccessException e) {
        }
    }
Jiju Induchoodan
источник
-1

ПОПРОБУЙ ЭТО

public void findAndSetFont(){
        getActionBar().setTitle("SOME TEST TEXT");
        scanForTextViewWithText(this,"SOME TEST TEXT",new SearchTextViewInterface(){

            @Override
            public void found(TextView title) {

            } 
        });
    }

public static void scanForTextViewWithText(Activity activity,String searchText, SearchTextViewInterface searchTextViewInterface){
    if(activity == null|| searchText == null || searchTextViewInterface == null)
        return;
    View view = activity.findViewById(android.R.id.content).getRootView();
    searchForTextViewWithTitle(view, searchText, searchTextViewInterface);
}

private static void searchForTextViewWithTitle(View view, String searchText, SearchTextViewInterface searchTextViewInterface)
{
    if (view instanceof ViewGroup)
    {
        ViewGroup g = (ViewGroup) view;
        int count = g.getChildCount();
        for (int i = 0; i < count; i++)
            searchForTextViewWithTitle(g.getChildAt(i), searchText, searchTextViewInterface);
    }
    else if (view instanceof TextView)
    {
        TextView textView = (TextView) view;
        if(textView.getText().toString().equals(searchText))
            if(searchTextViewInterface!=null)
                searchTextViewInterface.found(textView);
    }
}
public interface SearchTextViewInterface {
    void found(TextView title);
}
user2212515
источник