¿Cómo establecer una fuente personalizada en el título de ActionBar?


257

¿Cómo (si es posible) podría establecer una fuente personalizada en un texto de título de ActionBar (solo, no el texto de la pestaña) con una fuente en mi carpeta de activos? No quiero usar la opción android: logo.

Respuestas:


211

Estoy de acuerdo en que esto no es completamente compatible, pero esto es lo que hice. Puede usar una vista personalizada para su barra de acción (se mostrará entre su icono y sus elementos de acción). Estoy usando una vista personalizada y tengo el título nativo deshabilitado. Todas mis actividades se heredan de una sola actividad, que tiene este código en 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);

Y mi diseño xml (R.layout.titleview en el código anterior) se ve así:

<?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
Esto funciona bien para el título, pero si desea un título y pestañas, coloca la vista personalizada a la derecha de las pestañas que no quedan como el título. Me encantaría poder alterar el título real.
Draksia

2
Gran solución Si necesita una clase de vista de texto personalizada que permita la especificación de la fuente en XML, ¡pruebe la mía! github.com/tom-dignan/nifty : es muy fácil.
Thomas Dignan

¿Este código tiene que estar en onCreate ()? Necesito configurarlo dinámicamente fuera de mi actividad ...
IgorGanapolsky

necesita cambiar la fuente dinámicamente? ¿O solo está buscando cambiar el título una vez que la fuente ya está personalizada?
Sam Dozor

2
Esto funciona, pero es mucho trabajo. Además: pierde algunas características del título estándar, como resaltarlo cuando se hace clic en el icono ... Los títulos personalizados no deben usarse para volver a crear el diseño del título estándar solo para cambiar las fuentes ...
Zordid

422

Puede hacer esto usando una TypefaceSpanclase personalizada . Es superior al customViewenfoque indicado anteriormente porque no se rompe cuando se usan otros elementos de la Barra de acción, como expandir las vistas de acción.

El uso de tal clase se vería así:

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

La TypefaceSpanclase personalizada pasa su contexto de actividad y el nombre de un tipo de letra en su assets/fontsdirectorio. Carga el archivo y almacena en caché una nueva Typefaceinstancia en la memoria. La implementación completa de TypefaceSpanes sorprendentemente simple:

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

Simplemente copie la clase anterior en su proyecto e impleméntelo en el onCreatemétodo de su actividad como se muestra arriba.


20
Buena respuesta. Lo que es bueno ver es que también ha mostrado una forma de almacenar en caché el elemento tipográfico.
Anand Sainath

66
Esto es excelente. Un problema: si el textAllCapsatributo se establece en verdadero en TextView subyacente (por ejemplo, a través de un tema), la fuente personalizada no aparecerá. Esto fue un problema para mí cuando apliqué esta técnica a los elementos de la pestaña de la barra de acción.
James

44
Tenga en cuenta que esta implementación de la clase supone que coloca sus archivos de fuente assets/fonts/. Si usted acaba de tirar los archivos .ttf / .otf en el activo y no en una subcarpeta, debe modificar la siguiente línea de código en consecuencia: String.format("fonts/%s", typefaceName). Perdí 10 minutos intentando resolverlo. Si no lo hace, obtendrájava.lang.RuntimeException: Unable to start activity ComponentInfo{com.your.pckage}: java.lang.RuntimeException: native typeface cannot be made
Dzhuneyt

1
En el momento de iniciar la aplicación, el estilo de título predeterminado es visible y aproximadamente 1 segundo después aparece el estilo personalizado. Mala interfaz de usuario ...
Voto a favor

2
Esta es una gran respuesta y me ayudó mucho. Una mejora que agregaría sería mover el mecanismo de almacenamiento en caché a su propia clase fuera de TypefaceSpan. Me encontré con otras situaciones en las que estaba usando un Tipo de letra sin intervalo y esto me permitió aprovechar la memoria caché también en esas situaciones.
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
Esta debería ser la respuesta preferida a la pregunta. ¡Funciona muy bien, también con "action_bar_subtitle"! ¡Gracias!
Zordid

20
Si los desarrolladores de Android en una versión más nueva cambian la identificación del recurso de "action_bar_title" a otro nombre, entonces nada de esto funcionará. por eso no es tan votado.
Diogo Bento

66
Funciona en api> 3.0 pero no en 2.x para appcompat
Aman Singhal

1
Esto cambia la fuente y todo. Pero cuando voy a la siguiente Actividad y presiono hacia atrás, la fuente se revierte. Supongo que tiene algo que ver con las propiedades de ActionBar.
Pranav Mahajan

11
@Digit: Eso funcionó muy bien para el "Tema Holo", pero no para el "Tema Material" (android L). Se encuentra el titleId, pero la vista de texto es nula ... ¿alguna idea de cómo solucionar esto? ¡Gracias!
Michael D.

34

Desde Android Support Library v26 + Android Studio 3.0 en adelante, ¡este proceso se ha vuelto fácil como un toque!

