2013-03-21 6 views
7

zu bespannen foo in strings.xml (in res \ Werte) eines app Projekt zu beziehen, man einfachWie wird eine Zeichenfolge in strings.xml einer Android-Bibliothek in Code referenziert?

getString(R.string.foo) 

getString Verfahren zum Context ist nutzen können.

Angenommen, eine Android-Bibliothek enthält in ihrer Datei strings.xml eine Zeichenfolge foo. Wie kann es in einer Methode der Bibliothek verwendet werden?

Bearbeitet: Es wurde vorgeschlagen, eine Referenz von Context an die Bibliotheksmethode zu übergeben, damit getString() verwendet werden kann. Da es sich um einen Kontext des Projekts einer App handelt, gibt es einen potenziellen Konflikt, der wie folgt veranschaulicht werden kann:

Angenommen: Die Bibliothek verfügt über eine Zeichenfolge foo mit Wert = "Bibliothek foo". Eine App Projekt hat eine Zeichenfolge foo mit value = "app foo"

Der folgende Code

Log.d("Debug", "App foo ID: " + R.string.foo); 
Log.d("Debug", "App: foo value: " + getString(R.string.foo)); 

erzeugt:

03-22 05:53:55.590: D/Debug(16719): App foo ID: 2131230723 
03-22 05:53:55.590: D/Debug(16719): App foo value: app foo 

In einer Bibliothek Verfahrens wird der folgende Code

Log.d("Debug", "Library foo ID: " + R.string.foo); 
Log.d("Debug", "Library foo value: " + context.getString(com.my.library.R.string.foo)); 

generiert:

03-22 05:55:03.680: D/Debug(16719): Library foo ID: 2131230723 
03-22 05:55:03.680: D/Debug(16719): Library foo value: app foo 

Das obige zeigt den ID-Konflikt daher fehlerhaften String-Wert.

Antwort

7

Wie Sie angegeben haben, um eine in Ihrer Bibliothek definierte String-Ressource zu referenzieren, können Sie die getString() -Methode verwenden, Sie benötigen nur einen Kontext, aber in Ihrem Beispiel wird der Konflikt durch den gleichen Namen der Strings generiert.

Wenn Sie eine Ressource in Ihrer Bibliothek definieren, liegt ein Konflikt vor, wenn Sie den gleichen Namen einer Ressource im Anwendungsmodul verwenden. Um Konflikte zu vermeiden, müssen Sie eindeutige Namen verwenden, zum Beispiel mit einem gemeinsamen Präfix für Ressourcennamen in der Bibliothek, es reicht nicht, den unterschiedlichen Paketnamen zu verwenden.

beheben Sie die folgenden Namen verwenden können:

  • mylib_foo in Ihrer Bibliothek
  • foo in Ihrer Anwendung

Quelle von Android-Dokumentation: http://developer.android.com/tools/projects/index.html#considerations

Wie Sie Ihre Bibliotheksmodule und abhängigen Anwendungen entwickeln, unter Berücksichtigung unten aufgeführten die Punkte halten:

  • Ressourcenkonflikte

    Da die Werkzeuge, die Ressourcen eines Bibliotheksmodul mit denen von eine abhängige Anwendung fusionieren Modul, eine gegebene Ressource ID könnte in beiden Modulen definiert sein. In diesem Fall wählen die Werkzeuge die Ressource aus der Anwendung oder die Bibliothek mit der höchsten Priorität aus, und verwerfen die andere Ressource. Beachten Sie bei der Entwicklung Ihrer Anwendungen , dass gemeinsame Ressourcen-IDs wahrscheinlich in mehr als einem Projekt definiert werden und zusammengeführt werden, wobei die Ressource aus der Anwendung oder Bibliothek mit der höchsten Priorität Vorrang hat.

  • Verwenden Präfixe Ressource Um Konflikte zu vermeiden

    Um Ressourcenkonflikte für gemeinsame Ressourcen-IDs zu vermeiden, sollten Sie einen Präfix oder anderes einheitliches Benennungsschema verwendet, die das Modul eindeutig ist (oder ist in allen Projektmodulen eindeutig) .

4

Ein Bibliotheksprojekt sollte in der Lage sein, seine Ressourcen auf die gleiche Weise zu referenzieren.

Gibt es ein bestimmtes Anwendungsfall-/Codebeispiel, das veranschaulicht, dass dies nicht funktioniert?

Alle im übergeordneten Projekt definierten Strings überschreiben die Bibliothek. Sogar actionbarsherlock verwendet ein Präfix ex. abs__action_bar_home_description

+1

Das Verfahren, das keinen Kontextbezug haben, wie kann getString() verwendet werden? – Hong

+0

Der einzige Weg ist mit einem Kontext. Normalerweise richte ich meine Methode ein, um einen Kontext von der aufrufenden Anwendung zu akzeptieren. – DDRBoxman

+1

müssen Sie einen 'Context' Parameter an Ihre Methode übergeben. Beachten Sie, dass 'View' eine 'getContext()' Methode hat, wenn Sie bereits einen Parameter dieses Typs haben – nicopico

Verwandte Themen