在Android库项目中查看属性的帮助
我在Android库项目中有一个自定义PieTimer视图
package com.mysite.android.library.pietimer; public class PieTimerView extends View { ...
我也有一个在我的PieTimer中使用的XML属性文件
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PieTimerView);
XML可修改文件看起来像这样
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="PieTimerView"> <attr name="max_size" format="dimension" /> <attr name="start_angle" format="string" /> <attr name="start_arc" format="string" /> <attr name="ok_color" format="color" /> <attr name="warning_color" format="color" /> <attr name="critical_color" format="color" /> <attr name="background_color" format="color" /> </declare-styleable> </resources>
我有一个使用库的项目的布局文件中的PieTimer,就像这样
<RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root" android:layout_gravity="center_horizontal" xmlns:app="http://schemas.android.com/apk/res/com.mysite.android.library.myapp" xmlns:pie="com.mysite.library.pietimer" > <com.mysite.library.pietimer.PieTimerView pie:start_angle="270" pie:start_arc="0" pie:max_size="70dp" pie:ok_color="#9798AD" pie:warning_color="#696DC1" pie:critical_color="#E75757" pie:background_color="#D3D6FF" android:visibility="visible" android:layout_height="wrap_content" android:id="@+id/clock" android:layout_width="wrap_content" android:layout_alignParentRight="true"> </com.mysite.library.pietimer.PieTimerView>
以前我使用xmlns:app
作为像app:ok_color
这样的属性的命名空间,但是当我把项目做成一个库项目,并且有一个自由和完整的版本来实现库时,我发现它不再工作,所以我添加了这个饼图命名空间。
PieTimerView显示但属性不起作用,它们使用默认值(这在之前没有发生),所以这里有一些名称空间冲突。
什么是这样做的正确方法?
我知道这个post是超级老,但如果有人来看,这个问题已经修复了ADT修订版17+。 任何服务或活动声明的命名空间为:
xmlns:custom="http://schemas.android.com/apk/res-auto"
res-auto将在构build时被replace为实际的项目包,因此请确保设置属性名称,以便尽可能避免冲突。
ref: http : //www.androidpolice.com/2012/03/21/for-developers-adt-17-sdk-tools-r17-and-support-package-r7-released-with-new-features-and-修复换不起毛的构build系统和仿真器/
经过两个小时的工作与我的同事,我们弄清楚如何使这项工作:库:com.library mywidget.java与类MyWidget
attrs.xml:
<declare-styleable name="MyWidget">
并把你的attr
而不是让你的布局(例如main.xml)声明你的小部件,正确的在你的库的布局文件中创build一个my_widget.xml。 my_widget.xml
<?xml version="1.0" encoding="utf-8"?> <com.library.MyWidget xmlns:android="http://schemas.android.com/apk/res/android" xmlns:widget="http://schemas.android.com/apk/res/com.library" android:id="@+id/your_id" android:layout_width="fill_parent" android:layout_height="fill_parent" widget:your_attr> </com.library.MyWidget>
把它包含在你的布局中,是正确的
<include layout="@layout/my_widget"></include>
应用程序:com.myapp
你有必要在这里复制my_widget.xml,并更改命名空间:
<?xml version="1.0" encoding="utf-8"?> <com.library.MyWidget xmlns:android="http://schemas.android.com/apk/res/android" xmlns:widget="http://schemas.android.com/apk/res/com.myapp" <---- VERY IMPORTANT android:id="@+id/your_id" android:layout_width="fill_parent" android:layout_height="fill_parent" widget:your_attr> </com.library.MyWidget>
通常它会工作!
有一个已知的错误,并在这里描述: 错误#9656 。 我也描述了为什么发生在我的博客文章 。
对于所有API,这是收据( 如果库链接为JAR ,但也应该作为Android库项目参考)
库项目: AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.myapp.library1" ... </manifest>
库项目: Attrs.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyCustStyle" > <attr name="MyAttr1" format="dimension" /> .. </resources>
应用程序项目 MainLayout.xml(或使用自定义控件的布局)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:library1="http://schemas.android.com/apk/com.myapp.library1" ... > <com.myapp.library1.MyCustomView library1:MyAttr1="16dp" ... /> </RelativeLayout>
在App Code中,如果你想从库中使用资源(例如从lib中的arrays.xml定义的数组“MyCustomArray”),使用:
getResources().getStringArray(com.myapp.library1.R.array.MyCustomArray)
xmlns:app="http://schemas.android.com/apk/res/com.mysite.android.library.myapp"
也许你指定的包(com.mysite.android.library.myapp)是一个错误的地方。 你可以在AndroidMinifest.xml文件中检查minifest元素的package属性。 他们应该是相同的。
这个解决scheme为我工作:
https://gist.github.com/1105281
它不使用TypedArray,并要求视图将库的项目包名称硬编码在其中。
它也不会在程序层面上使用可修改的值。 您还必须将属性string硬编码到视图中。
但是,您应该为Lint声明那些相同的属性名称,以便在编写XML部分时不显示错误。
指向code.google.com上的原始post的链接:
http://code.google.com/p/android/issues/detail?id=9656#c17
它绝对是跳过复制文件和改变命名空间,但它仍然不是应该的优雅。 请享用。
- 如何知道在使用SupportMapFragment时地图已准备好使用?
- 如何在Android上制作Facebook的应用程序新菜单?
- Android防止双击一个button
- 在Android中左右alignmentbutton布局
- Android – 拉SQlite数据库android设备
- 应该“android:onOptionsItemSelected”返回true或false
- 在Activity中调用两次第三方库的本机方法会导致Android应用程序closures
- 扩展AsyncTask <Void,Void,Void>
- 升级到Android Studio 2.0后,在Gradle构build过程中发生大量错误