2015-12-17 2 views
3

Привет, ребята, я пытаюсь реализовать пользовательский TextView с шрифтом. Я решил использовать RobotoTextView. У меня есть также папка шрифтов в активах. У меня ошибка на линии, где у меня есть **custom:typeface="robotoLight"**.Пользовательский атрибут enum дает ошибку Типы строк не разрешены

Ошибка:

AGPBI: {"kind":"error","text":"String types not allowed (at \u0027typeface\u0027 with value \u0027robotoLight\u0027).","sources":[{"file":"path/to/file/thisxml.xml","position":{"startLine":32,"startColumn":33,"startOffset":1357,"endColumn":44,"endOffset":1368}}],"original":""}

Любая помощь будет оценена.

Моя раскладка с пользовательским TextView

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:custom="http://schemas.android.com/apk/res/my.package.name" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="#99f9fafa" 
     android:padding="0dp" > 
     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="#99f9fafa" 
      android:orientation="vertical" 
      android:padding="0dp" > 
      <ImageView 
       android:id="@+id/bigImage" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:src="@drawable/noproperty"/> 

      <utils.RobotoTextView 
       android:id="@+id/propertyPrice" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:maxLines="1" 
       android:text="Product Name" 
       android:textColor="@color/main_color_grey_800" 
       android:textSize="14sp" 
       custom:typeface="robotoLight"/> 
     </LinearLayout> 
    </LinearLayout> 

    <View 
     android:layout_marginLeft="10dp" 
     android:layout_marginRight="10dp" 
     android:layout_width="match_parent" 
     android:layout_height="1dp" 
     android:background="@color/main_purple"/> 
     <!--android:background="@color/main_color_500" />--> 
</LinearLayout> 

Вот файл атрибут с styleable:

<declare-styleable name="RobotoTextView"> 
    <attr name="typeface" format="enum"> 
     <enum name="robotoBlack" value="0" /> 
     <enum name="robotoBlackItalic" value="1" /> 
     <enum name="robotoBold" value="2" /> 
     <enum name="robotoBoldItalic" value="3" /> 
     <enum name="robotoBoldCondensed" value="4" /> 
     <enum name="robotoBoldCondensedItalic" value="5" /> 
     <enum name="robotoCondensed" value="6" /> 
     <enum name="robotoCondensedItalic" value="7" /> 
     <enum name="robotoItalic" value="8" /> 
     <enum name="robotoLight" value="9" /> 
     <enum name="robotoLightItalic" value="10" /> 
     <enum name="robotoMedium" value="11" /> 
     <enum name="robotoMediumItalic" value="12" /> 
     <enum name="robotoRegular" value="13" /> 
     <enum name="robotoThin" value="14" /> 
     <enum name="robotoThinItalic" value="15" /> 
    </attr> 
</declare-styleable> 

