java - android代码重构:如何把app设置里的头像UI做成通用的?
高洛峰
高洛峰 2017-04-18 10:47:49
0
8
709

公司几款app设置界面都有用户头像,功能一样:网络请求获取头像更新,点击头像弹出:拍照or相册,选择照片更新头像。

现在都是写在各自项目中,大量重复代码,现在需要重构,老大说把这个View写成通用控件(不是整个界面),但是点击View进入拍照或者相册,选择返回照片是在Activity的onActivityResult里处理,我在View里面无法重写这个方法啊 怎么弄???

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

répondre à tous(8)
阿神

Bien sûr, cette question concerne la commodité, mais le cadre actuel de l'application doit être pris en compte :

  1. Utilisez les rappels comme mentionné ci-dessus. Mais notez que, comme les rappels sont référencés par des variables statiques, les rappels sont généralement des classes internes anonymes, ce qui peut provoquer des fuites de mémoire.

  2. Utilisez le bus d'événements. Il implémente également la couche intermédiaire et transmet les résultats via le bus d'événements.

  3. Recommandation :
    Puisqu'il s'agit d'un refactoring, vous pouvez envisager de permettre à tous les contrôles d'avoir pour fonction d'obtenir des résultats onActivityResult,
    interface onActivityResult {

    .
    boolean onResult();

    >
    Les contrôles personnalisés qui doivent écouter les rappels implémentent cette interface. Dans BaseActivity, enregistrez ces contrôles et transmettez-les à ces contrôles lorsque les résultats sont renvoyés :
    class BaseActivity {

    List<onActivityResult> resultViewList = new ArrayList();
    void onCreate() {
        ResultView view = ...;
        resultViewList.add(view);
    }
    
    onActivityResult() {
        for (onActivityResult view : resultViewList) {
            boolean ret = view.onResult();
            if (ret) {
                break;
            }
        }    
    }

    >
    Cela résout complètement le problème dont le contrôle a besoin pour obtenir le résultat de l'activité.

Ce qui précède est un code approximatif, mais il y a en fait d'autres considérations : le problème des requêtes répétées, toutes les vues doivent être enregistrées.

Ty80

Gérez-le simplement sous la forme d'un auditeur.

刘奇

Ce que vous avez dit ci-dessus est bon. Définissez une interface et utilisez les rappels d'interface pour le faire. Pour d'autres vues courantes, implémentez simplement cette interface.

大家讲道理

Notre approche consiste à écrire la prise de photo et l'album photo en tant que module, puis à ajouter un événement de clic au composant qui définit l'avatar, à cliquer pour accéder à l'interface de traitement, puis à revenir. Le composant de configuration n'est pas inclus dans le module et est défini par l'utilisateur du module.
Une autre façon consiste à utiliser la surveillance des événements comme mentionné ci-dessus. Après avoir sélectionné la photo de l'album ou pris une photo pour confirmer la photo, déclenchez cet auditeur.
Je vous propose de demander à votre patron si vous êtes sûr d'écrire la Vue d'entrée dans le Module

伊谢尔伦

Créez un entrepôt maven local et encapsulez les fonctions de contrôle, de fenêtre contextuelle et de saut. Ensuite, téléchargez-le directement dans l'entrepôt maven local, puis dépendez-en pour le projet via Gradle
Construisez l'entrepôt maven local, configurez Gradle et téléchargez votre propre bibliothèque sur l'entrepôt

Généralement, cela peut être fait pour les bibliothèques avec quelques fonctions de base, et une seule personne peut en assurer la maintenance

迷茫

Utiliser onActivityResult n'est pas un problème, c'est ainsi que Bilibili gère la boxe
Si vous ne voulez pas que l'appelant traite onActivityResult, vous pouvez écrire un intermédiaire Activity et après le traitement onActivityResult, transmettre le résultat via le rappel Transmettez-le à l'appelant
ou personnalisez une caméra ;

黄舟

Pour ce type de logique qui implique d'autres interfaces, j'écris généralement un module séparé. Lors de l'appel, j'utilise l'interface qui utilise une activité intermédiaire pour terminer la sélection/le traitement des images, et revient finalement via un rappel. .
Vous n'avez même pas besoin d'écrire ces choses vous-même, il existe de nombreuses roues prêtes à l'emploi sur GitHub, il suffit de trouver un ImagePicker et de l'utiliser.

巴扎黑

Merci à tous, cette réponse correspond essentiellement à ce que je voulais dire. Ma question n'est pas claire. Ma refactorisation n'est pas de créer un contrôle d'avatar universel. Ce que je veux, c'est mettre cette vue d'avatar dans la présentation de l'activité commerciale, et l'appelant n'a alors rien d'autre à faire. Quel réseau demande de mettre à jour l'avatar, de télécharger l'avatar, de sélectionner la photo... tout est encapsulé, au lieu de lui rappeler pour le gérer lui-même, car les interfaces liées à l'avatar de ces applications dans notre entreprise sont courantes

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal