2010-12-16 6 views
37

У меня есть обычай PieTimer Просмотр в Android Библиотека проектаПомощь с обычаем Просмотр атрибутов внутри проекта Android библиотеки

package com.mysite.android.library.pietimer; 

public class PieTimerView extends View { 
... 

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

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

styleable файл 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, но когда я сделал свой проект библиотеки проект и имеет бесплатную и полную версию, реализующую библиотеку, я нашел его нет дольше работал, поэтому я добавил пространство имен пирога.

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

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

+0

Вы нашли лучшее решение? – 2011-01-25 15:26:12

+0

Пожалуйста, скажите мне, что есть лучший способ сделать это. У меня такая же проблема, включая объявления admob в проекте библиотеки. – 2011-02-13 23:45:39

+0

Хороший вопрос. Я также сталкиваюсь с той же проблемой. Все могут дать свои идеи. – 2012-09-25 07:20:46

ответ

0
xmlns:app="http://schemas.android.com/apk/res/com.mysite.android.library.myapp" 

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

4

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

9

После двух часов работы с моим коллегой, мы выясним, как сделать эту работу: Library: com.library mywidget.java с классом MyWidget

attrs.xml:

<declare-styleable name="MyWidget"> 

и положите ваш attr

Вместо того чтобы иметь свой макет (например, main.xml) с объявленным в нем виджетами, juste создайте файл 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> 

App: com.myapp

Вы Juste должны дублировать 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> 

И обычно это сработает!

0

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

https://gist.github.com/1105281

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

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

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

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

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

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

92

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

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

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

исх: 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/

1

Для всех API, это получение (если библиотека компонуются как JAR, но он должен работать также, как андроида проект библиотеки ссылка)

Проект библиотеки: 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> 

проект App 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> 

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

getResources().getStringArray(com.myapp.library1.R.array.MyCustomArray) 
Смежные вопросы