Моим класс с пользовательским Text View общественного класс RobotoTextView простирается TextView {

public RobotoTextView(Context context) { 
     super(context); 
     if (isInEditMode()) return; 
     parseAttributes(null); 
    } 

    public RobotoTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     if (isInEditMode()) return; 
     parseAttributes(attrs); 
    } 

    public RobotoTextView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     if (isInEditMode()) return; 
     parseAttributes(attrs); 
    } 

    private void parseAttributes(AttributeSet attrs) { 
     int typeface; 
     if (attrs == null) { //Not created from xml 
      typeface = Roboto.ROBOTO_REGULAR; 
     } else { 
      TypedArray values = getContext().obtainStyledAttributes(attrs, R.styleable.RobotoTextView); 
      typeface = values.getInt(R.styleable.RobotoTextView_typeface, Roboto.ROBOTO_REGULAR); 
      values.recycle(); 
     } 
     setTypeface(getRoboto(typeface)); 
    } 

    public void setRobotoTypeface(int typeface) { 
     setTypeface(getRoboto(typeface)); 
    } 

    private Typeface getRoboto(int typeface) { 
     return getRoboto(getContext(), typeface); 
    } 

    public static Typeface getRoboto(Context context, int typeface) { 
     switch (typeface) { 
      case Roboto.ROBOTO_BLACK: 
       if (Roboto.sRobotoBlack == null) { 
        Roboto.sRobotoBlack = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Black.ttf"); 
       } 
       return Roboto.sRobotoBlack; 
      case Roboto.ROBOTO_BLACK_ITALIC: 
       if (Roboto.sRobotoBlackItalic == null) { 
        Roboto.sRobotoBlackItalic = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-BlackItalic.ttf"); 
       } 
       return Roboto.sRobotoBlackItalic; 
      case Roboto.ROBOTO_BOLD: 
       if (Roboto.sRobotoBold == null) { 
        Roboto.sRobotoBold = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Bold.ttf"); 
       } 
       return Roboto.sRobotoBold; 
      case Roboto.ROBOTO_BOLD_CONDENSED: 
       if (Roboto.sRobotoBoldCondensed == null) { 
        Roboto.sRobotoBoldCondensed = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-BoldCondensed.ttf"); 
       } 
       return Roboto.sRobotoBoldCondensed; 
      case Roboto.ROBOTO_BOLD_CONDENSED_ITALIC: 
       if (Roboto.sRobotoBoldCondensedItalic == null) { 
        Roboto.sRobotoBoldCondensedItalic = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-BoldCondensedItalic.ttf"); 
       } 
       return Roboto.sRobotoBoldCondensedItalic; 
      case Roboto.ROBOTO_BOLD_ITALIC: 
       if (Roboto.sRobotoBoldItalic == null) { 
        Roboto.sRobotoBoldItalic = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-BoldItalic.ttf"); 
       } 
       return Roboto.sRobotoBoldItalic; 
      case Roboto.ROBOTO_CONDENSED: 
       if (Roboto.sRobotoCondensed == null) { 
        Roboto.sRobotoCondensed = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Condensed.ttf"); 
       } 
       return Roboto.sRobotoCondensed; 
      case Roboto.ROBOTO_CONDENSED_ITALIC: 
       if (Roboto.sRobotoCondensedItalic == null) { 
        Roboto.sRobotoCondensedItalic = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-CondensedItalic.ttf"); 
       } 
       return Roboto.sRobotoCondensedItalic; 
      case Roboto.ROBOTO_ITALIC: 
       if (Roboto.sRobotoItalic == null) { 
        Roboto.sRobotoItalic = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Italic.ttf"); 
       } 
       return Roboto.sRobotoItalic; 
      case Roboto.ROBOTO_LIGHT: 
       if (Roboto.sRobotoLight == null) { 
        Roboto.sRobotoLight = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Light.ttf"); 
       } 
       return Roboto.sRobotoLight; 
      case Roboto.ROBOTO_LIGHT_ITALIC: 
       if (Roboto.sRobotoLightItalic == null) { 
        Roboto.sRobotoLightItalic = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-LightItalic.ttf"); 
       } 
       return Roboto.sRobotoLightItalic; 
      case Roboto.ROBOTO_MEDIUM: 
       if (Roboto.sRobotoMedium == null) { 
        Roboto.sRobotoMedium = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Medium.ttf"); 
       } 
       return Roboto.sRobotoMedium; 
      case Roboto.ROBOTO_MEDIUM_ITALIC: 
       if (Roboto.sRobotoMediumItalic == null) { 
        Roboto.sRobotoMediumItalic = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-MediumItalic.ttf"); 
       } 
       return Roboto.sRobotoMediumItalic; 
      default: 
      case Roboto.ROBOTO_REGULAR: 
       if (Roboto.sRobotoRegular == null) { 
        Roboto.sRobotoRegular = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Regular.ttf"); 
       } 
       return Roboto.sRobotoRegular; 
      case Roboto.ROBOTO_THIN: 
       if (Roboto.sRobotoThin == null) { 
        Roboto.sRobotoThin = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-Thin.ttf"); 
       } 
       return Roboto.sRobotoThin; 
      case Roboto.ROBOTO_THIN_ITALIC: 
       if (Roboto.sRobotoThinItalic == null) { 
        Roboto.sRobotoThinItalic = Typeface.createFromAsset(context.getAssets(), "fonts/Roboto-ThinItalic.ttf"); 
       } 
       return Roboto.sRobotoThinItalic; 
     } 
    } 

    public static class Roboto { 
     public static final int ROBOTO_BLACK = 0; 
     public static final int ROBOTO_BLACK_ITALIC = 1; 
     public static final int ROBOTO_BOLD = 2; 
     public static final int ROBOTO_BOLD_ITALIC = 3; 
     public static final int ROBOTO_BOLD_CONDENSED = 4; 
     public static final int ROBOTO_BOLD_CONDENSED_ITALIC = 5; 
     public static final int ROBOTO_CONDENSED = 6; 
     public static final int ROBOTO_CONDENSED_ITALIC = 7; 
     public static final int ROBOTO_ITALIC = 8; 
     public static final int ROBOTO_LIGHT = 9; 
     public static final int ROBOTO_LIGHT_ITALIC = 10; 
     public static final int ROBOTO_MEDIUM = 11; 
     public static final int ROBOTO_MEDIUM_ITALIC = 12; 
     public static final int ROBOTO_REGULAR = 13; 
     public static final int ROBOTO_THIN = 14; 
     public static final int ROBOTO_THIN_ITALIC = 15; 

     private static Typeface sRobotoBlack; 
     private static Typeface sRobotoBlackItalic; 
     private static Typeface sRobotoBold; 
     private static Typeface sRobotoBoldItalic; 
     private static Typeface sRobotoBoldCondensed; 
     private static Typeface sRobotoBoldCondensedItalic; 
     private static Typeface sRobotoCondensed; 
     private static Typeface sRobotoCondensedItalic; 
     private static Typeface sRobotoItalic; 
     private static Typeface sRobotoLight; 
     private static Typeface sRobotoLightItalic; 
     private static Typeface sRobotoMedium; 
     private static Typeface sRobotoMediumItalic; 
     private static Typeface sRobotoRegular; 
     private static Typeface sRobotoThin; 
     private static Typeface sRobotoThinItalic; 
    } 
} 

