2011-11-24 10 views
5

Android documentation mówi mi, że mogę uzyskać dostęp ciąg od innego pakietu, korzystając z „nazwy pakietu”, cokolwiek to znaczy:Jak odwołać się do ciągu z innego pakietu w bibliotece przy użyciu XML w systemie Android?

@[<package_name>:]<resource_type>/<resource_name> 

Więc mój manifest Chcę uzyskać dostęp ciąg znaków, który umieściłem w odrębnym projekcie biblioteki, w com.globalmentor.android package --- to gdzie moja R klasa jest po wszystkim:

<activity 
     android:label="@com.globalmentor.android:string/app_applicationlistactivity_label" 
     android:name="com.globalmentor.android.app.ApplicationListActivity" > 
    </activity> 

to nawet nie skompilować. Ale to robi:

<activity 
     android:label="@string/app_applicationlistactivity_label" 
     android:name="com.globalmentor.android.app.ApplicationListActivity" > 
    </activity> 

Dlaczego? Co oznacza dokumentacja Android, która mówi o "nazwa_pakietu"? Dlaczego pierwszy przykład nie działa i dlaczego działa drugi przykład? Nie chcę, aby wszystkie moje nazwy zasobów były połączone w ten sam plik R --- Chcę, żeby były podzielone na partycje, tak jak je napisałem.

Odpowiedz

3

W skrócie: prefiks nazwy pakietu dotyczy bibliotek współdzielonych, a nie apk.

Dokumentacja brzmi:

Aby odwołać System zasób, trzeba by podać nazwę pakietu

Odpowiada dla zewnętrznych bibliotek współdzielonych (i ich zasobów), aplikacja jest połączony z (np. mapy). Mają własną klasę R, nie połączoną z aplikacją.

Są to wszystkie standardowe pakiety android i udostępnione biblioteki wspomniane w sekcji manifestu Android.

Jak zauważył Nikolay, wszystkie zasoby aplikacji są połączone, dlatego w większości projektów bibliotecznych używane są przedrostki takie jak abs__ dla nazw zasobów.

Aby uzyskać dodatkowe informacje, patrz Library projects doc.

1

Niezależnie od tego, czy ci się to podoba, czy nie, zasoby projektu bibliotecznego są scalane z zasobami projektu aplikacji, zasoby o tej samej nazwie z projektu aplikacji zastępują te z projektów bibliotecznych. Sprawdź plik R.java w projekcie aplikacji, aby go potwierdzić.

Dostęp do publicznie eksportowanych zasobów szkieletowych można uzyskać, korzystając z @android:string/foo (pakietu "android"), ale nie sądzę, że można wyeksportować zasoby z takiego projektu bibliotecznego jak ten (jeszcze).

+1

Poważnie? Jaki jest sens posiadania 'com.myapp.R' i' com.library.R', jeśli wszystkie nazwy nadal kolidują? Tak więc muszę użyć 'com.example.foo.R.id.com_example_foo_bar' zamiast' com.example.foo.R.id.bar' tylko po to, aby zapobiec konfliktowi nazw, gdy zostaną scalone? Jak głupio. –

+2

Wciąż nie ma pojęcia, co oznacza dokumentacja, gdy jest napisane "nazwa_pakietu" (zobacz oryginalne pytanie)? –

2

Dlaczego?

Ponieważ projekt biblioteczny został dodany do projektu, więc system Android łączy zasoby, więc ostatni projekt, który jest zbudowany, "wygrywa" nazwę. Z tego powodu warto przedłużyć zasoby. W tym przypadku "nazwa_pakietu" nie może być użyta, ponieważ masz te zasoby w swoim projekcie. Wyobrażam sobie, że to jest twój przypadek, ponieważ kompiluje się bez nazwy pakietu.

Jeśli projekt nie został dodany do projektu, możliwe jest użycie SharedUserId.

Źródło: http://developer.android.com/tools/projects/index.html

względy rozwojowe

Jak rozwijać swój projekt biblioteki i aplikacje zależne, prowadzą punktów wymienionych poniżej w uwadze:

  • konfliktów zasobów Ponieważ narzędzia scalania zasoby projektu biblioteki wraz z projektami zależnych aplikacji, dany identyfikator zasobu biblioteki można zdefiniować w oba projekty. W takim przypadku narzędzia wybierają zasoby z aplikacji lub biblioteki o najwyższym priorytecie i odrzucają inny zasób. W miarę rozwijania aplikacji należy pamiętać, że typowe identyfikatory zasobów prawdopodobnie będą zdefiniowane w więcej niż jednym projekcie i zostaną scalone z zasobem z pierwszeństwa aplikacji lub biblioteki o najwyższym priorytecie.
  • Użyj prefiksów, aby uniknąć konfliktów zasobów Aby uniknąć konfliktów zasobów dla typowych identyfikatorów zasobów, należy rozważyć użycie prefiksu lub innego spójnego schematu nazewnictwa, który jest unikalny dla projektu (lub jest unikalny we wszystkich projektach ).
0

Nazwa Twój zasób w pakiecie jako com.globalmentor.android.app_applicationlistactivity_lab a nie tylko app_applicationlistactivity_lab.

<?xml version="1.0" encoding="utf-8"?> <resources> .... <string name="com.globalmentor.android.app_applicationlistactivity_lab">...</string>
.... </resources>

Następnie można uzyskać do niego dostęp z XML jako

"@string/com.globalmentor.android.app_applicationlistactivity_lab"

i programowo przez

getResources().getString(R.string.com_globalmentor_android_app_applicationlistactivity_lab);

bez konfliktów.

Powiązane problemy