Memuat jenis huruf secara dinamis dari url atau secara statis dari lib

Saya menjalankan aplikasi Android dan saya ingin memuat font secara dinamis dan menggunakannya saat runtime. Bagaimana saya bisa melakukan ini?

Dan juga bagaimana saya bisa memasukkan font ke dalam SDK yang saya tulis, mereferensikan SDK di aplikasi yang saya tulis, dan menggunakan font yang disertakan dalam SDK?

Sunting: Terima kasih telah memberikan -1 Suara untuk ini, siapa pun yang melakukan ini, saya akan berhenti berbagi pengetahuan, itu cara yang baik untuk mematikan saya.


person Whitebear    schedule 03.07.2016    source sumber
comment
Teruslah berbagi ilmu :) +1   -  person Zeeshan Shabbir    schedule 01.08.2017
comment
Terima kasih! Saya akan :)   -  person Whitebear    schedule 02.08.2017


Jawaban (1)


Begini cara saya melakukannya: (Menggunakan AsyncTask, yang tidak sempurna) Jika Anda menginginkan sesuatu yang lebih stabil daripada AsyncTask, RxAndroid menawarkan varian bagus lainnya, jauh lebih stabil. Dalam contoh ini saya melakukan semuanya di bagian "doInBackground", tetapi Anda dapat menggunakannya dengan cara yang sama, di mana saja setelah tugas selesai. Contoh ini juga mengasumsikan kita memiliki izin untuk menulis dan membaca dari penyimpanan eksternal.

    private class DownloadTask extends AsyncTask<String, Integer, String> {

    private Context context;

    public DownloadTask(Context context) {
        this.context = context;
    }

    @Override
    protected String doInBackground(String... sUrl) {
        InputStream input = null;
        OutputStream output = null;
        HttpURLConnection connection = null;
        try {
            URL url = new URL(sUrl[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();

            // expect HTTP 200 OK, so we don't mistakenly save error report
            // instead of the file
            if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
                return "Server returned HTTP " + connection.getResponseCode()
                        + " " + connection.getResponseMessage();
            }

            // download the file
            input = connection.getInputStream();
            File sdCard = Environment.getExternalStorageDirectory();
            File dir = new File (sdCard.getAbsolutePath() + "/fonts");
            dir.mkdirs();
            File file = new File(dir, "font.ttf");
            try {
                OutputStream out = new FileOutputStream(file);
                byte[] buf = new byte[1024];
                int len;
                while((len=input.read(buf))>0){
                    out.write(buf,0,len);
                }
                out.close();
                input.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            File sdcard = Environment.getExternalStorageDirectory();
            File dirs = new File(sdcard.getAbsolutePath()+"/fonts");

            if(dirs.exists()) {
                File[] files = dirs.listFiles();
                Log.d("s","files");
            }
            final Typeface typeface = Typeface.createFromFile(
                    new File(Environment.getExternalStorageDirectory()+"/fonts", "font.ttf"));
            Log.d("a","created");
            // Now I'm starting with an example that shows how to use 
            // this font on a textview of my choice.
            // Assumptions: font has characters uF102 and uF104
            final TextView tv = (TextView) findViewById(R.id.myTextView);
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if (tv != null && typeface != null) {
                        tv.setTypeface(typeface);
                        tv.setText("\uF102");
                        tv.setOnClickListener(new View.OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                if (tv.getText().equals("\uF102")){
                                    tv.setText("\uF104");
                                } else {
                                    tv.setText("\uF102");
                                }
                            }
                        });
                    }
                }
            });

        } catch (Exception e) {
            return e.toString();
        } finally {
            try {
                if (output != null)
                    output.close();
                if (input != null)
                    input.close();
            } catch (IOException ignored) {
            }

            if (connection != null)
                connection.disconnect();
        }
        return null;
    }
}

Jika kita ingin memuat font dari SDK yang kita gunakan, dari perpustakaan yang telah kita tulis, kita dapat menyertakan font tersebut di bagian mentah yang dapat digambar, dan dari aplikasi yang menggunakan SDK/lib ini kita dapat mereferensikan font tersebut seperti ini: (Saya menggunakan font amaticobold dalam kasus ini hanya sebagai contoh)

        File sdCard = Environment.getExternalStorageDirectory();
    File dir = new File (sdCard.getAbsolutePath() + "/fonts");
    dir.mkdirs();
    File file = new File(dir, "font.ttf");
    InputStream is = getResources().openRawResource(getResources().getIdentifier("amaticbold","raw", getPackageName()));
    try {
        OutputStream out = new FileOutputStream(file);
        byte[] buf = new byte[1024];
        int len;
        while((len=is.read(buf))>0){
            out.write(buf,0,len);
        }
        out.close();
        is.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    File sdcard = Environment.getExternalStorageDirectory();
    File dirs = new File(sdcard.getAbsolutePath()+"/fonts");

    if(dirs.exists()) {
        File[] files = dirs.listFiles();
        Log.d("s","files");
    }
    final Typeface typeface = Typeface.createFromFile(
            new File(Environment.getExternalStorageDirectory()+"/fonts", "font.ttf"));
    editText.setTypeface(typeface);
person Whitebear    schedule 03.07.2016
comment
tapi ini disimpan di kartu SD? - person saiRam89; 01.08.2017
comment
SDK membiarkannya di sana, ya - person Whitebear; 02.08.2017
comment
tetapi saya ingin disimpan di sistem lokal dari sana saya ingin mengakses di proyek saya - person saiRam89; 02.08.2017
comment
Jawaban yang saya berikan merujuk pada opsi di mana Anda ingin memuat font dari SDK yang Anda tulis sendiri dan gunakan di dalam aplikasi. - person Whitebear; 02.08.2017