公司几款app设置界面都有用户头像,功能一样:网络请求获取头像更新,点击头像弹出:拍照or相册,选择照片更新头像。
现在都是写在各自项目中,大量重复代码,现在需要重构,老大说把这个View写成通用控件(不是整个界面),但是点击View进入拍照或者相册,选择返回照片是在Activity的onActivityResult里处理,我在View里面无法重写这个方法啊 怎么弄???
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
这个问题当然是怎么方便怎么来, 但是要考虑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.
通过listener的形式处理就可以了。
上面的说的不错 定义一个接口 用接口回调的方式来做 其他的通用的view 实现这个接口给就可以了
我们的做法是把拍照和相册写成一个Module,然后给设置头像的组件添加点击事件,点击跳转到处理的界面,然后返回。Module中不包含那个设置组件,由Module的使用者自己设置。还有一种做法就是楼上所说的通过事件监听,选择相册图片或者拍照确定图片后,触发这个listener。我建议你问问你老大,是否确定把那个入口View也写在Module中
搭建一个本地maven仓库,把这个控件,弹窗,跳转功能封装好。然后直接上传到本地maven仓库,之后再通过Gradle依赖到项目里去本地maven仓库搭建,配置Gradle,上传自己的library到仓库内
一般像一些基础功能的库都可以这么做,一个人维护即可
使用 onActivityResult 没问题呀,哔哩哔哩就是这样处理的 boxing;不想让调用者处理 onActivityResult,可以写个中间 Activity 处理完 onActivityResult,将结果通过回调传给调用者;或者自定义一个相机
onActivityResult
Activity
这类涉及到其他界面的逻辑我一般会写个独立的module,调用的时候使用接口,实现层用中间activity完成图片的选取/处理,最后通过回调返回。这些东西你甚至都不用自己写,GitHub上现成的轮子大把,随便找一个ImagePicker用就行了。
谢谢各位,这位回答基本是我的意思。 我的问题没说清楚,我重构不是想要打造通用头像控件,我要的是:这个头像view放到业务Activity的布局中 ,然后调用者其他什么都不需要做了。什么网络请求更新头像 上传头像 选照片...全部封装好,而不是回调给他自己处理,因为我们公司这几款app的 头像相关接口是通用的
这个问题当然是怎么方便怎么来, 但是要考虑App目前的框架:
按楼上说的用回调.但注意因为回调放在了被静态变量引用, 一般回调是匿名内部类, 可能会导致内存泄漏.
用事件总线. 也是实现中间层, 把结果通过事件总线传过来.
推荐:
既然是重构, 可以考虑让所有的控件都拥有获取onActivityResult结果的功能了. 定义一个接口,
interface onActivityResult {
}
需要监听回调的自定义控件实现该接口. 在BaseActivity里面, 记录这些控件, 当有结果返回时传给这些控件:
class BaseActivity {
}
这样就完全解决了控件需要拿到Activity结果的问题了.
以上为大概代码, 实际上还有考虑: requestCode 重复问题, 要保存所有的View.
通过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的 头像相关接口是通用的