Maison  >  Questions et réponses  >  le corps du texte

java - android代码重构:如何把app设置里的头像UI做成通用的?

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

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

高洛峰高洛峰2744 Il y a quelques jours640

répondre à tous(8)je répondrai

  • 阿神

    阿神2017-04-18 10:49:49

    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.

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-18 10:49:49

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

    répondre
    0
  • 怪我咯

    怪我咯2017-04-18 10:49:49

    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.

    répondre
    0
  • 大家讲道理

    大家讲道理2017-04-18 10:49:49

    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

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:49:49

    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

    répondre
    0
  • 迷茫

    迷茫2017-04-18 10:49:49

    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 ;

    répondre
    0
  • 黄舟

    黄舟2017-04-18 10:49:49

    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.

    répondre
    0
  • 巴扎黑

    巴扎黑2017-04-18 10:49:49

    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

    répondre
    0
  • Annulerrépondre