Помогите с пользовательскими атрибутами просмотра в проекте библиотеки Android - PullRequest
39 голосов
/ 16 декабря 2010

У меня есть пользовательское представление PieTimer в проекте библиотеки Android

package com.mysite.android.library.pietimer;

public class PieTimerView extends View {
...

У меня также есть файл атрибутов XML, который я использую в своем PieTimer

    TypedArray a = context.obtainStyledAttributes(attrs,
        R.styleable.PieTimerView);

Внешний вид файла XMLкак это

<?xml version="1.0" encoding="utf-8"?>
<resources>
     <declare-styleable name="PieTimerView">
        <attr name="max_size" format="dimension" />
        <attr name="start_angle" format="string" />
        <attr name="start_arc" format="string" />
        <attr name="ok_color" format="color" />
        <attr name="warning_color" format="color" />
        <attr name="critical_color" format="color" />
        <attr name="background_color" format="color" />
    </declare-styleable>
</resources>

У меня есть PieTimer в файле макета для проекта, который использует библиотеку, как это

<RelativeLayout 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/root" android:layout_gravity="center_horizontal"
    xmlns:app="http://schemas.android.com/apk/res/com.mysite.android.library.myapp"
    xmlns:pie="com.mysite.library.pietimer"
    >

<com.mysite.library.pietimer.PieTimerView
    pie:start_angle="270" 
    pie:start_arc="0" 
    pie:max_size="70dp"
    pie:ok_color="#9798AD"
    pie:warning_color="#696DC1"
    pie:critical_color="#E75757"
    pie:background_color="#D3D6FF"

    android:visibility="visible"
    android:layout_height="wrap_content" android:id="@+id/clock"
    android:layout_width="wrap_content" 
    android:layout_alignParentRight="true">
</com.mysite.library.pietimer.PieTimerView>

Ранее я использовал xmlns:app в качестве пространства имен длятакие атрибуты, как app:ok_color, но когда я сделал свой проект библиотечным проектом и имел версию Free и Full, реализующую библиотеку, я обнаружил, что она больше не работает, поэтому я добавил пространство имен pie.

PieTimerView отображает, но атрибут не работает, он использует значение по умолчанию (раньше такого не было), поэтому здесь возникает некоторый конфликт пространства имен.

Как правильно это сделать

Ответы [ 6 ]

92 голосов
/ 19 апреля 2012

Я знаю, что это сообщение очень старое, но если кто-нибудь придет посмотреть, эта проблема была исправлена ​​в ADT ревизии 17+.Любые службы или действия объявляют пространство имен как:

xmlns:custom="http://schemas.android.com/apk/res-auto"

res-auto будет заменено во время сборки на фактический пакет проекта, поэтому убедитесь, что вы установили имена атрибутов, чтобы избежать коллизий, если это вообще возможно.

ref: http://www.androidpolice.com/2012/03/21/for-developers-adt-17-sdk-tools-r17-and-support-package-r7-released-with-new-features-and-fixes-for-lint-build-system-and-emulator/

9 голосов
/ 11 апреля 2011

После двух часов работы с моим коллегой мы выясняем, как сделать эту работу:

Библиотека: com.library

mywidget.java с классомMyWidget

attrs.xml:

    <declare-styleable name="MyWidget">

и укажите свой attr.

Вместо того, чтобы иметь свой макет (например, main.xml)) с объявленным в нем виджетом, просто создайте my_widget.xml в папке макета вашей библиотеки.

my_widget.xml:

<?xml version="1.0" encoding="utf-8"?>
<com.library.MyWidget
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:widget="http://schemas.android.com/apk/res/com.library"
    android:id="@+id/your_id"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    widget:your_attr>
</com.library.MyWidget>

, чтобы включить егов вашем макете просто поместите

<include layout="@layout/my_widget"></include>

Приложение: com.myapp

Вам просто нужно скопировать my_widget.xml здесь и изменить пространство имен:

<?xml version="1.0" encoding="utf-8"?>
<com.library.MyWidget
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:widget="http://schemas.android.com/apk/res/com.myapp" <---- VERY IMPORTANT
    android:id="@+id/your_id"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    widget:your_attr>
</com.library.MyWidget>

И нормально это будет работать!

4 голосов
/ 11 февраля 2011

Существует известная ошибка, описанная здесь: ошибка # 9656 .Я также описал, почему это происходит в моем блоге post .

1 голос
/ 25 сентября 2015

Для всех API это квитанция (, если библиотека связана как JAR , но должна также работать как ссылка на проект библиотеки Android)

Проект библиотеки: AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.myapp.library1" 
... 
</manifest>

Проект библиотеки: Attrs.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources>    
<declare-styleable name="MyCustStyle" >
      <attr name="MyAttr1" format="dimension" />  
    ..  
</resources>

Проект приложения MainLayout.xml (или макет, в котором вы используете пользовательский элемент управления)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:library1="http://schemas.android.com/apk/com.myapp.library1"
...
>

<com.myapp.library1.MyCustomView 
        library1:MyAttr1="16dp"
...
/>
</RelativeLayout>

В коде приложения, если вы хотите получить доступ к ресурсам из библиотеки (например, массив «MyCustomArray», определенный в arrays.xml из библиотеки lib), используйте:

getResources().getStringArray(com.myapp.library1.R.array.MyCustomArray)
0 голосов
/ 01 февраля 2012

Это решение сработало для меня:

https://gist.github.com/1105281

Оно не использует TypedArray и требует, чтобы в представлении было жестко запрограммировано имя пакета проекта библиотеки.

Также не используются настраиваемые значения на программном уровне.Вы также должны жестко закодировать строки атрибутов в представлении.

Однако вы должны объявить те же имена атрибутов в стиле Lint, чтобы не показывать ошибку при написании XML-части.

Ссылкак исходному сообщению на code.google.com:

http://code.google.com/p/android/issues/detail?id=9656#c17

Это определенно лучше, чем копирование файлов и изменение пространств имен, но все равно не так элегантно, как должно быть.Наслаждайтесь.

0 голосов
/ 16 декабря 2010
xmlns:app="http://schemas.android.com/apk/res/com.mysite.android.library.myapp"

возможно, указанный вами пакет (com.mysite.android.library.myapp) является неправильным.Вы можете проверить атрибут пакета элемента minifest в файле AndroidMinifest.xml.они должны быть идентичны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...