Ein solcher Fall ist ein int von einem Bundle zu lesen und sie in die Variable beschränkt durch @IndDef Anmerkung zu speichern:Wie deaktiviere ich Android @IntDef-Annotationsprüfungen in besonderen Fällen?
public class MainActivity extends ActionBarActivity {
@IntDef({STATE_IDLE, STATE_PLAYING, STATE_RECORDING})
@Retention(RetentionPolicy.SOURCE)
public @interface State {}
public static final int STATE_IDLE = 0;
public static final int STATE_PLAYING = 1;
public static final int STATE_RECORDING = 2;
@MainActivity.State int fPlayerState = STATE_IDLE;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null)
fPlayerState = savedInstanceState.getInt(BUNDLE_STATE); //Causes "Must be one of: ..." error
Es muss eine Möglichkeit vorhanden sein, die Überprüfung zu unterdrücken oder von int nach @ Gießen MainActivity.State int um die Variable in der letzten Zeile zu setzen. Der andere Fall besteht darin, einen negativen Test zu schreiben, der eine Funktion mit einem annotierten Parameter aufruft, der absichtlich den falschen Parameter übergibt, um zu testen, dass in einem solchen Fall die Ausnahme ausgelöst wird. Es muss eine Möglichkeit geben, die Annotationsprüfung zu unterdrücken, um einen solchen Test zu kompilieren.
Wäre das nicht eine Art sichere Art und Weise sein, einen '@ IntDef' wieder aus einem Bündel zu bekommen einen Schalter auf, es zu tun und die Endergebnis zuweisen basierend auf den Werten? z.B. "' state = getInt(); switch (state) Fall 1: fState = STATE_IDLE ... '" Der Nachteil ist, dass es die Verifikation von der Kompilierzeit zur Laufzeit verschiebt, was der ganze Punkt von '@ IntDef' war beginnen mit. (Das Ergebnis ist auch nicht besonders wartbar, wenn Sie häufig Werte hinzufügen.) Sie können auch eine sekundäre Nachschlagetabelle erstellen, um das Ergebnis von "Enum.values ()" nachzuahmen. – lilbyrdie