9

Ursprünglich enthielt meine AndroidManifest.xml eine Aktivität, die ich über ihren benutzerdefinierten Aktionsnamen erreichte.Sollten String-Referenzen nicht für Action-Namen eines Intent-Filters in AndroidManifest funktionieren?

<activity 
android:label="HERE I AM" 
android:name="TestController"> 
<intent-filter> 
    <action android:name="com.company.project.TestActivity" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 
</activity> 

Mit diesem Manifest startActivity(new Intent("com.company.project.TestActivity")); begann meine Aktivität ohne Probleme.

Aber ich war nicht mit dieser Codierung Stil zufrieden. Frühere I wurde streng mal angewiesen, nicht in-line definierte String-Konstanten zu verwenden, weil es zu weniger wartungsfähigem Code führen würde. Und es ist wirklich ist ein Punkt.

Also zuerst erklärte ich ap ublic static final String MY_ACTION = "com.company.project.TestActivity"; in meiner App.java Klasse (die, die ich für verwendet) und erreichte meine Komponente durch diese benannte Konstante diese Weise:

startActivity(new Intent(App.MY_ACTION));

Dies schien viel besser, aber ich immer noch musste zwei Instanzen der gleichen Zeichenfolge beibehalten. Bei http://developer.android.com/reference/android/R.styleable.html#AndroidManifestAction_name lesen einen

... Dies ist auch ein Verweis auf eine Ressource sein kann (in der Form "@ [package:] Typ: name")? Oder das Thema Attribut (in der Form“[package:] [type:] name ") mit einem Wert dieses Typs. So

Ich vermutete, es wäre schön, diese Zeichenfolge GERADE EINMAL definiert zu haben. Ich habe <string name="MY_ACTION">com.company.project.TestActivity</string> in meinem strings.xml und modifizierte meine App:

public class App ... 
    public static String MY_ACTION; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     MY_ACTION = getString(R.string.MY_ACTION); 
    ... 

Und alles war noch O. K.

... bis ich mein AndroidManifest.xml geändert habe, um <action android:name="@string/MY_ACTION" /> statt <action android:name="com.company.project.TestActivity" /> zu verwenden. Nach dieser Änderung zu meiner größten Überraschung brach die Anwendung zur Laufzeit ab und beschwerte sich darüber, die Aktivität nicht für meine Absicht zu finden. Die Zeichenfolgenreferenz wurde wahrscheinlich nicht korrekt analysiert. :(

Vielleicht ist das Problem, dass R.string ist config abhängig ...? Aber hey, ich kann nicht so verrückt sein, eine solche Zeichenfolge Verweis dessen Wert kann sich von Config zu Config ändern! Und developer.android.com sagte mir ist es in Ordnung, Verweise auf Aktionsnamen zu verwenden! Ich habe dieses Verhalten auf API-Ebene 6, 7, Ende 8. Ist es nur ein einfacher Fehler im Android-System? Oder verstehe ich etwas falsch?

Ich bin total verwirrt, Bitte helfen Sie mir. Vielen Dank im Voraus.

Antwort

4

Ich hatte das gleiche Problem heute, und ging auf der Suche nach einer Antwort woanders.Es scheint nach Dianne Hackborne, was wir versuchen zu tun ist nicht erlaubt.Sie ​​müssen offensichtlich die Litera verwenden l Strings in Intent-Filtern.

http://android.bigresource.com/Track/android-zKGKHraw9/

+0

Hallo MarkG, danke, neige ich dazu, auch zu glauben, dass dies die Situation ist. Wir werden nicht als Erwachsene behandelt, die in der Lage sind, konfiguierte und unabhängige Strings zu trennen. :-) Ich akzeptiere deine Antwort. –