2013-06-18 9 views
10

Ich entwickle eine Android-Anwendung und ich möchte wissen, ob ich Enum.toString() mehrsprachig festlegen kann.Make Enum.toString() lokalisiert

Ich werde diese Enum auf eine Spinner verwenden und ich möchte mehrsprachige Texte verwenden.

public class Types 
{ 
    public enum Stature 
    { 
     tall (0, "tall"), 
     average(1, "average"), 
     small(2, "small"); 

     private final int stature; 
     private final String statureString; 

     Stature(int anStature, String anStatureString) { stature = anStature; statureString = anStatureString; } 

     public int getValue() { return stature; } 

     @Override 
     public String toString() { return statureString; } 
    } 
} 

Ich weiß nicht, wie Context.getString() innerhalb eines Enum zu verwenden, und ich habe „hoch“ fest einprogrammiert, „mittel“ und „klein“ zu testen. Ich habe das enum innerhalb auf einer Helferklasse definiert.

Dieses, wie ich verwenden, um die enum auf einen Spinner:

mSpinStature.setAdapter(new ArrayAdapter<Stature>(mActivity, android.R.layout.simple_dropdown_item_1line, Stature.values())); 

Wissen Sie, wie kann ich es tun?

+0

Dies könnte helfen: http://Stackoverflow.com/a/6350364/1025599 – Nachi

Antwort

1

diese Ressource Angenommen Weg

String resourceBundlePath = "my.package.bundles.messages" 

Im Paket mit my.package.bundles Sie messages.properties haben , messages_en_US.properties usw.

Dann mit

ResourceBundle resourceBundle = ResourceBundle.getBundle(resourceBundlePath); 
String messageKey = "myFirstMessage"; 
String message = resourceBundle.getMessage(messageKey); 

message den Wert der messageKey Eigenschaft auf messages.properties definiert enthalten. Wenn das aktuelle Gebietsschema tatsächlich ist, erhalten Sie den Wert von messages_en_US.properties. Wenn das aktuelle Gebietsschema haben etwas, das Sie nicht eine Eigenschaftsdatei für den Wert aus dem Standard sein messages.properties

Sie auch

ResourceBundle.getBundle(resourceBundlePath, myLocale); 

nennen kann, aber es ist in der Regel besser auf die Plattform Gebietsschema zu verwenden (haben ein Blick auf jvm Argumente -Duser.language, -Duser.country)

Sie eine Resource für jede enum Sie mit den Tasten den enum Elementnamen übersetzen und verwenden Sie es in der toString() Umsetzung Ihrer eNUM haben:

1

Ich würde Enum lassen wie es ist und verwenden Sie den Standard-Resource Ansatz http://docs.oracle.com/javase/tutorial/i18n/resbundle/concept.html Enum.toString als Schlüssel

+0

Vielen Dank für Ihre Antwort. Ich habe meiner Frage weitere Details hinzugefügt. Diese Zeichenfolge ist in strings.xml definiert. Und ich weiß nicht, wie ich es mit ResourceBundle machen kann. – VansFannel

+0

Nicht toString()! Verwenden Sie .name() –

-1
@Override 
public String toString() 
{ 
    //java 
    return ResourceBundle.getBundle().getString(id); 
    //android? 
    App.getContext().getString(id); 

} 
+0

Willkommen bei StackOverflow. Ihnen fehlen einige Dinge in Ihrer Antwort: ein beschreibender Text für den Leser, auch Ihr Code wird nicht funktionieren, weil die ID nicht deklariert ist. – RvdK

+0

oh danke. Werde versuchen, von nun an vorsichtig zu sein – Optional

6

Ich habe eine einfache Bibliothek, die ein Teil meines großen Projektes (Xdroid):

compile 'com.shamanland:xdroid-enum-format:0.2.4' 

Jetzt können Sie den gleichen Affen Job vermeiden (Feld erklärt, Konstruktor, etc.) für alle enumetations unter Verwendung Anmerkungen:

public enum State { 
    @EnumString(R.string.state_idle) 
    IDLE, 

    @EnumString(R.string.state_pending) 
    PENDING, 

    @EnumString(R.string.state_in_progress) 
    IN_PROGRESS, 

    @EnumString(R.string.state_cancelled) 
    CANCELLED, 

    @EnumString(R.string.state_done) 
    DONE; 
} 

Und dann den gemeinsamen Java-Ansatz verwenden - Verwendung Erweiterungen der Klasse java.text.Format:

public void onStateChanged(State state) { 
    EnumFormat enumFormat = EnumFormat.getInstance(); 
    toast(enumFormat.format(state)); 
} 

Saiten.xml

<string name="state_idle">Idle</string> 
<string name="state_pending">Pending</string> 
<string name="state_in_progress">In progress</string> 
<string name="state_cancelled">Cancelled</string> 
<string name="state_done">Done</string> 

Blick here wie Toast einfach zu zeigen.

Sie können auch eine Demo-App von github kompilieren.

Verwandte Themen