7

列挙型はプリミティブ型ではないため、Android の aidl インターフェイスを介して列挙型を渡す最も効果的な方法は何ですか? 最初に列挙型を序数に変換する方法はありますか?

4

3 に答える 3

9

私は単に使用します

String enumString = myEnum.name() 

(MyEnum を enum として、myEnum を値として) 文字列表現を取得してから、

MyEnum myEnum = MyEnum.valueOf(enumString) 

文字列表現から列挙型を再構築します。

序数を使用すると少し高速になる可能性がありますが、後で列挙型を追加すると、古いコードが壊れる可能性が高くなります。

//編集: 戻り値の型として文字列を持ちたくないので、ここで述べたように Parcellable を実装しました:インテントを介して列挙型またはオブジェクトを渡す (最善の解決策)

android.os.Parcel をインポートします。android.os.Parcelable をインポートします。

enum InitResponse implements Parcelable {
// Everything is fine.
SUCCESS,
// Something else
FOO;


@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(final Parcel dest, final int flags) {
    dest.writeString(name());
}

public static final Creator<InitResponse> CREATOR = new Creator<InitResponse>() {
    @Override
    public InitResponse createFromParcel(final Parcel source) {
        return InitResponse.valueOf(source.readString());
    }

    @Override
    public InitResponse[] newArray(final int size) {
        return new InitResponse[size];
    }
};

}
于 2012-05-20T20:47:05.160 に答える
5

以外の非プリミティブ型にStringは、方向インジケータが必要です。方向指示器にはin、 、outおよびが含まれinoutます。

そのための公式ドキュメントを見てください:http://developer.android.com/guide/developing/tools/aidl.html#aidlsyntax

また、列挙型の文字列または序数表現を渡すことを検討し、必要に応じて元に戻すこともできます。これは、Effective Java 2nd edition からの抜粋です。

// Implementing a fromString method on an enum type
private static final Map<String, Operation> stringToEnum = new HashMap<String, Operation>();
static { // Initialize map from constant name to enum constant
    for (Operation op : values())
        stringToEnum.put(op.toString(), op);
} // Returns Operation for string, or null if string is invalid
public static Operation fromString(String symbol) {
    return stringToEnum.get(symbol);
}

上記の場合、Operationenumです。


列挙型の序数を取得するには、次の例を検討してください。

public enum Badges{
    GOLD, SILVER, BRONZE;
}

// somewhere else:
int ordinal = Badges.SILVER.ordinal();// this should be 1
于 2011-02-08T18:57:06.330 に答える