PDA

View Full Version : استفاده از فونت سفارشی در کل برنامه !



ghasem110deh
یک شنبه 30 آبان 1395, 11:22 صبح
سلام به همه :-)
دوستان راهی هست که از یک فونت تو کل برنامه استفاده کرد و نیاز نباشه واسه هر تکست ویو یا باتون اون و اعمال کنیم !

rezaricky
یک شنبه 30 آبان 1395, 12:31 عصر
سلام.
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 رو بعنوان پارامتر میدیم.

ghasem110deh
یک شنبه 30 آبان 1395, 12:55 عصر
اقا تشکر :-)
یه توضیح مختصر هم بدی خیلی لطف کردین خصوصا این مورد رو


برای استفاده هم root view رو بعنوان پارامتر میدیم.

rezaricky
یک شنبه 30 آبان 1395, 15:35 عصر
خواهش میکنم.
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>

Nevercom
سه شنبه 02 آذر 1395, 10:26 صبح
من قبلاً از همین روش استفاده می کردم، یعنی تو هر اکتیویتی این متد رو صدا میزدم و بعنوان پارامتر 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 کرده باشه، فونت عوض نمیشه، نمونه ش رو میشه تو اکشن بار دید.

به هرعنوان من روش دوم رو بیشتر می پسندم، شاید با ترکیب این دو به الگوی تغییر فونت کاملی برسید.

#root#
سه شنبه 02 آذر 1395, 21:51 عصر
کتابخونه Calligraphy (https://github.com/chrisjenx/Calligraphy) هم هست.