有人可以解释我声明,设置样式在这个例子中的XML标签及其使用背后的原理是什么?(Can someon

2019-07-29 16:13发布

我读起的Android 4.0开发和第5章就谈到画廊ImageVievs并介绍了申报,设置样式 XML标签没有解释它的目的..我试图找到一些信息也在参考,没有运气。例如,我们有以下几点:

RES /值/ attrs.xml

<?xml version=”1.0” encoding=”utf-8”?> 
<resources>
    <declare-styleable name=”Gallery1”>
        <attr name=”android:galleryItemBackground” />
    </declare-styleable>
</resources>

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; 
        }
    }
}

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

预先感谢您的任何帮助!

Answer 1:

这个标签是一组定义预制的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>

注意缺少的android:命名的第二个属性为好。

编辑:

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

退房R.attr (点击链接)包含在Android的各种属性。 你并不需要声明一个类型的他们,因为他们都已经声明。 要知道已申报什么类型的特定属性,找到一个你感兴趣的描述。 galleryItemBackground是,因为你可能会想到,到另一个资源的引用; 其他可能性是布尔值,浮筒,颜色等

其他参考:Andtoid使用<declare-styleable>标记创建AttributeSetTypedArray来解析AttributeSet

如果上面的代码的目的[...]仅仅是获得视图的背景默认可绘制,我不能设置变量itemBackground与getDrawable(android.R.attr.galleryItemBackground)?

在该示例中,这是很难看到这种图案的用途时,只有一个属性。 你可以做你问什么,它可能会更容易。 结构件,然而,Android的口头禅,让你在XML中,而不必在代码中所做的一切设置某些属性从“functionaly”分开UI的“看”的一部分。 就拿View课为例。 它具有超过30的属性,可以在XML文件中(大小,填充,可点击的,可聚焦的,等等)进行设置; 有人制作一个自定义子类View可以设置一些,全部或没有在XML这些属性,并在创建视图时,它们会自动为您处理。 有代码等同设置,如果需要的属性,但是想象一下,每当你的子类时View你必须在代码中设置的所有属性,而不必一个选项来设置他们的XML。

这也将是一件微不足道的小事,只是让自己的资源为你的类,做同样的事情,但使用内置的样式将提供匹配的Android框架的外观和感觉,如果你不重写它们默认资源。

希望这可以帮助。



文章来源: Can someone explain me declare-styleable XML tag in this example and the theory behind its use?