سلام به همه :-)
دوستان راهی هست که از یک فونت تو کل برنامه استفاده کرد و نیاز نباشه واسه هر تکست ویو یا باتون اون و اعمال کنیم !
سلام به همه :-)
دوستان راهی هست که از یک فونت تو کل برنامه استفاده کرد و نیاز نباشه واسه هر تکست ویو یا باتون اون و اعمال کنیم !
سلام.
public class FontUtils { static Typeface textFont = null;
static Typeface lightFont = null;
public static void overrideFonts(final Context context, final View v) {
try {
if (textFont == null) {
textFont = Typeface.createFromAsset(context.getAssets(), "fonts/Vazir.ttf");
}
if (v instanceof ViewGroup) {
ViewGroup vg = (ViewGroup) v;
for (int i = 0; i < vg.getChildCount(); i++) {
View child = vg.getChildAt(i);
overrideFonts(context, child);
}
} else {
((TextView) v).setTypeface(textFont);
}
} catch (Exception e) {
Log.d("font", "exception");
}
}
public static void overrideFontsLight(final Context context, final View v) {
try {
if (lightFont == null) {
lightFont = Typeface.createFromAsset(context.getAssets(), "fonts/Vazir-Light.ttf");
}
if (v instanceof ViewGroup) {
ViewGroup vg = (ViewGroup) v;
for (int i = 0; i < vg.getChildCount(); i++) {
View child = vg.getChildAt(i);
overrideFonts(context, child);
}
} else {
((TextView) v).setTypeface(lightFont);
}
} catch (Exception e) {
Log.d("font", "exception");
}
}
}
برای استفاده هم root view رو بعنوان پارامتر میدیم.
اقا تشکر :-)
یه توضیح مختصر هم بدی خیلی لطف کردین خصوصا این مورد رو
برای استفاده هم root view رو بعنوان پارامتر میدیم.
خواهش میکنم.
root view یعنی همون viewgroup که تمام view ها رو شامل میشه .
این تکه کد در واقع میاد root view رو پیمایش میکنه و اون ویوهایی که قابلیت تغییر فونت رو دارند فونت اشون رو تغییر میده.
نحوه استفاده در یک fragment :
public class MyFrag extends Fragment {
.....
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.my_frag, container, false);
FontUtils.overrideFonts(getActivity(),view);
return view;
}
}
my_frag.xml :
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv1"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv2"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv3"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
من قبلاً از همین روش استفاده می کردم، یعنی تو هر اکتیویتی این متد رو صدا میزدم و بعنوان پارامتر android.R.id.content رو براش میفرستادم.
ایرادش این هست که باید در هر اکتیویتی، Dialog فرگمنت یا هر عنصر نمایشی دیگه این متد صدا زده بشه. و ایراد دیگه هم این هست که در شرایطی که تعداد ویو ها زیاد باشه، باعث تاخیر در نمایش اکتیویتی میشه.
الان از این متد استفاده می کنم:
public static void overrideFont(Context context, String defaultFontNameToOverride, String customFontFileNameInAssets) {
try {
final Typeface customFontTypeface = Typeface.createFromAsset(context.getAssets(), customFontFileNameInAssets);
final Field defaultFontTypefaceField = Typeface.class.getDeclaredField(defaultFontNameToO verride);
defaultFontTypefaceField.setAccessible(true);
defaultFontTypefaceField.set(null, customFontTypeface);
} catch (Exception e) {
Log.e("SET_FONT", "Can not set custom font " + customFontFileNameInAssets + " instead of " + defaultFontNameToOverride);
}
}
در این حالت باید به تم (Theme) اصلی برنامه تون این آیتم رو هم اضافه کنید:
<item name="android:typeface">serif</item>
روش استفاده: تو کلاس Application فقط یکبار این متد رو صدا میزنید و نیاز نیست تو هر اکتیویتی جداگانه صدا زده بشه:
overrideFont(this, "SERIF", "fonts/IRANSans.ttf");
فونت من در Assets و در پوشه ی fonts ذخیره شده.
این روش هم ایراداتی داره، یکی این اینکه بر اساس تست ها من روی همه ی ورژن ها تا 7.1 جواب میده به جز 5.0.1 (APIش خاطرم نیست) و مورد بعد هم اینکه اگر از کتابخانه ای استفاده بشه که خودش آیتم android:typeface رو override کرده باشه، فونت عوض نمیشه، نمونه ش رو میشه تو اکشن بار دید.
به هرعنوان من روش دوم رو بیشتر می پسندم، شاید با ترکیب این دو به الگوی تغییر فونت کاملی برسید.
کتابخونه Calligraphy هم هست.