公司几款app设置界面都有用户头像,功能一样:网络请求获取头像更新,点击头像弹出:拍照or相册,选择照片更新头像。
现在都是写在各自项目中,大量重复代码,现在需要重构,老大说把这个View写成通用控件(不是整个界面),但是点击View进入拍照或者相册,选择返回照片是在Activity的onActivityResult里处理,我在View里面无法重写这个方法啊 怎么弄???
阿神2017-04-18 10:49:49
這個問題當然是怎麼方便怎麼來, 但是要考慮App目前的框架:
按樓上說的用回調.但注意因為回調放在了被靜態變量引用, 一般回調是匿名內部類, 可能會導致內存洩漏.
用事件匯流排. 也是實現中間層, 把結果經由事件匯流排傳過來.
推薦:
既然是重構, 可以考慮讓所有的控制項都擁有取得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.
大家讲道理2017-04-18 10:49:49
我們的做法是把拍照和相簿寫成一個Module,然後給設定頭像的組件添加點擊事件,點擊跳到處理的介面,然後返回。 Module中不包含那個設定組件,由Module的使用者自己設定。
還有一種做法就是樓上所說的透過事件監聽,選擇相簿圖片或是拍照確定圖片後,觸發這個listener。
我建議你問問你老大,是否確定把那個入口View也寫在Module中
伊谢尔伦2017-04-18 10:49:49
搭建一個本地maven倉庫,把這個控件,彈窗,跳轉功能封裝好。然後直接上傳到本地maven倉庫,之後再透過Gradle依賴到專案去
本地maven倉庫搭建,配置Gradle,上傳自己的library到倉庫內
一般像一些基本功能的函式庫都可以這麼做,一個人維護即可
迷茫2017-04-18 10:49:49
使用 onActivityResult
没问题呀,哔哩哔哩就是这样处理的 boxing;
不想让调用者处理 onActivityResult
,可以写个中间 Activity
处理完 onActivityResult
,將結果透過回呼傳給呼叫者;
或自訂一個相機
黄舟2017-04-18 10:49:49
這類涉及到其他界面的邏輯我一般會寫個獨立的module,調用的時候使用接口,實現層用中間activity完成圖片的選取/處理,最後通過回調返回。
這些東西你甚至都不用自己寫,GitHub上現成的輪子大把,隨便找一個ImagePicker用就行了。
巴扎黑2017-04-18 10:49:49
謝謝各位,這位回答基本上是我的意思。 我的問題沒說清楚,我重構不是想要打造通用頭像控件,我要的是:這個頭像view放到業務Activity的佈局中 ,然後調用者其他什麼都不需要做了。什麼網路請求更新頭像 上傳頭像 選照片...全部封裝好,而不是回調給他自己處理,因為我們公司這幾款app的 頭像相關接口是通用的