C'est difficile de définir des données dans Bundle ... Surtout la définition de la chaîne de clé est super gênante ... Pour être honnête, Serialize et Parcelable sont ennuyeux ...
Plus précisément, ça ressemble à ça ↓ ↓ ↓ travail ... C'est ennuyeux ...
Travailler pour emballer les valeurs dans Bundle
final Bundle args = new Bundle();
args.putInt("key_id", value.getId());
args.putString("key_tag", value.getTag());
args.putBoolean("key_enabled", value.isEnabled());
Fragment de valeurs de 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");
Je veux créer automatiquement une classe qui peut récupérer une valeur d'un Bundle qui la change en Bundle simplement en ajoutant une annotation comme AutoValue. Plus précisément, je souhaite utiliser l '«Outil de traitement des annotations» pour générer automatiquement une classe qui répond aux exigences suivantes.
Échantillon (classe de modèle)
@BundleGenerator //Spécifiez la classe
public class Sample {
private final int mId;
public Sample(int id) {
mId = id;
}
@BundleSet //Spécifiez une valeur
public int getId() { return mId; }
}
Les classes suivantes sont automatiquement générées par build.
SampleBundleGenerator (classe générée automatiquement)
//Nom de la classe de données+Généré automatiquement par BundleGenerator
public class SampleBundleGenerator {
//Méthode de conversion du modèle en 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;
}
//Méthode pour récupérer la valeur de 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");
}
}
}
Définir les données dans Bundle
Bundle bundle = SampleBundleGenerator.bundle(value);
Récupérer les valeurs du bundle
SampleBundleGenerator.Wrapper sample = SampleBundleGenerator.restore(getArguments());
Cliquez ici pour le résultat de sa mise en œuvre pour le moment → github: BundleGenerator
Les détails sont publiés dans d'autres articles, de sorte que seul le flux général est présenté.
(1) Créer un nouveau projet avec Android Studio (comme créer une application normalement)
(2) Ajout de "java library" dans un nouveau module (il est facile de comprendre si le nom du module est processor)
(3) Créez une classe qui hérite de AbstractProcessor côté bibliothèque et une classe d'annotations que vous souhaitez utiliser (dans la classe Processor, trouvez l'élément qui a été annoté au moment de la compilation et générez automatiquement la classe que vous souhaitez réaliser)
@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) {
//Générez une classe ici
//A partir de l'argument roundEnv, extrayez l'élément correspondant à l'annotation souhaitée et utilisez ces informations pour générer une classe.
//Créer des classes est très facile avec une bibliothèque appelée JavaPoet
}
}
(4) Définissez le point d'entrée du processeur afin que javac puisse être accroché. Créez un fichier appelé javax.annotation.processing.Processor ci-dessous et décrivez le nom de classe du processeur d'annotation créé (abj.bundlegenerator.processor.BundleGeneratorProcessor ci-dessus)
(5) Définissez la bibliothèque du côté du module que vous souhaitez utiliser
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
Recommended Posts