2017-02-16 4 views
0

は私がStringDef注釈付きインタフェース@StringDefで注釈を付けたフィールドをParcelableに含めるにはどうしたらいいですか?

私はparcelableオブジェクトのフィールドに使用
@StringDef({ 
    SpecialString.A, 
    SpecialString.B 
}) 
@Retention(RetentionPolicy.SOURCE) 
public @interface SpecialString { 
    String B = "BBB"; 
    String A = "AAA"; 
} 

public class MyParcelable implements Parcelable { 

    private final @SpecialString String mType; 

    protected MyParcelable (Parcel in) { 
     //Android studio shows an error for this line declaring 
     //"Must be one of SpecialString.A, SpecialString.B" 
     mType = in.readString(); 
    } 

    ... 

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

} 

にはどうすれば//noinspection WrongConstantで抑制に頼ることなく@StringDefによる注釈付き文字列を個別の処理することができますか?

+1

実際の文字列を 'Parcel'に書き込むことができませんでした。代わりに、 'Parcel'で読み込むときにどの文字列を使うか(例えば、' switch'ステートメントを介して)を決めるのに使う他のもの(例えば 'int')を書いてください。個人的には、私はちょうど 'noinspection'で生きています。これらの種類のリントチェックの洗練には限界があります。 – CommonsWare

+0

最終的な静的Stringではなく@StringDefを使用することを選択することで、それほど利益をあげていないことに気づいたのと同じ問題でした。明示的に注釈付きの文字列を使用する理由は何ですか? –

+0

列挙型を使わずに、正しい値だけをライブラリプロジェクトに渡すようにするのは良い方法のようです。私はnoinspection節はあまりにも多くのコストだとは思わないが、よりクリーンな解決策があると思った –

答えて

0

StringDefフィールドはParcelableでサポートされていますが、現時点では値の確認は受け入れられる値の1つです。

方法は安全noinspection WrongConstant

より安全な代替がCommonsWareが示唆されているように代わりのint型序や定数を書くために、列挙型を使用し、MyEnum.valueOf(readString)でそれを読んだりすることであってもよいコメントを追加することにより、Androidのメーカーでは無視することができます文字列を読み込み、値が読み込まれるときに参照を行います。

関連する問題