studio font color change bar android fonts android-actionbar

android - font - ¿Cómo establecer una fuente personalizada en el título de la barra de acción?



toolbar change font (16)

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


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ás usando, supongo que deberías 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 "


Desde la biblioteca de soporte de Android v26 + Android Studio 3.0 en adelante, ¡este proceso se ha vuelto fácil como una película!

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 para res > font según 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 la app:titleTextAppearance="@style/TextAppearance.TabsFont" propiedades de la barra 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 del estilo de fuente personalizado de la barra de acción!


El siguiente código funcionará para todas las versiones. Lo verifiqué en un dispositivo con pan de jengibre y en un 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); } }


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 puede extenderse fácilmente para trabajar con la barra de acción Sherlock

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


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>


La biblioteca de Calligraphy 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 Caligrafía 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 al inicializarlo en su clase de aplicación con CalligraphyConfig.Builder . Uso de android:fontFamily ha sido desalentado.


Necesitamos utilizar reflexiones para lograr esto.

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


No se requiere una vista de texto personalizada!

Primero, deshabilite el título en la barra de herramientas 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>


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


Para actualizar la respuesta correcta.

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

actionBar.setDisplayShowTitleEnabled(false);

en segundo lugar: 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 EL 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; } } } }


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 una exageración: hacer referencia a v.findViewById (R.id.title)) dos veces, pero esa es la única forma en que me permitiría hacerlo.


Puedes hacer esto usando una clase personalizada TypefaceSpan . Es superior al enfoque customView 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 clase personalizada TypefaceSpan pasa su contexto de actividad y el nombre de una tipografía en su directorio de assets/fonts . Carga el archivo y almacena en caché una nueva instancia de Typeface en la memoria. La implementación completa de TypefaceSpan es 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 implementelo en el método onCreate su actividad como se muestra arriba.


Si desea establecer el tipo de letra para todas las vistas de texto en toda la actividad, puede utilizar 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)); } }


use la nueva barra de herramientas en la biblioteca de soporte, diseñe su barra de acción como suya o use el código a continuación

Inflar Textview no es una buena opción. Pruebe 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);

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


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


int titleId = getResources().getIdentifier("action_bar_title", "id", "android"); TextView yourTextView = (TextView) findViewById(titleId); yourTextView.setTextColor(getResources().getColor(R.color.black)); yourTextView.setTypeface(face);