অ্যান্ড্রয়েডে ওয়েবভিউয়ের ফন্টের মুখ কীভাবে পরিবর্তন করবেন?


97

আমি ওয়েবভিউয়ের ডিফল্ট ফন্টকে একটি কাস্টম ফন্টে পরিবর্তন করতে চাই। আমি অ্যান্ড্রয়েডের জন্য দ্বিভাষিক ব্রাউজার অ্যাপ্লিকেশন বিকাশে ওয়েব ভিউ ব্যবহার করছি।

আমি আমার কাস্টম ফন্টকে সম্পদে রেখে কাস্টম টাইপফেসের উদাহরণ পাওয়ার চেষ্টা করেছি। তবে এখনও আমার ফন্টে ওয়েবভিউয়ের ডিফল্ট ফন্ট সেট করতে পারেনি।

এটি আমি চেষ্টা করেছি:

Typeface font = Typeface.createFromAsset(getAssets(), "myfont.ttf"); 
private WebView webview;
WebSettings webSettings = webView.getSettings();
webSettings.setFixedFontFamily(font);

কেউ কি এটিকে সংশোধন করতে বা ওয়েব ভিউয়ের ডিফল্ট ফন্টকে কাস্টম ফন্টে পরিবর্তন করতে অন্য কোনও পদ্ধতির পরামর্শ দিতে পারে?

ধন্যবাদ!


অবশেষে আমি বুঝতে পারি যে এটি করা যাবে না।
ধনিকা


হাই, আপনি এই ফন্টের মুখের জিনিসটির জন্য কোনও সমাধান খুঁজে পেয়েছেন, আমি হিন্দি ফন্টের জন্য চেষ্টা করছি স্ট্যাকওভারফ্লো . com/q/5868198/501859 । আপনি যদি সমাধান পান তবে আমাকে সহায়তা করুন
কিশোর

@ ধনিকা কীভাবে একই সমস্যার মুখোমুখি এই সমস্যাটি সমাধান করবেন।
নাগরজুনা

WebView টেক্সট সেট কাস্টম ফন্ট জন্য এই লিঙ্কে পড়ুন দয়া করে .. stackoverflow.com/a/25692052/3921740[1] : [1] stackoverflow.com/a/25692052/3921740
user3921740

উত্তর:


112

এই প্রকল্পে এর একটি কার্যকারী উদাহরণ রয়েছে । এটি ফুটে যায়:

  1. আপনার assets/fontsফোল্ডারে, পছন্দসই ওটিএফ বা টিটিএফ ফন্টটি রাখুন (এখানে MyFont.otf)
  2. এইচটিএমএল ফাইল তৈরি করুন যা আপনি assetsফোল্ডারের ভিতরে (এখানে ভিতরে assets/demo/my_page.html) ওয়েবভিউর সামগ্রীর জন্য ব্যবহার করবেন :

    <html>
    <head>
    <style type="text/css">
    @font-face {
        font-family: MyFont;
        src: url("file:///android_asset/fonts/MyFont.otf")
    }
    body {
        font-family: MyFont;
        font-size: medium;
        text-align: justify;
    }
    </style>
    </head>
    <body>
    Your text can go here! Your text can go here! Your text can go here!
    </body>
    </html>
    
  3. কোড থেকে ওয়েবভিউতে এইচটিএমএল লোড করুন:

    webview.loadUrl("file:///android_asset/demo/my_page.html");
    

লক্ষ করুন যে এইচটিএমএল মাধ্যমে ইনজেকশন loadData()অনুমতি দেওয়া হয় না। ডকুমেন্টেশন অনুযায়ী :