ответ

1
xmlns:custom="http://schemas.android.com/apk/res/my.package.name" 

старый стиль добавления пользовательского пространства имен. Попробуйте использовать следующее, которое автоматически заменит правильный пакет для вас -

xmlns:custom="http://schemas.android.com/apk/res-auto" 
+0

Это помогло мне, и после очистки проекта все работает так, как должно. Спасибо, мужик. – user1870076

1

Изменить следующий код

<declare-styleable name="RobotoTextView"> 
    <attr name="typeface" format="enum"> 
     <enum name="robotoBlack" value="0" /> 
     <enum name="robotoBlackItalic" value="1" /> 
     <enum name="robotoBold" value="2" /> 
     <enum name="robotoBoldItalic" value="3" /> 
     <enum name="robotoBoldCondensed" value="4" /> 
     <enum name="robotoBoldCondensedItalic" value="5" /> 
     <enum name="robotoCondensed" value="6" /> 
     <enum name="robotoCondensedItalic" value="7" /> 
     <enum name="robotoItalic" value="8" /> 
     <enum name="robotoLight" value="9" /> 
     <enum name="robotoLightItalic" value="10" /> 
     <enum name="robotoMedium" value="11" /> 
     <enum name="robotoMediumItalic" value="12" /> 
     <enum name="robotoRegular" value="13" /> 
     <enum name="robotoThin" value="14" /> 
     <enum name="robotoThinItalic" value="15" /> 
    </attr> 
</declare-styleable> 

к этому

<declare-styleable name="RobotoTextView"> 
    <attr name="typeface" /> 
</declare-styleable> 

<attr name="typeface" format="enum"> 
    <enum name="robotoBlack" value="0" /> 
    <enum name="robotoBlackItalic" value="1" /> 
    <enum name="robotoBold" value="2" /> 
    <enum name="robotoBoldItalic" value="3" /> 
    <enum name="robotoBoldCondensed" value="4" /> 
    <enum name="robotoBoldCondensedItalic" value="5" /> 
    <enum name="robotoCondensed" value="6" /> 
    <enum name="robotoCondensedItalic" value="7" /> 
    <enum name="robotoItalic" value="8" /> 
    <enum name="robotoLight" value="9" /> 
    <enum name="robotoLightItalic" value="10" /> 
    <enum name="robotoMedium" value="11" /> 
    <enum name="robotoMediumItalic" value="12" /> 
    <enum name="robotoRegular" value="13" /> 
    <enum name="robotoThin" value="14" /> 
    <enum name="robotoThinItalic" value="15" /> 
</attr> 
+0

Это не решит мою проблему. Не уверен, что есть разница между моим кодом и вашим :) – user1870076

+1

@ user1870076 После изменения тега 'xmlns: custom' на этот' xmlns: custom = "http://schemas.android.com/apk/res-auto" ' и попробовать. –

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