Je développe une application à Kotlin qui a de nombreuses activités Pour faciliter la facilité et un petit nitre, j'ai créé des objets de compagnon pour les activités d'autres classes peut simplement appeler La fonction est assez basique et La seule différence entre la mise en œuvre dans différentes activités est évidemment le Maintenant, je comprends que je pouvais faire quelque chose comme ça: P> < P> Je définis un objet qui a une fonction avec un type générique et la configurez-la comme ceci: p> mais cela semble toujours un peu hacky. Ce que je cherche, c'est quelque chose comme l'héritage ou une version implémentée d'une interface pour simplement ajouter à mon objet compagnon. Quelque chose comme: p> ou p> La première option serait particulièrement utile, car elle configurait automatiquement plusieurs fonctions de code>. La majeure partie de la navigation est simplement basique, en commençant la nouvelle activité, ne rien transmettre à l'intention. Pour quelques groupes d'activités, je pourrais passer des drapeaux, qui est également répétitif tout au long de mon projet (par exemple 5 activités qui définissent inent.flags = intent.flag_activity_clear_task ou inent.flag_activity_new_task code>). Donc, si je pouvais trouver un moyen de faire valoir qu'une seule implémentation ferait des choses un peu plus agréables. code> qui maintiennent le Fonction suivante: p> myactivit.startactivité (contexte) code>. p> Myactivity :: Class.java Code> -Part. Donc, j'aime savoir si c'est possible de déclarer cette fonction une seule fois et utilisez-la dans plusieurs objets compagnons pour les différentes activités. P> myObject code> pour myactivité code>. Est quelque chose comme ça même possible? P> P>
3 Réponses :
Vous n'avez même pas besoin d'un compagnon, juste une fonction d'extension.
inline fun <reified T: AppCompatActivity> Activity.startActivity(intentConfiguration: Intent.() -> Unit) {
startActivity(Intent(this, T::class.java).apply(intentConfiguration))
}
Vous n'avez pas besoin d'une instance d'une classe pour appeler une fonction d'extension dessus?
Je viens de remarquer que j'ai une fois même implémenté une fonction similaire à celle-ci, il suffit de passer la classe comme un paramètre normal de type kclass <*> et a donné l'extension au contexte au lieu de l'activité pour faire des vues capables de les appeler sans casser. Mais la Lambda est une belle addition ici. Bonne réponse!! La seule question qui reste maintenant est celle de celles-ci est une meilleure performance sage. Compagnon ou extension.
Les objets de compagnon peuvent hériter d'autres classes. Il suffit de faire une implémentation de base quelque part: et héritez-y dans vos compagnons: p> C'est un peu verbeux mais c'est juste comment les génériques travail. p> p>
C'est ce que je cherchais. Explication rapide Pourquoi j'ai choisi cette réponse sur (l'autre) [( Stackoverflow.com/a/63376412/4687402)], même si cela fait presque la même chose et les deux sont plutôt bons. Certaines activités nécessitent des valeurs passées à travers l'intention et la mise en œuvre que dans une fonction d'objet compagnon avec un paranéré supplémentaire et la masquage des balises est simplement plus propre. Ainsi, l'utilisation de cette approche rendrait l'ensemble du projet plus uniforme, dans la mesure où toutes les activités peuvent être appelées à partir d'une fonction statique startactivité code> avec tous les paramètres nécessaires.
En outre, Ajout rapide: la classe ne doit pas être abstraite, il peut simplement être ouvert code>.
Bien sûr, vous pouvez le faire ouvrir, mais s'il est fait spécifiquement hérité d'être hérité des objets de compagnon, quel est le but de l'instancier directement?
Bon point. Je viens d'y aller parce que c'est la "valeur par défaut" lors de l'utilisation de Java. Vous devez finaliser une classe là-bas pour obtenir ce qui est une classe par défaut à Kotlin. Mais oui, si ce n'est pas instancié directement, il n'y a aucune utilité pour cela.
J'ai posé une autre question, parce que je n'étais pas très satisfait de la façon dont cette solution a l'air. Bien que sa bonne solution, il y a un moyen facile de le rendre même nitre
Voulez-vous simplement indiquer qu'une syntaxe plus concise serait de le faire avec une fonction d'extension de révision sur contexte code>. Et vous n'avez pas besoin de vous inquiéter des objets de compagnon non plus. inline fun <reified T: Activity> Context.startActivity() =
startActivity(Intent(this, T::class.java))
//Usage:
someViewOrActivity.startActivity<MyActivity>()