जवाबों:
मैं मानता हूं कि यह पूरी तरह से समर्थित नहीं है, लेकिन यहां मैंने जो किया है। आप अपने ऐक्शन बार के लिए कस्टम दृश्य का उपयोग कर सकते हैं (यह आपके आइकन और आपके एक्शन आइटम के बीच प्रदर्शित होगा)। मैं एक कस्टम दृश्य का उपयोग कर रहा हूं और मेरे पास मूल शीर्षक अक्षम है। मेरी सभी गतिविधियाँ एक एकल गतिविधि से विरासत में मिली हैं, जिसमें यह कोड 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>
आप एक कस्टम 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
वर्ग आपकी गतिविधि संदर्भ और आपकी 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
विधि में लागू करें जैसा कि ऊपर दिखाया गया है।
textAllCaps
विशेषता अंतर्निहित TextView (जैसे एक विषय के माध्यम से) पर सही पर सेट है, तो कस्टम फ़ॉन्ट दिखाई नहीं देगा। मेरे लिए यह एक समस्या थी जब मैंने इस तकनीक को एक्शन बार टैब आइटम पर लागू किया।
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
int titleId = getResources().getIdentifier("action_bar_title", "id",
"android");
TextView yourTextView = (TextView) findViewById(titleId);
yourTextView.setTextColor(getResources().getColor(R.color.black));
yourTextView.setTypeface(face);
से Android समर्थन लाइब्रेरी v26 + एंड्रॉयड स्टूडियो 3.0 के बाद, इस प्रक्रिया को आसान एक झटका के रूप में बन गया है !!
टूलबार शीर्षक के फ़ॉन्ट को बदलने के लिए इन चरणों का पालन करें:
res > font
अनुसार एक कस्टम फ़ॉन्ट लोड करेंमें 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>
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"/>
कस्टम एक्शनबार शीर्षक फ़ॉन्ट स्टाइल का आनंद लें !!
सुलेख पुस्तकालय देना आप अनुप्रयोग विषय है, जो भी कार्रवाई बार पर लागू होगा के माध्यम से एक कस्टम फ़ॉन्ट सेट है।
<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
, लेकिन आप अपने अनुप्रयोग वर्ग में इसे प्रारंभ करके पथ के लिए अपनी स्वयं की कस्टम विशेषता प्रदान कर सकते हैं CalligraphyConfig.Builder
। के उपयोग android:fontFamily
को हतोत्साहित किया गया है।
यह एक बदसूरत हैक है, लेकिन आप इसे इस तरह से कर सकते हैं (चूंकि एक्शन_बार_टाइटल छिपा हुआ है):
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 उपकरणों के लिए है, लेकिन इसे एक्शनबार शर्लक के साथ भी काम करने के लिए आसानी से बढ़ाया जा सकता है
PS @pjv टिप्पणी के आधार पर एक्शन बार टाइटल आईडी खोजने का एक बेहतर तरीका है
final int titleId =
Resources.getSystem().getIdentifier("action_bar_title", "id", "android");
निम्नलिखित कोड सभी संस्करणों के लिए काम करेगा। मैंने इसे जिंजरब्रेड के साथ-साथ जेलीन डिवाइस पर भी जांचा
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);
}
}
लायब्रेरी में नए टूलबार का उपयोग करें अपने एक्शनबार को अपने अनुसार डिज़ाइन करें या कोड के नीचे उपयोग करें
टेक्स्टव्यू को इन्फ्लेशन करना एक अच्छा विकल्प नहीं है, स्पैननेबल स्ट्रिंग बिल्डर की कोशिश करें
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);
}
}
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);
typeface.ITALIC
साथ बदलने के Typeface.ITALIC
लिए कोई स्थिर सदस्य चेतावनी है
यदि आप संपूर्ण गतिविधि में सभी 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));
}
}
मैंने अभी 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);
मैं समर्थन पुस्तकालयों का उपयोग कर रहा हूं, यदि आप उनका उपयोग नहीं कर रहे हैं तो मुझे लगता है कि आपको getSupportActionBar () के बजाय getActionBar () पर स्विच करना चाहिए।
एंड्रॉइड स्टूडियो 3 में आप इस निर्देश के बाद कस्टम फोंट जोड़ सकते हैं https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml.html और फिर "अपने नए जोड़े गए फ़ॉन्ट का उपयोग करें" font_to_be_used "
@ 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) को संदर्भित करता है - लेकिन यह एकमात्र तरीका है जो मुझे ऐसा करने देगा।
सही उत्तर को अपडेट करने के लिए।
सबसे पहले: शीर्षक को गलत पर सेट करें, क्योंकि हम कस्टम दृश्य का उपयोग कर रहे हैं
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
}
DOWNLOAD FONT FILE: क्योंकि मैं फाइल को क्लाउडिनरी में स्टोर कर रहा हूं इसलिए इसे डाउनलोड करने के लिए मेरे पास इस पर लिंक है।
/**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;
}
}
}
}
कोई कस्टम टेक्स्टव की आवश्यकता नहीं है!
सबसे पहले, अपने जावा कोड में इनोबार में शीर्षक को निष्क्रिय करें: getSupportActionBar ()। SetDisplayShowTitleEnabled (गलत);
उसके बाद, टूलबार के अंदर केवल एक 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>
यह प्रयोग करके देखें
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);
हमें इसे प्राप्त करने के लिए प्रतिबिंबों का उपयोग करने की आवश्यकता है
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) {
}
}
इसे इस्तेमाल करे
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);
}