Siga estos pasos para cambiar la fuente del título de la barra de herramientas:

  1. Lea las fuentes descargables y seleccione cualquier fuente de la lista ( mi recomendación ) o cargue una fuente personalizada res > fontsegún las fuentes en XML
  2. En res > values > styles, pegue lo siguiente (¡ use su imaginación aquí! )

    <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. Inserte una nueva línea en las propiedades de su barra de herramientas app:titleTextAppearance="@style/TextAppearance.TabsFont"como se muestra a continuación

    <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. ¡Disfruta de un estilo de fuente de título de Actionbar personalizado!


2
Esto es genial para las barras de herramientas. ¿Alguna forma de hacer esto en toda la aplicación, como cuando tienes la barra de aplicaciones predeterminada en una nueva actividad?
Jordan H

14

La biblioteca de caligrafía le permite establecer una fuente personalizada a través del tema de la aplicación, que también se aplicaría a la barra de acción.

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

Todo lo que se necesita para activar Calligraphy es adjuntarlo a su contexto de Actividad:

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

El atributo personalizado predeterminado es fontPath, pero puede proporcionar su propio atributo personalizado para la ruta inicializándolo en su clase de Aplicación con CalligraphyConfig.Builder. El uso de android:fontFamilyha sido desalentado.


API 16
mínima

minSdk 7 de acuerdo con el archivo de compilación del proyecto, pero estoy usando esto en un proyecto minSdk 18 y no hice más verificaciones al respecto. ¿Cuál es el método ofensivo utilizado?
thoutbeckers

Su mínimo API 7, solo el ejemplo es API16. es compatible con appcompat-v7 +
Chris.Jenkins

11

Es un truco feo pero puedes hacerlo así (ya 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");
    }

Este código es para dispositivos posteriores a GINGERBREAD, pero también se puede extender fácilmente para que funcione con la barra de acción Sherlock

PD Basado en el comentario de @pjv, hay una mejor manera de encontrar la identificación del título de la barra de acción

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

44
Prefiero la respuesta de dtmilano en stackoverflow.com/questions/10779037/… . Es similar pero un poco más a prueba de futuro.
pjv

1
@pjv: de acuerdo. Parece menos "hacky".
Modifiqué

1
Entonces la pregunta es sobre la fuente personalizada. Esto responde cómo obtener la vista de texto de la barra de acción predeterminada .
AlikElzin-kilaka

@kilaka: la idea era que si obtenía la configuración de la vista de texto, la fuente personalizada sería trivial. Esta es una entrada antigua, sin embargo, creo que la respuesta es mucho más preferido twaddington
Bostone

8

El siguiente código funcionará para todas las versiones. Verifiqué esto en un dispositivo con pan de jengibre, así como en el 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);
        }
    }

Esto funciona para mí tanto en ActionBar como en AppCompat ActionBar. Pero este último solo funciona si trato de encontrar la vista del título después de onCreate (), por lo que, por ejemplo, colocarlo en onPostCreate () hace el truco.
Harri

8

use una nueva barra de herramientas en la biblioteca de soporte, diseñe su barra de acción como propia o use el siguiente código

Inflar Textview no es una buena opción, prueba el generador de cadenas Spannable

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

copia debajo de la clase

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

Genial. Esto funciona perfectamente. ¿Cómo puedo llevar esta barra de aplicaciones al centro?
Prasath

funciona como un encanto ... simplemente reemplace typeface.ITALICcon Typeface.ITALICpara no tener advertencia de miembro estático
Zain

3

Si desea establecer el tipo de letra para todas las vistas de texto en toda la actividad, puede usar algo como esto:

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

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

Acabo de hacer lo siguiente dentro de la función 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);

Estoy usando las bibliotecas de soporte, si no las está usando, supongo que debería cambiar a getActionBar () en lugar de getSupportActionBar ().

En Android Studio 3 puede agregar fuentes personalizadas siguiendo estas instrucciones https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html y luego usar su fuente recién agregada en " font_to_be_used "


1

Para agregar a la respuesta de @ Sam_D, tuve que hacer esto para que funcione:

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 excesivo, haciendo referencia a v.findViewById (R.id.title)) dos veces, pero esa es la única forma en que me dejaría hacerlo.


1

Para actualizar la respuesta correcta.

en primer lugar: establezca el título en falso, porque estamos usando una vista personalizada

    actionBar.setDisplayShowTitleEnabled(false);

segundo: crear 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
    }

DESCARGAR ARCHIVO DE FUENTES: porque estoy almacenando el archivo en cloudinary, así que tengo un enlace para descargarlo.

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

¡No se requiere una vista de texto personalizada!

Primero, deshabilite el título en la barra demasiado en su código java: getSupportActionBar (). SetDisplayShowTitleEnabled (false);

Luego, simplemente agregue un TextView dentro de la barra de herramientas:

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

esto no funcionará con las últimas bibliotecas de jetpack de interfaz de usuario de navegación
Ali Asheer

1

Intenta usar esto

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

Necesitamos usar reflexiones para lograr esto

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

PRUEBA ESTO

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);
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.