Declaring a custom android UI element using XML

前端 未结 6 879
渐次进展
渐次进展 2020-11-22 03:43

How do I declare an Android UI element using XML?

6条回答
  •  遇见更好的自我
    2020-11-22 04:08

    The Android Developer Guide has a section called Building Custom Components. Unfortunately, the discussion of XML attributes only covers declaring the control inside the layout file and not actually handling the values inside the class initialisation. The steps are as follows:

    1. Declare attributes in values\attrs.xml

    
    
        
            
                        
            
        
    
    

    Notice the use of an unqualified name in the declare-styleable tag. Non-standard android attributes like extraInformation need to have their type declared. Tags declared in the superclass will be available in subclasses without having to be redeclared.

    2. Create constructors

    Since there are two constructors that use an AttributeSet for initialisation, it is convenient to create a separate initialisation method for the constructors to call.

    private void init(AttributeSet attrs) { 
        TypedArray a=getContext().obtainStyledAttributes(
             attrs,
             R.styleable.MyCustomView);
    
        //Use a
        Log.i("test",a.getString(
             R.styleable.MyCustomView_android_text));
        Log.i("test",""+a.getColor(
             R.styleable.MyCustomView_android_textColor, Color.BLACK));
        Log.i("test",a.getString(
             R.styleable.MyCustomView_extraInformation));
    
        //Don't forget this
        a.recycle();
    }
    

    R.styleable.MyCustomView is an autogenerated int[] resource where each element is the ID of an attribute. Attributes are generated for each property in the XML by appending the attribute name to the element name. For example, R.styleable.MyCustomView_android_text contains the android_text attribute for MyCustomView. Attributes can then be retrieved from the TypedArray using various get functions. If the attribute is not defined in the defined in the XML, then null is returned. Except, of course, if the return type is a primitive, in which case the second argument is returned.

    If you don't want to retrieve all of the attributes, it is possible to create this array manually.The ID for standard android attributes are included in android.R.attr, while attributes for this project are in R.attr.

    int attrsWanted[]=new int[]{android.R.attr.text, R.attr.textColor};
    

    Please note that you should not use anything in android.R.styleable, as per this thread it may change in the future. It is still in the documentation as being to view all these constants in the one place is useful.

    3. Use it in a layout files such as layout\main.xml

    Include the namespace declaration xmlns:app="http://schemas.android.com/apk/res-auto" in the top level xml element. Namespaces provide a method to avoid the conflicts that sometimes occur when different schemas use the same element names (see this article for more info). The URL is simply a manner of uniquely identifying schemas - nothing actually needs to be hosted at that URL. If this doesn't appear to be doing anything, it is because you don't actually need to add the namespace prefix unless you need to resolve a conflict.

     
    

    Reference the custom view using the fully qualified name.

    Android LabelView Sample

    If you want a complete example, look at the android label view sample.

    LabelView.java

     TypedArray a=context.obtainStyledAttributes(attrs, R.styleable.LabelView);
     CharSequences=a.getString(R.styleable.LabelView_text);
    

    attrs.xml

    
        
        
        
    
    

    custom_view_1.xml

    
    

    This is contained in a LinearLayout with a namespace attribute: xmlns:app="http://schemas.android.com/apk/res-auto"

    Links

    • StackOverflow Thread: Retrieving an XML attribute for custom control
    • How do I use obtainStyledAttributes with internal themes of Android
    • Defining custom attributes + list of supported attribute formats

提交回复
热议问题