如何在Android中定义自定义属性

时间:2012-09-11 08:21:55

标签: android android-xml

我想在Android应用中定义一个自定义属性。

我定义了GifMovieView类,它扩展了View。

所有3个构造函数都调用init(AttributeSet attrs)方法:

if (attrs != null) {
        String packageName = "http://schemas.android.com/apk/res/android";
        mUrl = attrs.getAttributeValue(packageName, "url");
        Log.i("TAG_MIO", mUrl);
    }

Log.i抛出异常,因为mUrl为null。

此属性在mainActivity_layout.xml中以这种方式定义:

 <com.example.propertyproject.GifMovieView
    android:id="@+id/my_id"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    gif:url="http://mygif.com/mygif.gif" />

url始终为null ...

包名是不是错了? packageName是否必须更改?

提前TY,

阿德。

2 个答案:

答案 0 :(得分:0)

*_layout.xml用于定义GUI的布局,而不是用于定义自定义字符串。

还有另一个地方,它位于res/values/strings.xml。如果strings.xml不存在,请使用以下内容创建它:

<?xml version="1.0" encoding="utf-8"?>
<resources>    
  <string name="gif_url">http://mygif.com/mygif.gif</string>
</resources>

然后您可以使用

访问它
String url = R.string.gif_url;  // (it becomes a static final property)

答案 1 :(得分:0)

  1. 在values文件夹中创建attrs.xml文件,它包含所有自定义属性
  2. <?xml version="1.0" encoding="utf-8"?>
    
    <resources>
        <declare-styleable name="MyTextView">
            <attr name="font_name" format="string" />
        </declare-styleable>
    </resources>
    

    <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyTextView"> <attr name="font_name" format="string" /> </declare-styleable> </resources>

    1. 在values文件夹中创建styles.xml,它将包含特定组件的样式,这里我以Textview为例,我将在TextView中使用字体名称属性
    2. <style name="Header_Text_Text1">
              <item name="android:textColor">@color/text1_header_text</item>
              <item name="android:textSize">26px</item>
              <item name="android:textStyle">bold</item>
              <item name="android:padding">2dp</item>
              <item name="[YOUR PACKAGE NAME]:font_name">calibri</item>
          </style>
      

      1. 让我们创建java文件来使用我们的新属性,我将扩展Textview,创建mytextview.java
      2. <style name="Header_Text_Text1"> <item name="android:textColor">@color/text1_header_text</item> <item name="android:textSize">26px</item> <item name="android:textStyle">bold</item> <item name="android:padding">2dp</item> <item name="[YOUR PACKAGE NAME]:font_name">calibri</item> </style>

        public class MyTextView extends TextView {

        1. 新的我们可以在布局中使用名为“MyTextview”的新Textview。
        2. public MyTextView(Context context, AttributeSet attrs) {
              super(context, attrs);
          
              if (isInEditMode())
                  return;
          
              final TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MusicTextView);
              final String ttfName = ta.getText(0).toString();
              Log.i("Font Name :" + ttfName);
              ta.recycle();
          }
          

          public MyTextView(Context context, AttributeSet attrs) { super(context, attrs); if (isInEditMode()) return; final TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MusicTextView); final String ttfName = ta.getText(0).toString(); Log.i("Font Name :" + ttfName); ta.recycle(); }

          }