android attr.xml 怎么在主工程中设置library项目中背景或者其他一些属性。

本文详细介绍了如何在主工程中通过自定义属性和资源文件设置Library项目的背景和其他属性值,包括使用attr.xml进行自定义属性定义、在theme.xml中为这些属性设置值,以及在主工程中继承并重新赋值的过程。

怎么在主工程中设置library项目中背景或者其他一些属性值。

attr.xml :自定义属性。

format值参考:    http://huangbo-2020.iteye.com/blog/1477611

1、自定义属性:

<resources>

<attr name="searchViewCloseIcon" format="reference" />

</resources>

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:src="?attr/searchViewCloseIcon" />

在theme.xml中:

把这个值设在theme.xml的style中,这样aplication引用这个style时,就会对这个属性赋值。

 <item name="searchViewCloseIcon">@drawable/abs__ic_clear</item>

 在主工程中继承这个style,重新给searchViewCloseIcon赋值。

<think>在Android框架的C++层解析XML,通常涉及使用libxml2、expat或者Android自带的XML解析库。在Android系统中,推荐使用系统自带的工具,例如AAPT(Android Asset Packaging Tool)在编译时处理资源,但在运行时,C++层解析XML可以使用`libexpat`,因为Android系统已经集成了expat库。 以下是在Android C++层使用expat解析XML的基本步骤: 1. 包含expat头文件。 2. 创建解析器。 3. 设置元素开始、结束和字符数据的处理函数。 4. 解析XML数据。 5. 销毁解析器。 下面是一个简单的示例,展示如何解析一个XML字符串。 首先,在Android.bp或CMakeLists.txt中添加expat库的依赖: 对于CMakeLists.txt: ```cmake find_library( # Sets the name of the path variable. log-lib log ) find_library( # Sets the name of the path variable for expat. expat-lib expat ) target_link_libraries( # Specifies the target library. your-target ${log-lib} ${expat-lib} ) ``` 对于Android.bp(Soong构建系统): ```bp shared_libs: [ "libexpat", "liblog", ], ``` 然后,C++代码示例: ```cpp #include <string> #include <android/log.h> #include <expat.h> #define TAG "XMLParser" #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__) // 元素开始处理函数 static void XMLCALL startElementHandler(void *userData, const XML_Char *name, const XML_Char **atts) { LOGD("Start element: %s", name); for (int i = 0; atts[i]; i += 2) { const XML_Char *attr = atts[i]; const XML_Char *value = atts[i+1]; LOGD("Attribute: %s = %s", attr, value); } } // 元素结束处理函数 static void XMLCALL endElementHandler(void *userData, const XML_Char *name) { LOGD("End element: %s", name); } // 字符数据处理函数 static void XMLCALL characterDataHandler(void *userData, const XML_Char *s, int len) { std::string data(s, len); LOGD("Character data: %s", data.c_str()); } void parseXML(const char *xmlData, size_t length) { // 创建解析器 XML_Parser parser = XML_ParserCreate(NULL); if (!parser) { LOGD("Failed to create parser."); return; } // 设置处理函数 XML_SetElementHandler(parser, startElementHandler, endElementHandler); XML_SetCharacterDataHandler(parser, characterDataHandler); // 解析 XML_Status status = XML_Parse(parser, xmlData, length, 1); if (status == XML_STATUS_ERROR) { LOGD("Parse error: %s", XML_ErrorString(XML_GetErrorCode(parser))); } // 销毁解析器 XML_ParserFree(parser); } ``` 解释: 1. 我们包含了必要的头文件,包括`expat.h`。 2. 定义了日志宏,方便调试。 3. 定义了三个静态函数作为回调:`startElementHandler`(处理元素开始)、`endElementHandler`(处理元素结束)和`characterDataHandler`(处理元素内的文本数据)。 4. 在`parseXML`函数中,我们创建了解析器,设置了回调函数,然后传入XML数据进行解析。 5. 最后,释放解析器。 注意:这个例子只解析了一个字符串。在实际使用中,你可能需要从文件或资源中读取XML数据。另外,错误处理需要根据实际情况进行完善。 回调函数中的`userData`参数可以传递用户数据,例如一个结构体,用于在回调之间传递状态。 如果需要解析大型XML文件,可能需要分段读取并调用`XML_Parse`多次,最后再调用`XML_Parse`并传入`true`表示结束。 另外,在Android中,如果是在Framework层解析资源XML,可能会使用到AAPT编译后的二进制格式,这样效率更高。但对于通用的XML解析,expat是一个轻量级的选择。 §§相关问题§§: 1.Android C++层,除了expat,还有哪些XML解析库可以使用? 2. 如何解析Android资源二进制XML文件(比如AndroidManifest.xml)? 3. 使用expat解析XML时,如何处理命名空间? 4.Android NDK中,如何从assets目录读取XML文件并解析?</think>在 Android Framework 的 C++ 层解析 XML,推荐使用 Android 内置的 `libxml2` 库(系统已集成)或 AOSP 中的 XML 工具类。以下是完整实现方案: ### 方案 1:使用 libxml2(通用跨平台方案) ```cpp #include <libxml/parser.h> #include <libxml/tree.h> #include <utils/Log.h> // Android 日志 void parseXMLWithLibxml2(const char* xmlPath) { xmlDocPtr doc = xmlReadFile(xmlPath, NULL, 0); if (!doc) { ALOGE("Failed to parse XML file: %s", xmlPath); return; } xmlNodePtr root = xmlDocGetRootElement(doc); for (xmlNodePtr node = root->children; node; node = node->next) { if (node->type != XML_ELEMENT_NODE) continue; // 1. 获取节点名称 ALOGD("Element: %s", node->name); // 2. 获取属性 xmlAttrPtr attr = node->properties; while (attr) { xmlChar* value = xmlNodeListGetString(node->doc, attr->children, 1); ALOGD(" Attribute: %s = %s", attr->name, value); xmlFree(value); attr = attr->next; } // 3. 获取文本内容 xmlChar* content = xmlNodeGetContent(node); if (content) { ALOGD(" Content: %s", content); xmlFree(content); } } xmlFreeDoc(doc); xmlCleanupParser(); } ``` ### 方案 2:使用 AOSP 的 XML 工具类(Android 专属) ```cpp #include <utils/String8.h> #include <xmlparse/XmlPullParser.h> #include <utils/Log.h> #include <fstream> using namespace android; void parseXMLWithAOSP(const char* xmlPath) { std::ifstream file(xmlPath); if (!file) { ALOGE("Cannot open file: %s", xmlPath); return; } // 创建解析器实例 XmlPullParser parser; parser.setInput(file); int eventType; while ((eventType = parser.next()) != XmlPullParser::END_DOCUMENT) { switch (eventType) { case XmlPullParser::START_TAG: { String8 tagName(parser.getName()); ALOGD("START_TAG: %s", tagName.string()); // 遍历属性 size_t attrCount = parser.getAttributeCount(); for (size_t i = 0; i < attrCount; ++i) { String8 attrName(parser.getAttributeName(i)); String8 attrValue(parser.getAttributeValue(i)); ALOGD(" Attribute: %s = %s", attrName.string(), attrValue.string()); } break; } case XmlPullParser::END_TAG: ALOGD("END_TAG: %s", parser.getName().string()); break; case XmlPullParser::TEXT: if (!parser.isWhitespace()) { ALOGD("TEXT: %s", parser.getText().string()); } break; } } file.close(); } ``` ### 关键步骤解释: 1. **文件加载**: - `libxml2`:使用 `xmlReadFile()` 直接加载文件 - AOSP:通过 `std::ifstream` 创建文件流 2. **节点遍历**: - `libxml2`:通过 `xmlNodePtr` 递归遍历 DOM 树 - AOSP:使用 `XmlPullParser::next()` 事件驱动模型 3. **属性处理**: - `libxml2`:通过 `properties` 链表遍历属性 - AOSP:使用 `getAttributeCount()` 和 `getAttributeValue()` 4. **内存管理**: - `libxml2`:需手动调用 `xmlFreeDoc()` 和 `xmlCleanupParser()` - AOSP:RAII 模式自动管理资源 ### 构建配置(Android.bp): ```bp cc_binary { name: "xml_parser_example", srcs: ["XmlParser.cpp"], shared_libs: [ "libutils", "liblog", "libexpat", // 对于AOSP方案 "libxml2", // 对于libxml2方案 ], cflags: [ "-Wall", "-Werror", // libxml2需要此flag "-Iexternal/libxml2/include", ], } ``` ### 选择建议: - **跨平台需求**:优先选 `libxml2`(更通用) - **性能敏感场景**:选 AOSP 的 `XmlPullParser`(事件驱动,内存占用低) - **复杂XML处理**:选 `libxml2`(XPath/XSLT支持更完善)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值