首頁  >  問答  >  主體

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

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

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

高洛峰高洛峰2744 天前629

全部回覆(8)我來回復

  • 阿神

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

    這個問題當然是怎麼方便怎麼來, 但是要考慮App目前的框架:

    1. 按樓上說的用回調.但注意因為回調放在了被靜態變量引用, 一般回調是匿名內部類, 可能會導致內存洩漏.

    2. 用事件匯流排. 也是實現中間層, 把結果經由事件匯流排傳過來.

    3. 推薦:
      既然是重構, 可以考慮讓所有的控制項都擁有取得onActivityResult結果的功能了. 定義一個介面,
      interface onActivityResult {

      boolean onResult();

      }
      需要監聽回呼的自訂控制項實作此介面. 在BaseActivity裡面, 記錄這些控制項, 當有結果回傳時傳給這些控制項:
      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;
              }
          }    
      }

      }
      這樣就完全解決了控制需要拿到Activity結果的問題了.

    以上為大概代碼, 實際上還有考慮: requestCode 重複問題, 要保存所有的View.

    回覆
    0
  • PHP中文网

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

    透過listener的形式處理就可以了。

    回覆
    0
  • 怪我咯

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

    上面的說的不錯 定義一個介面 用介面回調的方式來做 其他的通用的view 實作這個介面給就可以了

    回覆
    0
  • 大家讲道理

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

    我們的做法是把拍照和相簿寫成一個Module,然後給設定頭像的組件添加點擊事件,點擊跳到處理的介面,然後返回。 Module中不包含那個設定組件,由Module的使用者自己設定。
    還有一種做法就是樓上所說的透過事件監聽,選擇相簿圖片或是拍照確定圖片後,觸發這個listener。
    我建議你問問你老大,是否確定把那個入口View也寫在Module中

    回覆
    0
  • 伊谢尔伦

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

    搭建一個本地maven倉庫,把這個控件,彈窗,跳轉功能封裝好。然後直接上傳到本地maven倉庫,之後再透過Gradle依賴到專案去
    本地maven倉庫搭建,配置Gradle,上傳自己的library到倉庫內

    一般像一些基本功能的函式庫都可以這麼做,一個人維護即可

    回覆
    0
  • 迷茫

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

    使用 onActivityResult 没问题呀,哔哩哔哩就是这样处理的 boxing;
    不想让调用者处理 onActivityResult,可以写个中间 Activity 处理完 onActivityResult,將結果透過回呼傳給呼叫者;
    或自訂一個相機

    回覆
    0
  • 黄舟

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

    這類涉及到其他界面的邏輯我一般會寫個獨立的module,調用的時候使用接口,實現層用中間activity完成圖片的選取/處理,最後通過回調返回。
    這些東西你甚至都不用自己寫,GitHub上現成的輪子大把,隨便找一個ImagePicker用就行了。

    回覆
    0
  • 巴扎黑

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

    謝謝各位,這位回答基本上是我的意思。 我的問題沒說清楚,我重構不是想要打造通用頭像控件,我要的是:這個頭像view放到業務Activity的佈局中 ,然後調用者其他什麼都不需要做了。什麼網路請求更新頭像 上傳頭像 選照片...全部封裝好,而不是回調給他自己處理,因為我們公司這幾款app的 頭像相關接口是通用的

    回覆
    0
  • 取消回覆