2012-06-26 3 views
0

Я работаю над проектом Android, приложение уже построено, но только для того, чтобы улучшить пользовательский интерфейс. Я работаю над рестайлингом приложения. Для этого я также пытаюсь использовать пользовательский шрифт, но это не работает. Я просмотрел примеры кода, доступные в Интернете, но никто не решает мою проблему. Вот как я это делаю.Пользовательский шрифт в Android-приложении

package com.crittermap.backcountrynavigator.dialog; 

import android.content.Context; 
import android.graphics.Typeface; 
import android.util.AttributeSet; 
import android.widget.TextView; 

public class MyTextView extends TextView { 

    public MyTextView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(); 
    } 

    public MyTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public MyTextView(Context context) { 
     super(context); 
     init(); 
    } 

    private void init() { 
     if (!isInEditMode()) { 
      Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/handsean.ttf"); 
      setTypeface(tf); 
     } 
    } 

} 

Вот XML часть

<com.crittermap.backcountrynavigator.dialog.MyTextView 
      android:id="@+id/offlinesummary" 
      android:layout_marginLeft="5dip"   
      android:layout_alignParentBottom="true" 
      android:layout_alignParentLeft="true" 
      android:layout_toLeftOf="@id/offlinecheckbox" 
      android:text="@string/cp_preview_off_desc" 
      style="@style/textN_l"> 
      </com.crittermap.backcountrynavigator.dialog.MyTextView> 

Стиль:

<style name="textN_l" parent="w_h"> 
    <item name="android:textColor">@android:color/black</item> 
    <item name="android:textSize">12sp</item> 
</style> 
<style name="w_h"> <!-- Width and Height --> 
    <item name="android:layout_width">wrap_content</item> 
    <item name="android:layout_height">wrap_content</item>   
</style> 

И ошибки я получаю являются

06-15 08:35:24.778: E/AndroidRuntime(2304): FATAL EXCEPTION: main 
06-15 08:35:24.778: E/AndroidRuntime(2304): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.crittermap.backcountrynavigator.license/com.crittermap.backcountrynavigator.dialog.MapControlPanelDialog}: android.view.InflateException: Binary XML file line #24: Error inflating class com.crittermap.backcountrynavigator.dialog.MyTextView 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at android.os.Handler.dispatchMessage(Handler.java:99) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at android.os.Looper.loop(Looper.java:123) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at java.lang.reflect.Method.invoke(Method.java:507) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at dalvik.system.NativeStart.main(Native Method) 
06-15 08:35:24.778: E/AndroidRuntime(2304): Caused by: android.view.InflateException: Binary XML file line #24: Error inflating class com.crittermap.backcountrynavigator.dialog.MyTextView 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at android.view.LayoutInflater.createView(LayoutInflater.java:518) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:570) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:623) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:626) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at android.view.LayoutInflater.inflate(LayoutInflater.java:408) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at android.view.LayoutInflater.inflate(LayoutInflater.java:320) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at android.view.LayoutInflater.inflate(LayoutInflater.java:276) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:207) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at android.app.Activity.setContentView(Activity.java:1657) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at com.crittermap.backcountrynavigator.dialog.MapControlPanelDialog.onCreate(MapControlPanelDialog.java:72) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  ... 11 more 
06-15 08:35:24.778: E/AndroidRuntime(2304): Caused by: java.lang.reflect.InvocationTargetException 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at java.lang.reflect.Constructor.constructNative(Native Method) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at java.lang.reflect.Constructor.newInstance(Constructor.java:415) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at android.view.LayoutInflater.createView(LayoutInflater.java:505) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  ... 22 more 
06-15 08:35:24.778: E/AndroidRuntime(2304): Caused by: java.lang.RuntimeException: native typeface cannot be made 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at android.graphics.Typeface.<init>(Typeface.java:147) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at android.graphics.Typeface.createFromAsset(Typeface.java:121) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at com.crittermap.backcountrynavigator.dialog.MyTextView.init(MyTextView.java:27) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  at com.crittermap.backcountrynavigator.dialog.MyTextView.<init>(MyTextView.java:17) 
06-15 08:35:24.778: E/AndroidRuntime(2304):  ... 25 more 

Спасибо вам

+0

пожалуйста, напишите полный LogCat, ошибка вы вывесили не имеет никакой информации – thepoosh

+0

Прошу прощения, теперь я добавил полный логарифм. – Rookie

+0

@FatimaRizwan: если вы прокомментируете setTypeface (tf); то работаете или нет? –