নোট করুন যে জাভাস্ক্রিপ্টের একই উত্স নীতিটির অর্থ এই পদ্ধতিটি ব্যবহার করে লোড হওয়া পৃষ্ঠায় চলমান স্ক্রিপ্টটি 'এইচপি (গুলি)' সহ 'ডেটা' ব্যতীত অন্য কোনও স্কিম ব্যবহার করে লোড হওয়া সামগ্রীতে অ্যাক্সেস করতে সক্ষম হবে। এই সীমাবদ্ধতা এড়াতে, একটি উপযুক্ত বেস URL সহ লোডডাটা উইথব্যাস URL () ব্যবহার করুন।

@ যাকএল নীচের মন্তব্যে যেমন পরামর্শ দিয়েছেন, স্ট্রিং থেকে এইচটিএমএল লোড করার জন্য আপনার পরিবর্তে আপনার সম্পদের দিকে নির্দেশ করে বেস ইউআরএল সরবরাহ করা উচিত:

webView.loadDataWithBaseURL("file:///android_asset/", htmlData);

ফন্টটি রেফারেন্স করার সময় htmlDataআপনি কেবলমাত্র ব্যবহার করতে পারেন /fonts/MyFont.otf(বেস ইউআরএল বাদ দেওয়া)।


10
লোডডেটা () কাজ করে না, তবে ওয়েবউইভ.ওলডেটা ডেটাওয়াইথবেসার URL ("ফাইল: /// অ্যান্ড্রয়েড_সেট /", ... ভাল কাজ করে Then তারপরে "/fouts/MyFont.otf" হিসাবে ফন্ট ফাইলের রেফারেন্সও কাজ করা উচিত
জ্যাকএল

আমার ক্ষেত্রে, ডেটা সি কে সম্পাদক (ব্যাকএন্ড এপি) <ডি স্টাইল = \ "পাঠ্য-প্রান্তিককরণ: কেন্দ্র;;"> <স্প্যান শৈলী = \ "ব্যাকগ্রাউন্ড-রঙ: স্বচ্ছ; \"> < ফন্টের রঙ = \ "# f20505 size" আকার = \ "5 \" মুখ = \ "কমিক সান এমএস \"> আপনার প্রতিক্রিয়াটি আমাদের সাথে শেয়ার করুন </ font / ফন্ট> </ span> আমি এটিকে ওয়েবভিউ হিসাবে সেট করছি load লোড ডেটা () তবে এটি ফন্ট গ্রহণ করছে না, কোনও সমাধান ??
বিश्रুতি

কমিক সানস এমএস অ্যান্ড্রয়েড সরবরাহ করা কোনও ফন্ট নয়। এটি কেবলমাত্র তখনই কাজ করবে যদি আপনি সিএসএসে হরফ মুখটি সংজ্ঞায়িত করেছেন এবং আপনার অ্যাপ্লিকেশনটির সম্পদে ফন্ট ফাইল সরবরাহ করেছেন।
পল ল্যামার্টসমা

4
আমার ফন্টটি res/fontফোল্ডারে অবস্থিত । পথ তখন কী হত? আমি চেষ্টা করেছি file:///android_res/font/কিন্তু মনে হচ্ছে এটি কাজ করে না।
25:38

106

আমি এই কোডটি ব্যবহার করছি :

wv = (WebView) findViewById(R.id.webView1);
String pish = "<html><head><style type=\"text/css\">@font-face {font-family: MyFont;src: url(\"file:///android_asset/font/BMitra.ttf\")}body {font-family: MyFont;font-size: medium;text-align: justify;}</style></head><body>";
String pas = "</body></html>";
String myHtmlString = pish + YourTxext + pas;
wv.loadDataWithBaseURL(null,myHtmlString, "text/html", "UTF-8", null);

4
ঈশ্বর! এটি ঠিক যা আমাদের ভুল পথে যাচ্ছিল তার ট্রেইলে ফেলেছিল: যেমন দেখা যাচ্ছে যে অ্যান্ড্রয়েড ৪.২ যদি "এসসিআর: ইউআরএল ('... ...) এর পিছনে" ফর্ম্যাট (' টিটিএফ ') "যোগ করেন তবে ফন্টটি রেন্ডার করে না ... ') "ধারা। এটি ছেড়ে দিন এবং ফন্টগুলি সুন্দরভাবে রেন্ডার করা হয়। গুগলের নিজস্ব ওয়েব ফন্টের মাধ্যমে পরীক্ষিত।
পাস্কাল লিন্ডেলাফ

4
এটি দোলনা সমাধান, থাম্বস আপ
সাদ বিলাল

loadDataWithBaseURL অ্যান্ড্রয়েড 4.1 এবং 4.2 সংস্করণে কাজ করছে না :(
মিশা আকোপভ

অ্যান্ড্রয়েড 5.1 এ আমার জন্য কাজ করেনি। আমি (ড্যান সিরিস্টাদ) এর উত্তর ব্যবহার করেছি। পার্থক্যটি হ'ল উদ্ধৃতিfont-family: 'myface';
Mneckoee

52

এমনকি সহজ, আপনি ফন্ট উল্লেখ করতে সম্পদ URL ফর্ম্যাট ব্যবহার করতে পারেন। কোন প্রোগ্রামিং প্রয়োজন!

@font-face {
   font-family: 'myface';
   src: url('file:///android_asset/fonts/myfont.ttf'); 
} 

body { 
   font-family: 'myface', serif;

...


4
যদি আমি একই ডিরেক্টরিতে ফাইলটি রাখি .ttfএবং .htmlএন্ড্রয়েড ব্রাউজারে এটি লোড করি তবে এটি কাজ করে। তবে আমার অ্যাপ্লিকেশনটির ওয়েবভিউতে, সিএসএস দেখানোর সময়, .ttfপ্রজেক্টের assets/fontsফোল্ডারে যোগ করার পরেও পাঠ্যটি Android এর ডিফল্ট ফন্টে উপস্থিত হবে । আমি ২.৩.৫-এ পরীক্ষা করছি, তবে ২.১-এর বিপরীতে নির্মাণ করছি। সমস্যাটি কি হতে পারে, বা আমি এখানে কিছু মিস করছি?
পল ল্যামার্টসমা

4
আমি একটি রেজোলিউশন পেয়েছি: আপনি যদি কোনও এইচটিএমএল ফাইল তৈরি করেন এবং সম্পদের মধ্যে রাখেন তবে view.loadUrl()কাজের মাধ্যমে এটিকে লোড করুন , যেখানে view.loadData()না। পরেরটা কেন করায় আমার কোনও ধারণা নেই।
পল ল্যামার্টসমা

4
একটি লিল 'দেরী, তবে এটি ভিউএলডাটা ডেথ উইথব্যাস ইউআরএল (নাল, সামগ্রী, মাইম, এনকন্ডিং, নাল)
আমাদের

29

এটি অ্যান্ড্রয়েডে করা যেতে পারে। এই সমস্যাটি সমাধান করতে আমি তিন দিন সময় নিয়েছি। তবে এখন এটি খুব সহজ বলে মনে হচ্ছে। ওয়েবভিউয়ের জন্য কাস্টম ফন্ট সেট করতে এই পদক্ষেপগুলি অনুসরণ করুন

1. আপনার ফন্টটি সম্পদ ফোল্ডারে যুক্ত করুন 2.
অ্যাপ্লিকেশনটির ফাইল ডিরেক্টরিতে ফন্টটি অনুলিপি করুন

private boolean copyFile(Context context,String fileName) {
        boolean status = false;
        try { 
            FileOutputStream out = context.openFileOutput(fileName, Context.MODE_PRIVATE);
            InputStream in = context.getAssets().open(fileName);
            // Transfer bytes from the input file to the output file
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            // Close the streams
            out.close();
            in.close();
            status = true;
        } catch (Exception e) {
            System.out.println("Exception in copyFile:: "+e.getMessage());
            status = false;
        }
        System.out.println("copyFile Status:: "+status);
        return status;
    }

৩. আপনাকে কেবল একবার উপরের ফাংশনটি কল করতে হবে (এর জন্য আপনাকে কিছু যুক্তি খুঁজে পেতে হবে)।

copyFile(getContext(), "myfont.ttf");

আপনার ওয়েবভিউয়ের জন্য মান সেট করতে নীচের কোডটি ব্যবহার করুন। এখানে আমি ফন্ট সেট করতে সিএসএস ব্যবহার করছি।

private String getHtmlData(Context context, String data){
    String head = "<head><style>@font-face {font-family: 'verdana';src: url('file://"+ context.getFilesDir().getAbsolutePath()+ "/verdana.ttf');}body {font-family: 'verdana';}</style></head>";
    String htmlData= "<html>"+head+"<body>"+data+"</body></html>" ;
    return htmlData;
 }

5. আপনি নীচের মত উপরের ফাংশন কল করতে পারেন

webview.loadDataWithBaseURL(null, getHtmlData(activity,htmlData) , "text/html", "utf-8", "about:blank");

ওহে! আমি এই পদ্ধতির চেষ্টা করেছি কিন্তু ওয়েবভিউ এখনও আমার ফন্ট লোড করে না। আপনি কি বিশেষ কিছু আছে? ধন্যবাদ!
জারাহ

এইচটিএমএল স্ট্যাকওভারফ্লো . com/q/5868198/501859 এর জন্য এটি কীভাবে করবেন । আপনি যদি সমাধান পান তবে আমাকে সহায়তা করুন
কিশোর

এটা আমার জন্য কাজ করে। ধন্যবাদ বাইনারি।
রবি শঙ্কর যাদব

আমি সম্পদ ফোল্ডারে ফন্ট রাখছি এবং ফন্টের ফন্ট এবং ফন্টের পরিবারের নামটির পুরো পথটি দিয়ে সিএসএস পরিবর্তন করছি এবং পরিবর্তনের পরে আমি আবার সামগ্রীটি লোড করছি তবে অবিলম্বে ফন্টের পরিবর্তনটি দেখতে পাচ্ছি না
রবি

13

আমি এই সংযোজনগুলির সাথে উপরের জবাব দিয়ে এটি করেছি:

webView.loadDataWithBaseURL("file:///android_asset/",
                            WebClient.getStyledFont(someText),
                            "text/html; charset=UTF-8", null, "about:blank");

এবং তারপরে ব্যবহার করুন src: url("file:///android_asset/fonts/YourFont...

public static String getStyledFont(String html) {
    boolean addBodyStart = !html.toLowerCase().contains("<body>");
    boolean addBodyEnd = !html.toLowerCase().contains("</body");
    return "<style type=\"text/css\">@font-face {font-family: CustomFont;" +
            "src: url(\"file:///android_asset/fonts/Brandon_reg.otf\")}" +
            "body {font-family: CustomFont;font-size: medium;text-align: justify;}</style>" +
            (addBodyStart ? "<body>" : "") + html + (addBodyEnd ? "</body>" : "");
}


সবাইকে ধন্যবাদ :)


নিখুঁত উত্তর!!
সানাত

6

উপরের উত্তরগুলির মধ্যে অনেকগুলি আকর্ষণীয় কাজ করে যদি আপনার সম্পদের ফোল্ডারে আপনার সামগ্রী থাকে।

তবে, আপনি যদি আমার পছন্দ করেন তবে সার্ভার থেকে আপনার সমস্ত সম্পদ আপনার অভ্যন্তরীণ স্টোরেজে ডাউনলোড করতে এবং সংরক্ষণ করতে চান আপনি তার পরিবর্তে loadDataWithBaseURLবেসউআরএল হিসাবে আপনার অভ্যন্তরীণ স্টোরেজটির একটি রেফারেন্স ব্যবহার করতে পারেন । তারপরে সেখানে সমস্ত ফাইল লোড হওয়া এইচটিএমএল সম্পর্কিত হবে এবং খুঁজে পাওয়া যাবে এবং সঠিকভাবে ব্যবহৃত হবে।

আমার অভ্যন্তরীণ সঞ্চয়স্থানে আমি নিম্নলিখিত ফাইলগুলি সংরক্ষণ করেছি:

  • ইন্ডিগো অ্যান্টিকোয়া 2 পাঠ্য-নিয়মিত.টিটিএফ
  • স্টাইল। CSS
  • image.png

তারপরে আমি নিম্নলিখিত কোডটি ব্যবহার করব:

WebView web = (WebView)findViewById(R.id.webby);
//For avoiding a weird error message
web.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

String webContent = "<!DOCTYPE html><html><head><meta charset=\"UTF-8\"><link rel=\"stylesheet\" href=\"style.css\"></head>"
                            + "<body><img src='image.png' width=\"100px\"><div class=\"running\">I am a text rendered with INDIGO</div></body></html>";

String internalFilePath = "file://" + getFilesDir().getAbsolutePath() + "/";
web.loadDataWithBaseURL(internalFilePath, webContent, "text/html", "UTF-8", "");

উপরের এইচটিএমএল (স্টাইল। CSS) এ ব্যবহৃত সিএসএস ফাইল:

@font-face {
  font-family: 'MyCustomRunning';
  src: url('IndigoAntiqua2Text-Regular.ttf')  format('truetype');
}

.running{
    color: #565656;
     font-family: "MyCustomRunning";
     font-size: 48px;
}

আমি minSdkVersion 19 (4.4) টার্গেট করার সময় কেবল এটি চেষ্টা করেছি তাই এটি অন্যান্য সংস্করণে কাজ করে কিনা আমার কোনও ধারণা নেই


6
 webview= (WebView) findViewById(R.id.webview);
 String myCustomStyleString="<style type=\"text/css\">@font-face {font-family: MyFont;src: url(\"file:///android_asset/fonts/iranian_sans.ttf\")}body,* {font-family: MyFont; font-size: 13px;text-align: justify;}img{max-width:100%;height:auto; border-radius: 8px;}</style>";
 webview.loadDataWithBaseURL("", myCustomStyleString+"<div style=\"direction:rtl\">"+intentpost.getStringExtra("content")+"</div>", "text/html", "utf-8", null);

4
আপনি কী করছেন তার ব্যাখ্যা যুক্ত করে আপনার প্রশ্নের উন্নতি করুন।
Lifeisfoo

2

অ্যান্ড্রয়েডের জন্য ওয়েবভিউ ফন্ট সেট করতে আপনার স্থানীয় টিটিএফ ফাইল ব্যবহার করার দরকার নেই, এটি পুরো অ্যাপের আকার বাড়িয়ে তুলবে।

আপনি গুগলের ফন্টের মতো অনলাইন ফন্টও ব্যবহার করতে পারেন ... এটি আপনার এপিকে আকার কমাতে সহায়তা করবে।

উদাহরণস্বরূপ: নীচের URL টি দেখুন https://gist.github.com/karimnaaji/b6c9c9e819204113e9cabf290d580551#file-googlefouts-txt

আপনি এই ফন্টটি ব্যবহার করার জন্য প্রয়োজনীয় তথ্য পাবেন। তারপরে নীচের মতো একটি স্ট্রিং তৈরি করুন

String font = "@font-face {font-family: MyFont;src: url(\"here you will put the url of the font which you get previously\")}body {font-family: MyFont;font-size: medium;text-align: justify;}";

তারপরে ওয়েব ভিউটি লোড করুন

webview.loadDataWithBaseURL("about:blank", "<style>" +font+</style>" + "your html contnet here", "text/html", null, null);

সম্পন্ন. আপনি এইভাবে বাহ্যিক উত্স থেকে ফন্টটি লোড করতে সক্ষম হবেন।

এখন অ্যাপ্লিকেশন ফন্টটি কী, ওয়েবভিউয়ের জন্য 1 ফন্ট এবং পুরো অ্যাপ্লিকেশনের জন্য আলাদা ফন্ট ব্যবহার করার কোনও মানে নেই। সুতরাং আপনি আপনার অ্যাপ্লিকেশনটিতে ডাউনলোডযোগ্য ফন্টগুলি ব্যবহার করতে পারেন যা অ্যাপ্লিকেশনটিতে ফন্টগুলি লোড করার জন্য বাহ্যিক উত্সও ব্যবহার করে।


1

আপনি সিএসএস ব্যবহার করে এটি করতে পারেন। আমি এটি একটি অ্যাপ্লিকেশন দিয়ে করেছি তবে এটি অ্যান্ড্রয়েড ২.১ এ কাজ করবে না কারণ অ্যান্ড্রয়েড ব্রাউজার ২.১ এর সাথে জানা বাগ রয়েছে।


1

সমস্যাটি হ'ল এটি কোনও ফোল্ডারে থাকা দরকার, পরিবর্তে "./myfont.ttf" রাখার চেষ্টা করুন, যদি "ফন্ট / মাইফন্ট.টিএফ" এর মতো সম্পত্তিতে কোনও ফোল্ডারের ভিতরে ফন্ট না রাখে যা নিশ্চিতভাবে কাজ করবে।


0

এটি পরীক্ষা করে দেখুন, আমার জন্য কবজির মতো কাজ করুন:

   private void setResult() {

        String mimeType = "text/html;charset=UTF-8";
        String encoding = "utf-8";
        String htmlText = htmlPrivacy;

        String text = "<html><head>"
                + "<style type=\"text/css\">@font-face {font-family: MyFont;src: url(\"file:///android_asset/fonts/iy_reg.ttf\")}body{font-family: MyFont;color: #666666}"
                + "</style></head>"
                + "<body>"
                + htmlText
                + "</body></html>";

        webView.loadDataWithBaseURL(null, text, mimeType, encoding, null);
    }

0

আপনি যদি res/fontআমার মতো ফন্টগুলি রাখছেন তবে আপনি নীচে নিম্নলিখিতটি পরিবর্তন করতে পারেন: -

@font-face {
     font-family: yourfont;
     src: url("file:///android_res/font/yourfont.ttf")
}
        
body {
     font-family: yourfont;
}

0

Https://github.com/delight-im/Android-AdvancedWebView লাইব্রেরি ব্যবহার করুন ।

এইচটিএমএল ডেটাতে:

<!doctype html>
<html>

<head>
<style type="text/css">
@font-face {
    font-family: MyFont;
    src: url("file:///android_asset/fonts/font1.ttf")
}
body {
    font-family: MyFont;
    font-size: medium;
    text-align: justify;
}
</style>
<meta http-equiv="Content-Type" content="text/html;  charset=utf-8">
<title>Title</title>
</head>

<body>

    ------ YOUR_CONTENT ------

</body>

</html>

এক্সএমএলে:

<im.delight.android.webview.AdvancedWebView
    android:id="@+id/advanced_web_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

জাভাতে:

advancedWebView = findViewById(R.id.advanced_web_view);
advancedWebView.loadHtml(htmlData, "text/html; charset=utf-8", "utf-8");

-3

ওয়েবভিউতে আপনি কীভাবে এইচটিএমএল ডেটা লোড করবেন:

webview.loadDataWithBaseURL(null, getHtmlData(activity,**htmlData**) , "text/html", "utf-8", "about:blank");

যেখানে getHtmlData(activity,**htmlData**)এইচটিএমএল কোডের একটি স্ট্রিং প্রদান করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.