Es ist schwierig, Daten in Bundle festzulegen ... Besonders die Definition der Schlüsselzeichenfolge ist sehr mühsam ... Um ehrlich zu sein, nerven Serialize und Parcelable ...
Insbesondere sieht es so aus ↓ ↓ ↓ Arbeit ... Es ist ärgerlich ...
Arbeiten Sie daran, Werte in Bundle zu packen
final Bundle args = new Bundle();
args.putInt("key_id", value.getId());
args.putString("key_tag", value.getTag());
args.putBoolean("key_enabled", value.isEnabled());
Fragment von Werten aus Bundle
final Bundle args = getArguments();
final int id = args.getInt("key_id");
final String tag = args.getString("key_tag");
final boolean isEnabled = args.getBoolean("key_enabled");
Ich möchte automatisch eine Klasse erstellen, die einen Wert aus einem Bundle abrufen kann, der ihn in ein Bundle ändert, indem einfach eine Anmerkung wie AutoValue hinzugefügt wird. Insbesondere möchte ich das "Annotation Processsing Tool" verwenden, um automatisch eine Klasse zu generieren, die die folgenden Anforderungen erfüllt.
--Automatische Klasse wird beim Erstellen generiert, indem der Wert, den Sie in der Datenklasse speichern möchten, mit Anmerkungen versehen wird
Probe (Modellklasse)
@BundleGenerator //Geben Sie die Klasse an
public class Sample {
private final int mId;
public Sample(int id) {
mId = id;
}
@BundleSet //Geben Sie einen Wert an
public int getId() { return mId; }
}
Die folgenden Klassen werden automatisch vom Build generiert.
SampleBundleGenerator (automatisch generierte Klasse)
//Name der Datenklasse+Wird automatisch von BundleGenerator generiert
public class SampleBundleGenerator {
//Methode zum Konvertieren des Modells in ein Bundle
@NonNull
public static Bundle bundle(@NonNull Sample target) {
return bundle(target, new Bundle());
}
@NonNull
public static Bundle bundle(@NonNull Sample target, @NonNull Bundle bundle) {
bundle.putInt("xxx.xxx.Sample_getId", target.getId());
return bundle;
}
//Methode zum Abrufen des Werts aus dem Bundle
@NonNull
public static Wrapper restore(@NonNull Bundle bundle) {
return new Wrapper(bundle);
}
public static class Wrapper {
final Bundle mBundle;
BundleWrapper(@NonNull Bundle bundle) {
mBundle = bundle;
}
public int getId() {
return mBundle.getInt("xxx.xxx.Sample_getId");
}
}
}
Daten im Bundle einstellen
Bundle bundle = SampleBundleGenerator.bundle(value);
Werte aus dem Bundle abrufen
SampleBundleGenerator.Wrapper sample = SampleBundleGenerator.restore(getArguments());
Klicken Sie hier, um das Ergebnis der vorläufigen Implementierung anzuzeigen → github: BundleGenerator
Details werden in anderen Artikeln veröffentlicht, sodass nur der allgemeine Ablauf vorgestellt wird.
(1) Erstellen Sie ein neues Projekt mit Android Studio (wie beim normalen Erstellen einer App).
(2) "Java-Bibliothek" in einem neuen Modul hinzugefügt (es ist leicht zu verstehen, ob der Modulname Prozessor ist)
(3) Erstellen Sie eine Klasse, die AbstractProcessor auf der Bibliotheksseite erbt, und eine Klasse von Anmerkungen, die Sie verwenden möchten (suchen Sie in der Processor-Klasse das Element, das zur Kompilierungszeit mit Anmerkungen versehen wurde, und generieren Sie automatisch die Klasse, die Sie realisieren möchten).
@SupportedAnnotationTypes({
"abj.bundlegenerator.processor.BundleGenerator",
"abj.bundlegenerator.processor.BundleSet"})
@SupportedSourceVersion(SourceVersion.RELEASE_7)
public class BundleGeneratorProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
//Generieren Sie hier eine Klasse
//Extrahieren Sie aus dem Argument roundEnv das Element, das der gewünschten Anmerkung entspricht, und verwenden Sie diese Informationen, um eine Klasse zu generieren.
//Das Erstellen von Klassen ist mit einer Bibliothek namens JavaPoet sehr einfach
}
}
(4) Definieren Sie den Einstiegspunkt des Prozessors, damit Javac angeschlossen werden kann. Erstellen Sie unten eine Datei mit dem Namen javax.annotation.processing.Processor und beschreiben Sie den Klassennamen des erstellten Annotationsprozessors (abj.bundlegenerator.processor.BundleGeneratorProcessor oben).
(5) Definieren Sie die Bibliothek auf der Modulseite, die Sie verwenden möchten
build.gradle
dependencies {
implementation project(':processor')
annotationProcessor project(':processor')
}
https://qiita.com/LyricalMaestro0/items/9a4e3ec3ea7bda9ee523 https://qiita.com/opengl-8080/items/beda51fe4f23750c33e9 https://qiita.com/shiraji/items/ed674c5883ed0520791b