3

我正在创建一个 Android SDK 作为 jar。它包含一些带有自定义参数的自定义视图。我想创建一个插入式解决方案,开发人员除了将 jar 放到他们的 libs 文件夹中之外不需要做任何事情。我不能参加真正的图书馆项目,这是业务需求。

一切实际上都很好,这不是我第一个作为 jar 发布的 android 项目。但是在这一个中,我需要为自定义视图提供自定义属性。这意味着 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 会抱怨:

  • 错误:在包“com.XXX.XXX”中找不到属性“XXX”的资源标识符

我已经查看了 admobs jar 文件,但我在 com.google.ads 包中找不到任何特别的东西,它看起来像一个 xml 定义。知道他们是如何做到这一点的吗/aapt 如何知道 admob 的视图支持哪些属性?

谢谢!

4

1 回答 1

4

无需创建attr.xml即可使用自定义属性。package您可以使用以下方法通过其and获取 attr 值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);
        }
    }
}

您可以反编译AdMobjar 并查看它们使用相同的方法。

编辑:

如果您遇到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.namenamespcae 来避免这个问题。

于 2013-03-31T03:45:01.577 回答