
我正在将一个Android SDK创建为jar.它包含一些带有自定义参数的自定义视图.我想创建一个嵌入式解决方案,开发人员除了将jar放入其libs文件夹外,无需执行其他任何 *** 作.我不能进行真正的图书馆项目,这是一项业务需求.
一切实际上都正常,这不是我的第一个以jar形式发布的androID项目.但是在这一本书中,我需要为自定义视图提供自定义属性.这意味着AndroID需要了解xml架构视图所支持的属性集.
一种简单的解决方案是让用户将预定义的attr.xml放在他们的resources文件夹中.但是我已经看到像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会抱怨:
>错误:在包中找不到属性“ XXX”的资源标识符
‘com.XXX.XXX’
我已经研究过admobs jar文件,并且在com.Google.ads包中找不到任何类似于xml定义的特殊内容.知道他们如何做到这一点/ aapt如何知道admob的视图支持哪些属性?
谢谢!
解决方法:
创建attr.xml来使用自定义属性不是必需的.您可以使用以下方法通过其包和名称来获取attr值:
> AttributeSet.getAttributeBooleanValue (String namespace, String attribute, boolean defaultValue)
> AttributeSet.getAttributeFloatValue (String namespace, String attribute, float defaultValue)
> AttributeSet.getAttributeValue (String namespace, String name)
>依此类推
这是一个简单的示例如何使用它们:
布局文件:
<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进行反编译,看看它们是否使用相同的方法.
编辑:
如果您在包’com.XXX.XXX’的错误中找不到属性’XXX’的资源标识符,请确保您的命名空间看起来不像http://schemas.androID.com/apk/res/your.包裹名字. apk / res是最重要的,因为在这种情况下,appt将检查attrs.xml中是否确实声明了提及的属性.您可以只使用http://schemas.androID.com/apk/lib/your.package.name namespcae来避免此问题.
总结以上是内存溢出为你收集整理的在Android中从jar lib声明名称空间全部内容,希望文章能够帮你解决在Android中从jar lib声明名称空间所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)