ответ

2

Вы забыли пространство имен?

<com.crittermap.backcountrynavigator.dialog.MyTextView 
     android:id="@+id/offlinesummary" 
     android:layout_marginLeft="5dip"   
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:layout_toLeftOf="@id/offlinecheckbox" 
     android:text="@string/cp_preview_off_desc" 
     android:style="@style/textN_l"> 
</com.crittermap.backcountrynavigator.dialog.MyTextView> 
+1

Жаль, что я тебя не достал. – Rookie

+0

Я имел в виду пространство имен android: ', но, глядя на ваш стек, проблема, похоже, в самом пользовательском шрифте. Вы уверены, что у вас есть «handsean.ttf» в папке «fonts» в «assets»? – user1417430

+0

Вы не можете добавить стиль к «андроид: стиль». Его стиль. Да, шрифт есть в папке с ресурсами, а затем в папке шрифтов. – Rookie

0

Попробуйте добавить ширину и высоту макета. Затем запустите программу.

+0

Я уже добавил его в стиле. – Rookie

0

изменить код, как

public class MyTextView extends TextView { 
private Paint mPaint; 
float middleY=1; 
float mX=30; 
float DY=30; 
    public MyTextView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(); 
    } 

    public MyTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public MyTextView(Context context) { 
     super(context); 
     init(); 
    } 

    private void init() { 
     if (!isInEditMode()) { 
      Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/handsean.ttf"); 
     mPaint = new Paint(); 
     mPaint.setAntiAlias(true); 
     mPaint.setTextSize(16); 
     mPaint.setColor(Color.BLACK); 
     mPaint.setTypeface(tf); 
      // setTypeface(tf); 
     } 
    } 
    @Override 
    protected void onDraw(Canvas canvas) { 
     // TODO Auto-generated method stub 
     super.onDraw(canvas); 
     canvas.drawColor(0xEFeffff); 
     Paint p = mPaint; 
     p.setTextAlign(Paint.Align.CENTER);   
     canvas.drawText("TESTEST", mX, middleY, p);  

    } 
+0

для получения дополнительной помощи, вы можете просмотреть следующий код для настройки пользовательских шрифтов в TextView https://sites.google.com/site/imrankhanandroid/customtextview.txt?attredirects=0&d=1 –

+0

Я пробовал. Такая же ошибка :( – Rookie

+0

@FatimaRizwan: вы пытаетесь https://sites.google.com/site/imrankhanandroid/customtextview.txt?attredirects=0&d=1 пример –

0

попробовать этот

<com.crittermap.backcountrynavigator.dialog.MyTextView 
    android:id="@+id/offlinesummary" 
    android:layout_marginLeft="5dip" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"   
    android:layout_alignParentBottom="true" 
    android:layout_alignParentLeft="true" 
    android:layout_toLeftOf="@id/offlinecheckbox" 
    android:text="@string/cp_preview_off_desc" 
    android:style="@style/textN_l"> 

UPDATE

Так другой код является выглядит идеально. Остается только проблема в вашем файле «.ttf», возможно, этот файл поврежден. Загрузите шрифты отсюда developer.android.com/design/downloads/index.html и используйте их. надеюсь, что это сработает.

+0

Это не сработает. Это неправильно. – Rookie

+0

Вы пытаетесь это сделать? ?. Я тестировал Она работает абсолютно совершенным вы должны дать андроида:. layout_width = «fill_parent» андроид: layout_height = «wrap_content» вы не давая эти параметры в вашем XML. –

+0

Поскольку эти параметры уже заданы с помощью стиля. – Rookie

0

и есть использовать в XML, как указано ниже

<com.crittermap.backcountrynavigator.dialog.MyTextView 
     android:id="@+id/offlinesummary" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="5dip"   
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:layout_toLeftOf="@id/offlinecheckbox" 
     android:text="@string/cp_preview_off_desc" 
     > 
    </com.crittermap.backcountrynavigator.dialog.MyTextView> 

и в вашей любой деятельности, и есть использовать этот способ

MyTextView textview=(MyTextView)findViewById(R.id.offlinesummary); 
+0

Да Вот как я это делаю. – Rookie

+0

@FatimaRizwan Я думаю, что проблема в стиле bcz сначала удаляет это и проверяет и также также показывает код стиля.xml или styles.xml – Khan

+0

Я добавил в код стиля вопросов также. Пожалуйста, смотрите. – Rookie

Смежные вопросы