Question

I want to change a TextView font in a Fragment with these code:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle     savedInstanceState) {
   View v = inflater.inflate(R.layout.fragment_layout, container, false);
   TextView txt = (TextView) v.findViewById(R.id.Zipcode);
   Typeface font = Typeface.createFromAsset(getActivity().getAssets(), "fonts/customfont.ttf");
   txt.setTypeface(font); 
   return v;
}

But it force closes at this statement txt.setTypeface(font):

Does anyone know to fix this problem? Below is the logcat:

04-27 13:02:23.825: D/ViewRootImpl(11706): pckname = com.group.factor
04-27 13:02:23.875: D/dalvikvm(11706): GC_FOR_ALLOC freed 92K, 4% free 6645K/6851K, paused 24ms
04-27 13:02:23.885: I/dalvikvm-heap(11706): Grow heap (frag case) to 7.985MB for 1495024-byte allocation
04-27 13:02:23.935: D/dalvikvm(11706): GC_CONCURRENT freed 2K, 3% free 8103K/8327K, paused 2ms+18ms
04-27 13:02:23.985: D/AndroidRuntime(11706): Shutting down VM
04-27 13:02:23.985: W/dalvikvm(11706): threadid=1: thread exiting with uncaught exception (group=0x40a4f1f8)
04-27 13:02:23.985: E/AndroidRuntime(11706): FATAL EXCEPTION: main
04-27 13:02:23.985: E/AndroidRuntime(11706): java.lang.RuntimeException: native typeface cannot be made
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.graphics.Typeface.<init>(Typeface.java:147)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.graphics.Typeface.createFromAsset(Typeface.java:121)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at com.group.factor.MainActivity$DummySectionFragment.onCreateView(MainActivity.java:179)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.support.v4.view.ViewPager.populate(ViewPager.java:1064)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.support.v4.view.ViewPager.populate(ViewPager.java:911)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1432)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.view.View.measure(View.java:12727)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.view.View.measure(View.java:12727)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:812)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.view.View.measure(View.java:12727)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2092)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.view.View.measure(View.java:12727)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1089)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2467)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.os.Handler.dispatchMessage(Handler.java:99)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.os.Looper.loop(Looper.java:137)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at android.app.ActivityThread.main(ActivityThread.java:4424)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at java.lang.reflect.Method.invokeNative(Native Method)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at java.lang.reflect.Method.invoke(Method.java:511)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-27 13:02:23.985: E/AndroidRuntime(11706):    at dalvik.system.NativeStart.main(Native Method)
04-27 13:02:24.065: I/dalvikvm(11706): threadid=3: reacting to signal 3
04-27 13:02:24.065: I/dalvikvm(11706): Wrote stack traces to '/data/anr/traces.txt'
04-27 13:02:24.565: I/dalvikvm(11706): threadid=3: reacting to signal 3
04-27 13:02:24.565: I/dalvikvm(11706): Wrote stack traces to '/data/anr/traces.txt'
Was it helpful?

Solution

Taken from here: source

This bug of Android OS could be the reason of your issue:

Typeface.createFromAsset leaks asset stream

Where are also a workaround in this bugreport:

here a workaround so that the method does not assume the font path or format. The full path of the font asset must be submitted as a parameter. I also wrapped the call to createFromAsset() in a try-catch block so that the get() method will return null if the asset is not found.

public class Typefaces {
private static final String TAG = "Typefaces";

 private static final Hashtable<String, Typeface> cache = new Hashtable<String, Typeface>();

 public static Typeface get(Context c, String assetPath) {
    synchronized (cache) {
        if (!cache.containsKey(assetPath)) {
            try {
                Typeface t = Typeface.createFromAsset(c.getAssets(),
                        assetPath);
                cache.put(assetPath, t);
            } catch (Exception e) {
                Log.e(TAG, "Could not get typeface '" + assetPath
                        + "' because " + e.getMessage());
                return null;
            }
        }
        return cache.get(assetPath);
    }
}
}

Also, try this:

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                         "blanch_caps.ttf");   
I changed to:

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                         "fonts/blanch_caps.ttf");  

And my file is in assets/fonts/blanch_caps.ttf.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top