web-dev-qa-db-ja.com

Android:styles.xmlでXML名前空間をカスタム宣言する方法は?

カスタムXML名前空間をstyles.xmlに配置し、それをレイアウトに継承しようとしています。レイアウトxmlのようにstyles.xmlでカスタムXML名前空間を宣言する方法がわかりません(例:xmlns:app="http://schemas.Android.com/tools")。

styles.xmlでカスタムXML名前空間を使用するにはどうすればよいですか?

私が持っているもの:

  1. フォントアセットReallyCoolFont.ttfasset/fontsに保存されます。

  2. my_layout.xml

    <TextView
        <!-- more attributes here -->
        app:customFont="fonts/ReallyCoolFont.ttf" 
        <!-- more attributes here -->
    </TextView>
    
  3. styles.xml

    <style name="CoolTextView">
        <!-- more items here -->
        <!-- more items here -->
    </style>
    

私が欲しいもの:

  1. my_layout.xml

    <TextView
        <!-- more attributes here -->
        style="@style/CoolTextView
        <!-- more attributes here -->
    </TextView>
    
  2. styles.xml

    <style name="CoolTextView">
        <!-- more items here -->
        <item name="app:customFont">ReallyCoolFont.ttf</item>
        <!-- more items here -->
    </style>
    

私が得るエラー:

Error:(1403, 21) No resource found that matches the given name: attr     'app:customFont'.
18
melvynkim

1)resフォルダーのattr.xmlファイルでフォントの属性を定義する必要があります。

<attr name="myfonts" format="string"></attr>

2)TextViewのカスタムスタイルを定義する必要があります。ここでは、定義済みの属性(myfonts)を使用します。

<declare-styleable name="MyCustomStyle">
    <attr name="myfonts" />
</declare-styleable>

3)

<style name="CoolTextView">
    <item name="myfonts">ReallyCoolFont.ttf</item>
</style>

あなたがこれまでに持っているものの要約:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <attr name="myfonts" format="string">
    </attr>

    <declare-styleable name="MyCustomStyle">
        <attr name="myfonts" />
    </declare-styleable> 

    <style name="CoolTextView">
        <item name="myfonts">ReallyCoolFont.ttf</item>
    </style>

</resources> 

4)これでレイアウトは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >

    <com.example.MyCustomTextView
        Android:id="@+id/result"
        style="@style/CoolTextView"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_centerInParent="true"
        Android:text="HELLO WORLD!"
        Android:textSize="24dp"
        Android:gravity="center" >
    </com.example.MyCustomTextView>

</RelativeLayout>

5)そしてあなたのMyCustomTextViewは:

public class MyCustomTextView extends TextView {


    private static final String TAG = "TextView";

    public MyCustomTextView(Context context) {
        super(context);
    }

    public MyCustomTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        settingFont(context, attrs);
    }

    public MyCustomTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        settingFont(context, attrs);
    }


    private void settingFont(Context ctx, AttributeSet attrs) {
        TypedArray a = ctx.obtainStyledAttributes(attrs, R.styleable.MyCustomStyle);
        String customFont = a.getString(R.styleable.MyCustomStyle_myfonts);
        Typeface tf = null;
        try {
        tf = Typeface.createFromAsset(ctx.getAssets(), customFont);  
        } catch (Exception e) {
            Log.e(TAG,e.getMessage());
            a.recycle();
            return;
        }

        setTypeface(tf);  
        a.recycle();
    }


}

フォントをasset/fontsディレクトリではなくassetに配置すると仮定しました。

また、読むことを強くお勧めします this

17
mmlooloo

スタイルリソースファイルでカスタム属性を参照するためにプレフィックスを追加する必要はありません。このようにするとうまくいきます:

<style name="CoolTextView">
    <item name="customFont">ReallyCoolFont.ttf</item>
</style>
11
ivagarz

答えは、スタイルで名前空間を指定しないことです。

<?xml version="1.0" encoding="utf-8" ?>
<resources xmlns:custom="http://schemas.Android.com/apk/res/com.custom.project">
    <style name="CustomStyle">
        <item name="Android:layout_width">wrap_content</item>
        <item name="Android:layout_height">wrap_content</item>

        <item name="customAttr">value</item> <!-- tee hee -->
    </style>
</resources>
5
Yaco Zaragoza

プレフィックスは必要ありません。プレフィックスがなくても機能します。これは私のプロジェクトの1つからのコードで、問題なく機能します

<style name="defaultTriangle">
    <item name="triangleColor">#FF33B5E5</item>
    <item name="triangleStrokeColor">@Android:color/black</item>
    <item name="triangleStrokeWidth">3dp</item>
</style>


<si.kseneman.views.Triangle
    style="@style/defaultTriangle"
    Android:layout_width="match_parent"
    Android:layout_height="0dip"
    Android:layout_weight="1"
    Android:padding="10dp"
    Android:rotation="0"
    />
5
Bojan Kseneman

次にカスタムフォントを作成しましたCustomTextView

public class KlavikaTextView extends TextView {

