رفتن به مطلب
انجمن اندروید ایران | آموزش برنامه نویسی اندروید و موبایل
  • android.png.1fab383bc8500cd93127cebc65b1dcab.png

تغییر فونت با تنظیمات برنامه


پست های پیشنهاد شده

سلام من از کتابخانه کالی گرافی استفاده کردم برای تغییر فونت کل برنامه ومشکلی ندارم فقط یه سوالی که دارم اینه که من تو بخش تنظیمات اومدم ودو سه تا فونت تعریف کردم و با اسپینر اون هارو تغییر میدم و در یک تکس ویو این تغییرات رو اعمال میکنم و با SharedPreferences اونو ذخیره کردم تا اینجا مشکلی نیست....

من اومدم و میخام فونت کل برنامه رو عوض کنم .

تو کتابخونه کالی گرافی یک کلاس هست که فونت کل برنامه اونجا تعریف شده کدش هم این طوریه :


[align=left]

   public void onCreate() {
        super.onCreate();


        CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
                        .setDefaultFontPath(font)
                        .setFontAttrId(R.attr.fontPath)
                        .build()
        );
    }


[align=right]فونت قرمز رنگ آدرس فونت هست.

حالا میخام فونت کل برنامه رو از تنظیمات تغییر بدم من اومدم و با اضافه کردن کد زیر خواستم تا آدرس فونت رو تغییر بدم.یعنی کاربر از یک اسپینر در تنظیمات فونت رو انتخاب میکنه و پس از انتخاب کل فونت برنامه تغییر پیداکنه.


[align=left]

   public void onCreate() {
        super.onCreate();
string font;
        SharedPreferences shared = getSharedPreferences("Shared", MODE_PRIVATE);
        SharedPreferences.Editor editor = shared.edit();

        int fontNum = shared.getInt("FontNum",0);
        switch (fontNum){
            case 0:
                font="font1";
                break;
            case 1:
                font="font2";
                break;
            default:
                font="font1";
              break;
        }


        CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
                        .setDefaultFontPath(font)
                        .setFontAttrId(R.attr.fontPath)
                        .build()
        );

    }


[align=right]تو کد بالا من اومدم و اندیس اسپینر رو گرفتم و ذخیره کردم و به این کلاس گفتم که اون فونت رو اجرا کنه با دستو سوییچ.

مشکل اینه که فونت تغییر نمیکنه نمیدونم چیکار کنم ...

کسی هست که از این کتابخونه استفاده کرده باشه وبتونه چند فونت تو برنامه بزاره ؟؟؟؟

لطفا کمک کنید..

ممنون[/align]

[/align]

[/align]

[/align]

لینک ارسال
به اشتراک گذاری در سایت های دیگر

شما نباید دوباره Config کتابخونه رو تغییر بدی و فقط یک بار باید این کار انجام بشه توی همون کلاسی که ساختی

برای تغییر فونت یه ویو با جاوا از متد setTypeface استفاده کن (فونت های مورد نظرت باید تو فولدر assets باشن)

مثال:

TextView text = new TextView(this);
text.setTypeface(Typeface.createFromAsset(getAssets(), "default.ttf"));

zw0Kt.jpg.34c777099f7987c69c30957c851d52e9.jpg

لینک ارسال
به اشتراک گذاری در سایت های دیگر

ممنون آره فهمیدم پس نمیشه از کتابخونه کالی گرافی استفاده کرد و دو فونت رو استفاده کرد؟ اگه میشد خیلی راحت بود !!

حالا شما راه حل ساده تر (از لحاظ کد نویسی) ندارین؟

راه حل شما خیلی کد میخاد باید واسه همه ی متن هام این کد رو اضافه کنم!!

بقیه برنامه ها واسه تغییر فونت از چه راه حلی استفاده میکنن؟؟

بازم ممنون.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

من نگفتم نمیشه استفاده کرد از کالیگرافی. شما فونتی که بیشتر از همه توی برنامتون استفاده میشه رو به کالیگرافی بدین بعد موارد استثنا رو مثل کدی که گذاشتم فونتش رو تغییر بدید.

من خودم اینجوری از کالیگرافی استفاده می کنم.

توی کدهای xml هم می تونید برای عناصر مورد نظرتون با مشخصه fontpath فونت مشخص کنید.

اطلاعات بیشتر:

Calligraphy راه حلی برای تغییر فونت در اندروید - Hive | مجله طراحی و برنامه‌نویسی

لینک ارسال
به اشتراک گذاری در سایت های دیگر

بازم ممنون منظور من تغییر فونت کل برنامه توسط کاربر هست مثل سایر برنامه ها تو قسمت تنظیمات برنامه از چه کدی استفاده کنم تا فونت تغییر کنه؟

