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

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

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

高洛峰
高洛峰

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

全部回覆(8)
阿神

這個問題當然是怎麼方便怎麼來, 但是要考慮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.

Ty80

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

刘奇

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

大家讲道理

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

伊谢尔伦

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

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

迷茫

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

黄舟

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

巴扎黑

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

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板