  private final static int KLAVIKA_BOLD = 0;
  private final static int KLAVIKA_BOLD_ITALIC = 1;
  private final static int KLAVIKA_LIGHT = 2;
  private final static int KLAVIKA_LIGHT_ITALIC = 3;
  private final static int KLAVIKA_MEDIUM = 4;
  private final static int KLAVIKA_MEDIUM_ITALIC = 5;
  private final static int KLAVIKA_REGULAR = 6;
  private final static int KLAVIKA_REGULAR_ITALIC = 7;

public KlavikaTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    parseAttributes(context, attrs);
}

public KlavikaTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    parseAttributes(context, attrs);
}

public KlavikaTextView(Context context) {
    super(context);

}

private void parseAttributes(Context context, AttributeSet attrs) {
    TypedArray values = context.obtainStyledAttributes(attrs, R.styleable.KlavikaTextView);

    // The value 0 is a default, but shouldn't ever be used since the attr is an enum
    int typeface = values.getInt(R.styleable.KlavikaTextView_typeface, KLAVIKA_REGULAR);

    // You can instantiate your typeface anywhere, I would suggest as a
    // singleton somewhere to avoid unnecessary copies
    switch (typeface) {
      case KLAVIKA_BOLD:
        setTypeface(App.klavikaBold);
        break;
      case KLAVIKA_BOLD_ITALIC:
        setTypeface(App.klavikaBoldItalic);
        break;
      case KLAVIKA_LIGHT:
        setTypeface(App.klavikaLight);
        break;
      case KLAVIKA_LIGHT_ITALIC:
        setTypeface(App.klavikaLightItalic);
        break;
      case KLAVIKA_MEDIUM:
        setTypeface(App.klavikaMedium);
        break;
      case KLAVIKA_MEDIUM_ITALIC:
        setTypeface(App.klavikaMediumItalic);
        break;
      case KLAVIKA_REGULAR_ITALIC:
        setTypeface(App.klavikaRegularItalic);
        break;
      case KLAVIKA_REGULAR:
      default:
        setTypeface(App.klavikaRegular);
        break;

    }
}}

次に、私が作成した値でattr.xml

 <!-- Define the values for the attribute -->
<attr name="typeface" format="enum">
    <enum name="klavika_bold" value="0" />
    <enum name="klavika_bold_italic" value="1" />
    <enum name="klavika_light" value="2" />
    <enum name="klavika_light_italic" value="3" />
    <enum name="klavika_medium" value="4" />
    <enum name="klavika_medium_italic" value="5" />
    <enum name="klavika_regular" value="6" />
    <enum name="klavika_regular_italic" value="7" />
</attr>

<!--
     Tell Android that the class "KlavikaTextView" can be styled,
     and which attributes it supports-->
<declare-styleable name="KlavikaTextView">
    <attr name="typeface" />
</declare-styleable>

次に作成されたスタイル

  <style name="TextView.Example">
    <item name="typeface">klavika_bold</item>
  </style>

Xmlレイアウトに使用できるこのスタイル

style="@style/TextView.Example" 
2
edbaev
<?xml version="1.0" encoding="utf-8"?>
<resources
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:custom="http://schemas.Android.com/apk/res/com.my.project">

    <style name="my_style"> <item name="custom:tag">some_value</item> </style>

</resources>

xML名前空間を属性値に適用しようとしていますが、これは機能しません。この場合、次のようにパッケージ名を直接指定する必要があります。

 <style name="my_style"> <item name="com.my.project:tag">some_value</item> </style>
1
Lifestohack

コードによる高速ソリューション

 String pathFont = "fonts/ReallyCoolFont.ttf";
 TextView text = (TextView) findViewById(R.id.TextView1);
 Typeface fontFace = Typeface.createFromAsset( getAssets(), pathFont );
 text.setTypeface( fontFace );

サードパーティライブラリ、XMLで問題を解決してください!

1 - https://github.com/leok7v/Android-textview-custom-fonts

2 - https://github.com/ragunathjawahar/Android-typeface-textview

私のおすすめ

他にもニーズがあり、コンポーネントごとにクラスをカスタマイズする必要があります。

他のレイアウトとメンテナンス用のNTextViewコンポーネントがある別の問題は、多くの作業が必要になります。

フォントを変更する必要がある場合は、アクティビティのOnCreateのプロジェクトでこのメソッドを使用します。これは、各アクティビティのOnCreateメソッドでのみ行う必要があります。

 private static final String FONT = "ReallyCoolFont.ttf";

public static void allTextView(final Context context, final View root) {
      String fontPath = FONT;
    try {
        if (root instanceof ViewGroup) {
            ViewGroup viewGroup = (ViewGroup) root;
            int childCount = viewGroup.getChildCount();
            for (int i = 0; i < childCount; i++)
                allTextView(context, viewGroup.getChildAt(i) );
        } else if (root instanceof TextView)
            ((TextView) root).setTypeface(Typeface.createFromAsset(context.getAssets(), fontPath));
    } catch (Exception e) { 
        e.printStackTrace();
    }
}

// call in OnCreate Activity    
allTextView(this, findViewById(R.layout.main) );
1
Dexter

カスタム属性は、<declare-styleable>タグを使用して定義されます。通常、ファイルはattrs.xmlと呼ばれます。名前空間宣言には、アプリのパッケージ名が含まれます。

プロセス全体をここで説明します: ビュークラスの作成| Android開発者

0
kris larson