Como definir uma fonte personalizada no título da ActionBar?


257

Como (se possível) eu poderia definir uma fonte personalizada em um texto de título do ActionBar (somente - não no texto da guia) com uma fonte na minha pasta de ativos? Não quero usar a opção android: logo.

Respostas:


211

Concordo que isso não é totalmente suportado, mas aqui está o que eu fiz. Você pode usar uma exibição personalizada para sua barra de ação (ela será exibida entre o ícone e os itens de ação). Estou usando uma exibição personalizada e tenho o título nativo desativado. Todas as minhas atividades são herdadas de uma única atividade, que possui esse código no 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);

E meu layout xml (R.layout.titleview no código acima) se parece com o seguinte:

<?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
Isso funciona bem para o título, mas se você quiser um título e guias, ele coloca a visualização personalizada à direita das guias não deixadas como o título seria. Eu adoraria poder alterar o título real.
Draksia

2
Ótima solução. Se você precisar de uma classe de exibição de texto personalizada que permita a especificação da fonte em XML, tente a minha! github.com/tom-dignan/nifty - é muito fácil.
Thomas Dignan

Esse código precisa estar em onCreate ()? Eu preciso definir dinamicamente fora da minha atividade ...
IgorGanapolsky

você precisa alterar a fonte dinamicamente? ou você apenas deseja alterar o título quando a fonte já estiver personalizada?
precisa

2
Isso funciona, mas é muito trabalho. Mais: você perde alguns recursos do título padrão, como destacá-lo quando o ícone é clicado ... Os títulos personalizados não devem ser usados ​​para recriar o layout do título padrão apenas para alterar as fontes ...
Zordid

422

Você pode fazer isso usando uma TypefaceSpanclasse personalizada . É superior à customViewabordagem indicada acima, porque não quebra ao usar outros elementos da Barra de Ação, como expandir as visualizações de ação.

O uso dessa classe seria algo como isto:

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);

A TypefaceSpanclasse personalizada recebe o contexto de Atividade e o nome de um tipo de letra em seu assets/fontsdiretório. Carrega o arquivo e armazena em cache uma nova Typefaceinstância na memória. A implementação completa de TypefaceSpané surpreendentemente simples:

