在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

它绝对是跳过复制文件和改变命名空间,但它仍然不是应该的优雅。 请享用。