我正在创建一个Android SDK作为jar。它包含一些带自定义参数的自定义视图。我想创建一个drop-in解决方案,除了将jar放在libs文件夹中之外,开发人员不需要做任何事情。我无法使用真正的图书馆项目,这是一项业务要求。
一切都工作正常,这不是我的第一个android项目,它作为jar发布。但是在这个中,我需要为自定义视图提供自定义属性。这意味着Android需要通过xml架构了解视图支持的属性集。
简单的解决方案是让用户在其资源文件夹中放置预定义的attr.xml。但是我看到像admob这样的库在没有自定义attr.xml的情况下工作。例如,通过admob你声明:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ads="http://schemas.android.com/apk/lib/com.google.ads"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"/>
<com.google.ads.AdView android:id="@+id/ad"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
ads:adSize="BANNER"
ads:adUnitId="AD_UNIT_ID_GOES_HERE"
ads:testDevices="TEST_EMULATOR,TEST_DEVICE_ID_GOES_HERE"
ads:loadAdOnCreate="true"/>
</LinearLayout>
但您不需要在应用程序中添加attr.xml。 如果我尝试像他们一样使用它(我在jar中有视图)并且使用我自己的自定义属性具有与上面相同的布局,那么aapt会抱怨:
我已经查看了admobs jar文件,我在com.google.ads包中找不到任何特别的东西,看起来像xml定义。知道他们是如何设法做到这一点/ aapt如何知道admob的视图支持哪些属性?
谢谢!
答案 0 :(得分:4)
创建attr.xml
以使用自定义属性并不是必要的。您可以使用以下方法通过package
和name
获取attr值:
以下是如何使用它们的简单示例:
布局文件:
<com.example.HelloAndroid.StubView
xmlns:stub="http://schemas.android.com/apk/lib/com.example.HelloAndroid"
android:id="@+id/stub"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
stub:title="title value"
stub:subtitle="subtitle value" />
<强> StubView.java:强>
public class StubView extends View {
public StubView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public StubView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
final String packname = "http://schemas.android.com/apk/lib/com.example.HelloAndroid";
if (attrs != null) {
final String title = attrs.getAttributeValue(packname, "title");
final String subtitle = attrs.getAttributeValue(packname, "subtitle");
Log.d("Test", "Title " + title);
Log.d("Test", "Subtitle " + subtitle);
}
}
}
您可以反编译AdMob
jar并看到它们使用相同的方法。
修改强>
如果您收到No resource identifier found for attribute 'XXX' in package 'com.XXX.XXX'
错误,请确保您的命名空间不像http://schemas.android.com/apk/res/your.package.name
。 apk/res
是最重要的,因为在这种情况下appt
将检查提及的属性是否真的在attrs.xml
中声明。您可以使用http://schemas.android.com/apk/lib/your.package.name
namespcae来避免此问题。