البته به نظرم میشه داخل یک shared pa... ذخیره کردش و تو بقیه اکتیویتی ها ازش استفاده کرد ولی این کار کد های زیادی میخاد برای هر متن و تکس ویو و ادیت تکس و ... باید یک بار ست کنم که خیلی کد میشه...

لینک ارسال
به اشتراک گذاری در سایت های دیگر

پس شما میخوای که کاربر بتونه فونتی که شما برای کالیگرافی تنظیم کردی رو در زمان اجرا عوض کنه؟ بعید می دونم این کار شدنی باشه. حداقل من راه حلی براش پیدا نکردم.

بله اگر بخوای فونت رو از shared pref بگیری باید دونه دونه با setTypeface فونت ها رو تغییر بدی.

یه کد جالب پیدا کردم که یه متده که دونه دونه عناصر اکتیویتی مورد نظر رو بررسی می کنه و فونتشون رو تغییر میده (اگه قابلیت تغییر فونت داشته باشن):

public void setFont(ViewGroup group, Typeface font) {
       int count = group.getChildCount();
       View v;
       for (int i = 0; i < count; i++) {
           v = group.getChildAt(i);
           if (v instanceof TextView || v instanceof EditText || v instanceof Button) {
               ((TextView) v).setTypeface(font);
           } else if (v instanceof ViewGroup)
               setFont((ViewGroup) v, font);
       }
   }

توی کد اگه دقت کنی میبینی که دستور شرطی بررسی میکنه اگر View مورد نظر یه TextView یا EditText یا Button بود فونت رو تغییر میده.

لینک ارسال
به اشتراک گذاری در سایت های دیگر

آره منظورم همینه که کاربر تغییر بده .

ممنون این کد رو چطوری استفاده کنم  و اون ViewGroup group  به عنوان آرگیوم  دادن چیه ؟؟ از کجا براش بفرستم ؟؟ ممنون

لینک ارسال
به اشتراک گذاری در سایت های دیگر

اون ویوگروپ در واقع ویو ریشه است که عناصر لی اوت شما توش قرار داره. مثلا اگه یه لی اوت داشته باشین که توش یه LinearLayout باشه و عناصرتون توی اون LinearLayout باشن، برای استفاده از این متد باید به LinearLayout تون یه آیدی بدین بعد اون رو توی کد جاوا تعریف کنید.

مثلا:

LinearLayout myLl = (LinearLayout) findViewById(R.id.my_layout);

بعد این myLl رو به عنوان آرگومان اول اون متدی که گذاشتم بهش میدین.

اون متد رو هم می تونید توی دونه دونه اکتیویتی هاتون کپی کنید یا یه کلاس بسازید و این متد رو توش به صورت استاتیک تعریف کنید و در اکتیویتی هاتون فراخونیش کنید. (این کار بهتره چون کد اضافه تولید نمیشه)

لینک ارسال
به اشتراک گذاری در سایت های دیگر

فقط یه نکته اگه لی اوتتون خیلی پیچیده و شلوغ باشه این متد ممکنه سرعت برنامه رو بیاره پایین. البته احتمالش خیلی کمه که این اتفاق بیفته و نگرانش نباشید.

لینک ارسال
به اشتراک گذاری در سایت های دیگر
  • 1 ماه بعد...

سلام .... من  از این کد استفاده کردم اما خطا میده

layout اصلی من یک RelativeLayout هست.

اون رو با آیدی main تعریف کردم و جای group گذاشتم font رو هم قبلا تعریف کردم ... اما بازم خطا میده

کجا اشتباه کردم؟

[shcode=java]

public void setFont(ViewGroup main, Typeface font) {

int count = main.getChildCount();

View v;

for (int i = 0; i < count; i++) {

v = main.getChildAt(i);

if (v instanceof TextView ) {

((TextView) v).setTypeface(font);

} else if (v instanceof ViewGroup)

setFont((ViewGroup) v, font);

}

}

[/shcode]

لینک ارسال
به اشتراک گذاری در سایت های دیگر

کلا راه رو اشتباه میری عزیز این یک متد هست و نمیشه داخل if بزاری باید خارج از متد on create  اکتیویتی این متد رو بنویسی و سپس داخل if اون رو فراخونی کنی ..

لینک ارسال
به اشتراک گذاری در سایت های دیگر

کلا راه رو اشتباه میری عزیز این یک متد هست و نمیشه داخل if بزاری باید خارج از متد on create  اکتیویتی این متد رو بنویسی و سپس داخل if اون رو فراخونی کنی ..

