有人可以在这个例子中解释我声明样式的XML标签及其使用背后的理论吗?

Gia*_*nzi 9 android attr declare-styleable

我正在阅读初学Android 4开发,在第5章中它讨论了GalleryImageVievs,并介绍了声明式样式的 XML标签,但没有解释其目的.我试图在参考上找到一些信息,没有运气..例如我们有以下内容:

RES /值/ attrs.xml

<?xml version=”1.0” encoding=”utf-8”?> 
<resources>
    <declare-styleable name=”Gallery1”>
        <attr name=”android:galleryItemBackground” />
    </declare-styleable>
</resources>
Run Code Online (Sandbox Code Playgroud)

example.java

public class GalleryActivity extends Activity {
[...]
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);    
        setContentView(R.layout.main);
        Gallery gallery = (Gallery) findViewById(R.id.gallery1);
        gallery.setAdapter(new ImageAdapter(this)); 
        [...]
    }

    [...]

    public class ImageAdapter extends BaseAdapter {
        [...]
        int itemBackground;

        public ImageAdapter(Context c) {
            context = c;
            //---setting the style---
            TypedArray a = obtainStyledAttributes(
            R.styleable.Gallery1); 
            itemBackground = a.getResourceId(
                        R.styleable.Gallery1_android_galleryItemBackground, 0);
            a.recycle();
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView imageView;
            [...]
            imageView.setBackgroundResource(itemBackground);
            return imageView; 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我读过的代码几次,我真的不明白定义此设置样式的目的Gallery1用单ATTR孩子只有一个名字属性..你能帮助我吗?这个galleryItemBackground是由系统提供的还是由我们定义的东西?我们在这段代码中做了什么?

预先感谢您的任何帮助!

hap*_*ude 14

此标记是定义的一组预制Android属性的一部分R.Styleable,可以android:在属性名称之前从xml名称空间前缀的自定义样式标记中进行分析.

此特定属性描述为:

图库项目的首选背景.这应该设置为您从适配器提供的任何视图的背景.

但是,您是对的,自定义属性标记不仅需要属性的名称,还需要其类型,例如向attrs.xml文件添加自定义元素可能如下所示:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="MyCustomView"> 
        <attr name=”android:galleryItemBackground” />              
        <attr name="myCustomAttr" format="string" /> 
    </declare-styleable> 
</resources>
Run Code Online (Sandbox Code Playgroud)

请注意android:第二个属性上缺少命名空间.

编辑:

是否有任何官方文档页面深入解释这个Styleables?

查看R.attr(点击链接)获取Android中包含的各种属性.您不需要为它们声明类型,因为它们都已声明.要知道为特定属性声明了什么类型,请找到您感兴趣的类型的描述. galleryItemBackground正如您所料,是对另一个资源的引用; 其他可能性是布尔,浮标,颜色等.

其他参考:Andtoid使用<declare-styleable>标签创建AttributeSet.TypedArray用于解析AttributeSet.

如果上面代码的目的只是获取视图背景的默认Drawable,我不能用getDrawable(android.R.attr.galleryItemBackground)设置变量itemBackground吗?

在该示例中,当只有一个属性时,很难看到此模式的有用性.你可以做你想要的,也可能更容易.然而,该构造是Android的口头禅的一部分,它通过让您在xml中设置某些属性而不必在代码中执行所有操作来将UI的"外观"与其"功能"分开.以View上课为例.它有30多个属性可以在xml文件中设置(大小,填充,可点击,可聚焦等); 制作自定义子类的人View可以在xml中设置一些,全部或不设置这些属性,并在创建视图时自动为您处理它们.如果需要,可以使用相应的代码来设置属性,但想象一下,每次子类化时,View您都需要在代码中设置所有属性,而不是在xml中设置它们.

为类完全相同的事情创建自己的资源也是一件小事,但是如果不覆盖它们,使用内置样式将提供与Android框架的外观相匹配的默认资源.

希望这可以帮助.