其他分享
首页 > 其他分享> > 在Android中从jar lib声明名称空间

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

作者:互联网

我正在将一个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来避免此问题.

标签:jar,android-xml,android-view,android
来源: https://codeday.me/bug/20191031/1972961.html