/**
 * 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);
    }
}

Simplesmente copie a classe acima em seu projeto e implemente-a no onCreatemétodo da sua atividade, como mostrado acima.


20
Boa resposta. O que é bom ver é que você também mostrou uma maneira de armazenar em cache o elemento do tipo de letra.
Anand Sainath

6
Isto e excelente. Uma dica: se o textAllCapsatributo estiver definido como true no TextView subjacente (por exemplo, através de um tema), a fonte personalizada não aparecerá. Esse foi um problema para mim quando apliquei essa técnica aos itens da guia da barra de ação.
James

4
Observe que esta implementação da classe assume que você coloca seus arquivos de fonte assets/fonts/. Se você acabou de jogar os arquivos .ttf / .otf no ativo e não em uma subpasta, você deve modificar a seguinte linha de código em conformidade: String.format("fonts/%s", typefaceName). Perdi bons 10 minutos tentando descobrir. Se não, você receberájava.lang.RuntimeException: Unable to start activity ComponentInfo{com.your.pckage}: java.lang.RuntimeException: native typeface cannot be made
Dzhuneyt 15/12

1
No momento em que o aplicativo é iniciado, o estilo padrão do título é visível e, cerca de 1 segundo depois, o estilo personalizado aparece. Bad UI ...
Aprovado

2
Esta é uma ótima resposta e me ajudou muito. Uma melhoria que eu acrescentaria seria mover o mecanismo de cache para sua própria classe fora do TypefaceSpan. Corri para outras situações em que estava usando um Typeface sem intervalo e isso me permitiu tirar proveito do cache nessas situações.
Justin

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
Essa deve ser a resposta preferida para a pergunta. Funciona muito bem, também com "action_bar_subtitle"! Obrigado!
Zordid 03/02

20
se os desenvolvedores do Android em uma versão mais recente alterarem o ID do recurso de "action_bar_title" para outro nome, nada disso funcionará. é por isso que não é tão votado.
Diogo Bento

6
Obras sobre api> 3,0, mas não em 2.x para appcompat
Aman Singhal

1
Isso muda a fonte e tudo. Mas quando eu for para a próxima Atividade e pressionar a fonte, ela será revertida. Eu acho que tem algo a ver com as propriedades do ActionBar.
Pranav Mahajan

11
@ Digit: Isso funcionou muito bem para o "Tema Holo", mas não para o "Tema material" (Android L). O titleId foi encontrado, mas o textview é nulo. Alguma idéia de como corrigir isso? obrigado!
Michael D.

34

Da biblioteca de suporte do Android v26 + Android Studio 3.0 , este processo tornou-se fácil como um movimento !!

Siga estas etapas para alterar a fonte do título da barra de ferramentas:

  1. Leia Fontes para Download e selecione qualquer fonte da lista ( minha recomendação ) ou carregue uma fonte personalizada res > fontconforme Fontes em XML
  2. Em res > values > styles, cole o seguinte ( use sua imaginação aqui! )

    <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. Insira uma nova linha nas propriedades da barra de ferramentas, app:titleTextAppearance="@style/TextAppearance.TabsFont"como mostrado abaixo

    <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. Aproveite o estilo de fonte Custom Actionbar Title !!


2
Isso é ótimo para barras de ferramentas. Existe alguma maneira de fazer isso em todo o aplicativo, como quando você tem a barra de aplicativos padrão em uma nova atividade?
Jordan H

14

A biblioteca de caligrafia permite definir uma fonte personalizada por meio do tema do aplicativo, que também se aplicaria à barra de ação.

<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>

Tudo o que é necessário para ativar o Caligrafia é anexá-lo ao seu contexto de Atividade:

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

O atributo personalizado padrão é fontPath, mas você pode fornecer seu próprio atributo personalizado para o caminho, inicializando-o na sua classe Application CalligraphyConfig.Builder. O uso de android:fontFamilyfoi desencorajado.


API mínima 16 para esta solução
Sami Eltamawy

minSdk 7 de acordo com o arquivo de compilação do projeto, mas estou usando isso em um projeto minSdk 18 e não fiz nenhuma verificação adicional sobre isso. Qual é o método ofensivo usado?
Thoutbeckers

Sua API mínima 7, Apenas o exemplo é API16. Ele é compatível com appcompat-v7 +
Chris.Jenkins #

11

É um truque feio, mas você pode fazer assim (já que action_bar_title está oculto):

    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");
    }

Esse código é para dispositivos pós-GINGERBREAD, mas também pode ser facilmente estendido para trabalhar com a barra de ação Sherlock

PS Com base no comentário @pjv, há uma maneira melhor de encontrar o ID do título da barra de ação

final int titleId = 
    Resources.getSystem().getIdentifier("action_bar_title", "id", "android");

4
Prefiro a resposta do dtmilano em stackoverflow.com/questions/10779037/… . É semelhante, mas um pouco mais à prova de futuro.
pjv

1
@pjv - concordou. Parece menos "hacky".
Modifiquei

1
Portanto, a pergunta é sobre fonte personalizada. Isso responde como obter a exibição de texto da barra de ação padrão .
AlikElzin-Kilaka

@ kilaka - a ideia era que, se você obtivesse a configuração de exibição de texto, a fonte personalizada seria trivial. Este é um post antigo, porém, eu acho resposta twaddington é muito preferido
Bostone

8

O código a seguir funcionará para todas as versões. Eu verifiquei isso em um dispositivo com pão de gengibre, bem como no dispositivo 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);
        }
    }

Isso funciona para mim no ActionBar e no AppCompat ActionBar. Mas o último só funciona se eu tentar encontrar a exibição do título após onCreate (), por exemplo, colocá-la em onPostCreate () faz o truque.
Harri

8

use a nova barra de ferramentas na biblioteca de suporte, crie sua barra de ação como sua ou use o código abaixo

Inflar o Textview não é uma boa opção, tente o construtor Spannable String

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);

copie abaixo da aula

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);
    }

}

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);

Ótimo Isso está funcionando perfeitamente, como posso colocar essa barra de aplicativos no centro?
Prasath 12/04

trabalhando como um encanto .. apenas substitua typeface.ITALICpor Typeface.ITALICpara não ter nenhum aviso de membro estático
Zain

3

Se você deseja definir o tipo de letra para todos os TextViews em toda a atividade, pode usar algo como isto:

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);
}

E o 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));
    }
}

3

Eu apenas fiz o seguinte dentro da função 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);

Estou usando as bibliotecas de suporte, se você não as estiver usando, acho que você deve mudar para getActionBar () em vez de getSupportActionBar ().

No Android Studio 3, você pode adicionar fontes personalizadas seguindo estas instruções https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html e, em seguida, use sua fonte recém-adicionada em " font_to_be_used "


1

Para adicionar à resposta de @ Sam_D, eu tive que fazer isso para que funcionasse:

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();

Parece exagero - referenciando v.findViewById (R.id.title)) duas vezes - mas essa é a única maneira de me permitir fazê-lo.


1

Para atualizar a resposta correta.

primeiro: defina o título como false, porque estamos usando a visualização personalizada

    actionBar.setDisplayShowTitleEnabled(false);

segundo: crie 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>

Por último:

//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
    }

DOWNLOAD FONT FILE: porque estou armazenando o arquivo no cloudinary, por isso tenho um link para fazer o download.

/**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

Nenhuma visualização de texto personalizada é necessária!

Primeiro, desative o título no toobar no seu código java: getSupportActionBar (). SetDisplayShowTitleEnabled (false);

Em seguida, basta adicionar um TextView dentro da barra de ferramentas:

<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>

isso não vai funcionar com as mais recentes bibliotecas jetpack navegação UI
Ali Asheer

1

Tente usar este

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);

0

Precisamos usar reflexões para alcançar esse objetivo.

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) {
        }
    }

-1

TENTE ISSO

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);
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.