在Android中从jar lib声明名称空间

在Android中从jar lib声明名称空间,第1张

概述我正在将一个AndroidSDK创建为jar.它包含一些带有自定义参数的自定义视图.我想创建一个嵌入式解决方案,开发人员除了将jar放入其libs文件夹外,无需执行其他任何 *** 作.我不能进行真正的图书馆项目,这是一项业务需求.一切实际上都正常,这不是我的第一个以jar形式发布的android项目.

我正在将一个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声明名称空间所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1086958.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-27
下一篇2022-05-27

发表评论

登录后才能评论

评论列表(0条)

    保存