ممنون ... خارج متد on create گذاشتم خطا رفع شد ... فقط چطور در if فراخونیش کنم؟

لینک ارسال
به اشتراک گذاری در سایت های دیگر

خواهش میکنم .

این طوری :::

setFont(ViewGroup main, Typeface font)

حالا هر جا این متد روفراخونی کنی اون عملیات اجرا میشه متناسب با اون ویو و فونت ارسالی .

لینک ارسال
به اشتراک گذاری در سایت های دیگر

خواهش میکنم .

این طوری :::

setFont(ViewGroup main, Typeface font)

حالا هر جا این متد روفراخونی کنی اون عملیات اجرا میشه متناسب با اون ویو و فونت ارسالی .

ممنون از پاسخدهی سریع و عالیتون ....

یک مشکل عجیب دارم با تعریف Layout اکتیویتیم!! ... وقتی تعریفش می کنم و برنامه رو ران می کنم بسته میشه  اکتیویتی!! ....

[shcode=java]

RelativeLayout main = (RelativeLayout) findViewById(R.id.mainLayout);

[/shcode]

خارج متد on create هم میذارمش ولی وقتی داخل متد میذارم اجرا میشه .... منطقیه؟ .... چون متدی که شما گفتین باید قبل on create باشه یعنی قبلش باید layout تعریف شده باشه اما الان برعکسه!!

لینک ارسال
به اشتراک گذاری در سایت های دیگر

خواهش میکنم.

فک نکنم مشکلی باشه .

مطمئنی که آی دی و نوع اون ویو درسته ؟؟  و مطمئنی از این خط ایراد میگیره ؟؟

اگه آره ::

باید لیوت رو با لیوت تعریف کنی نه آی دی  این شکلی :::

RelativeLayout main = (RelativeLayout) findViewById(R.layout.mainLayout);


اینم بگم که واسه من با ای دی کار میکنه و مشکلی نداره..


اها فهمیدم شما خارج از آن کریت وداخل کلاستون اول تعریف کنید :

RelativeLayout main;

سپس شناسایی کنین حل بشه ::

 main = (RelativeLayout) findViewById(R.layout.mainLayout);

لینک ارسال
به اشتراک گذاری در سایت های دیگر

خیلی ممنون بابت جواب هاتون ....

متاسفانه نشد همون مشکلو داره ...

این کد فراخوانی تابع هم توی شرط if میذارم خطا دار میشه!!

فایل پیوست:

لینک ارسال
به اشتراک گذاری در سایت های دیگر

فک می کنم شما اصلان سینتکس رو رعایت نکردی یه جا مشکل املایی داره احتملاً بگرد دنبالش ارور های لوگ کتت رو بزار بهت بگم

لینک ارسال
به اشتراک گذاری در سایت های دیگر

فک می کنم شما اصلان سینتکس رو رعایت نکردی یه جا مشکل املایی داره احتملاً بگرد دنبالش ارور های لوگ کتت رو بزار بهت بگم

فایل پیوست در مورد خطا موقع فراخوانی تابع قرار دادم ...

اما مشکل دیگه که دوسته حرفه ایمون راهنمایی کردن  این هست که layout رو مجبورم بعد متد و داخل on create معرفی کنم وگرنه برنامه موقع اجرا بسته میشه

لینک ارسال
به اشتراک گذاری در سایت های دیگر

خب برادر من بهت میگم مشکل املایی داری که ارور های لوکتت رو نگاه سمی کالن نزاشتی انتهای دستوراتت (; )     پرانتز هم دقت کن

لینک ارسال
به اشتراک گذاری در سایت های دیگر

خب برادر من بهت میگم مشکل املایی داری که ارور های لوکتت رو نگاه سمی کالن نزاشتی انتهای دستوراتت (; )     پرانتز هم دقت کن

والا این کد رو دوستمون جناب  samirsamiri معرفی کردند برای فراخوانی تابع .... سیمیکالون هم گذاشتم ... اما خطا دار بازم ... الان درسته این کد که غلط املایی هم نداشته باشه چجوریه؟

[shcode=java]

setFont(ViewGroup main, Typeface font);

[/shcode]

لینک ارسال
به اشتراک گذاری در سایت های دیگر

روی سمی کالن ها تو ارور کلیک کن ببین تویه کدوم خط می برتت

روی همین تیکه کد که گذاشتم میاره ولی خوب منطقی نسیت که داخل پرانتزا کلی سیمیکالون باشه که ... فک میکنم مشکل خطای املایی نباشه

لینک ارسال
به اشتراک گذاری در سایت های دیگر

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • اضافه کردن...