2017-02-16 12 views
0

У меня есть StringDef аннотированный интерфейсКак включить поле, аннотированное с @StringDef в Parcelable?

@StringDef({ 
    SpecialString.A, 
    SpecialString.B 
}) 
@Retention(RetentionPolicy.SOURCE) 
public @interface SpecialString { 
    String B = "BBB"; 
    String A = "AAA"; 
} 

, который я использую на поле в parcelable объекта

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); 
    } 

} 

Как я могу справиться с парцелляции строку аннотированный @StringDef, не прибегая к подавлению с //noinspection WrongConstant?

+1

Вы не можете записать фактическую строку в 'Parcel'. Вместо этого напишите что-нибудь еще (например, 'int'), которое вы используете, чтобы решить, какую из строк использовать при чтении в' Parcel' (например, через оператор 'switch'). Лично я бы просто жил с «noinspection». Существуют ограничения на изощренность этих видов чеков Lint. – CommonsWare

+0

Именно эта проблема привела меня к осознанию того, что я не получаю от этого большой выгоды, выбрав @StringDef, а не конечную статическую String. Есть ли какая-то конкретная причина, по которой вы решили использовать явно аннотированные строки? –

+0

Казалось, что это хороший способ обеспечить соблюдение только правильных значений, передаваемых в проект библиотеки, без использования перечисления. Я не думаю, что предложение noinspection слишком дорого, но я думал, что будет более чистое решение –

ответ

0

Поля StringDef поддерживаются Parcelable, но в настоящее время нет способа гарантировать, что считывание значения является одним из принятых значений.

Метод может быть проигнорирован в Android Studio, добавив комментарий noinspection WrongConstant

более безопасных альтернатив может использовать Enum и читать его с MyEnum.valueOf(readString) или как предложил CommonsWare, чтобы написать ИНТ порядковым или константу вместо String и выполните поиск, когда значение будет считано.