2010-12-16 14 views
37

Mam zwyczaj PieTimer Zobacz w Android Biblioteka ProjektuPomoc dla niestandardowego widoku atrybutów wewnątrz Android Biblioteka Projektu

package com.mysite.android.library.pietimer; 

public class PieTimerView extends View { 
... 

Mam też XML atrybuty pliku, który używam w moim PieTimer

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

styleable plik XML wygląda to

<?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> 

mam PieTimer w pliku układ dla projektu, który Korzysta z biblioteki, jak to

<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> 

Wcześniej używałem xmlns:app jako nazw dla atrybutów takich jak app:ok_color ale kiedy zrobiłem mój projekt projekt biblioteki i ma swobodny i pełny wersję wykonawczą bibliotekę, znalazłem to nie Długo działał, więc dodałem obszar nazw plików.

Wyświetla się PieTimerView, ale przypisane nie działają, używają wartości domyślnej (nie występowało to wcześniej), więc występuje tutaj konflikt nazw przestrzeni.

Jaki jest prawidłowy sposób wykonania tej czynności?

+0

czy znalazłeś lepsze rozwiązanie? –

+0

Proszę mi powiedzieć, że jest lepszy sposób na zrobienie tego. Mam taki sam problem, gdy dołączam reklamy Adama do projektu bibliotecznego. –

+0

Dobre pytanie.Mam również do czynienia z tym samym problemem. Wszyscy mogą podać swoje pomysły. –

Odpowiedz

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

może pakiet (com.mysite.android.library.myapp) określono to złe miejsce. możesz sprawdzić atrybut pakietu minimalnego elementu w pliku AndroidMinifest.xml. powinny być identyczne.

+1

Nie są to identyczne, ponieważ jest to Projekt Biblioteczny (zawierający całą logikę i układy), projekt podrzędny ma inną przestrzeń nazw i to powoduje problem. w ten sposób: 'com.mysite.android.library.myapp.lite' oraz' com.mysite.android.library.myapp.upgrade ' – jax

+0

Zrobiłem to poprzez ręczne kopiowanie wszystkich plików layoutu do projektów podrzędnych i zmianę przestrzeni nazw ... ale jest to naprawdę nieprzyjemne rozwiązanie, szczególnie gdy masz wiele układów. – jax

4

Istnieje znany błąd i opisano go tutaj: bug #9656. Opisałem też, dlaczego tak się dzieje w moim blogu post.

9

Po dwóch godzinach pracy z moim kolegą, możemy dowiedzieć się, jak do tej pracy: Biblioteka: com.library mywidget.java z klasy MyWidget

attrs.xml:

<declare-styleable name="MyWidget"> 

i umieść swój attr

Zamiast swojego układu (na przykład main.xml) z zadeklarowanym w nim widżetem, po prostu stwórz plik my_widget.xml w polu układu Twojej biblioteki. 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> 

na włączenie go w układzie, Juste umieścić

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

App: com.myapp

Ty juste trzeba powielać my_widget.xml tutaj i zmienić nazw :

<?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> 

I zwykle będzie działać!

0

To rozwiązanie pracował dla mnie:

https://gist.github.com/1105281

Nie używać TypedArray i wymaga pogląd mieć nazwę pakietu projekt biblioteki ustalony w nim.

Nie używa również stylów wartości na poziomie programowym. Musisz również kodować ciągi atrybutów w widoku.

Powinieneś jednak zadeklarować te same nazwy atrybutów nadające się do oznaczenia Lint, aby nie pokazywały błędu podczas pisania części XML.

Link do oryginalnego wpisu na code.google.com:

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

To na pewno bije kopiowanie plików i zmieniania nazw, ale to jeszcze nie jest tak eleganckie, jak powinno być. Cieszyć się.

92

Wiem, że ten wpis jest bardzo stary, ale jeśli ktoś przyjdzie na niego spojrzeć, ten problem został naprawiony w wersji 17+ ADT. Wszelkie usługi lub Aktywności zadeklarować nazw jak:

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

res-auto zostanie zastąpiony w czasie kompilacji z aktualnym pakietem projektów, więc upewnij się skonfigurować nazwy atrybutów, aby uniknąć kolizji, jeśli w ogóle możliwe.

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/

+3

+1 Nice shot, oryginalny link jest tutaj: [Wersje do ADT 17.0.0] (http://developer.android.com/sdk/eclipse-adt.html). – yorkw

+1

Pytanie: Czy to ma znaczenie dla naszego celu budowy? (Nie zgaduję, ale nie jestem całkiem pewien ...) – ArtOfWarfare

+2

@ArtOfWarfare Nie powinien, jest to część zestawu narzędzi i zmienia twoje źródło. Powinna mieć znaczenie tylko wersja zainstalowanych narzędzi – JRaymond

1

Dla wszystkich interfejsów API jest paragon (jeśli biblioteka jest związany jako JAR, ale powinien działać również jako android projekt biblioteki odniesienia)

projekt Biblioteka: AndroidManifest .xml

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

projekt Biblioteka: Attrs.xml

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

projekt App MainLayout.xml (lub układ gdzie u używać formantu niestandardowego)

<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> 

w kodzie aplikacji, jeśli chcesz uzyskać dostęp do zasobów z korzystania z biblioteki (dawny. tablica "MyCustomArray" zdefiniowana w pliku arrays.xml z biblioteki):

getResources().getStringArray(com.myapp.library1.R.array.MyCustomArray) 
Powiązane problemy