17年2月份,写过一篇 Android开发小工具-摇一摇显示当前页面信息
,这个是当时根据项目里面出现的情况临时凑合上线使用的。这段时间回顾过来,觉得应该把这个坑好好填一下。
还是先说使用场景,当你的页面已经很多很多,开发迭代的程序员也来来去去换了好几波。这个时候,怎么快速定位到需要修改的页面呢?
当然,你全局搜索指定变量,通过变量拿到布局或者指定就找到对应写死的页面也是可行的。但是这个如果碰到重复使用的布局或者变量时,并不能做到一步到位。
那么,摇一摇,我觉得是最简单,效率最高的实现方式。一摇,当前 Activity 以及其包含的 Fragment 都一目了然,实际使用告诉我,这个功能开发调试使用起来真的不错。
基于上篇文章,这里对之前的代码做了进一步抽取和封装,进一步扩展一些方法。
WechatIMG291.jpeg
主要就三个类,ShakerHelper Shaker ShakerCallback。
一般使用方式
Application 中完成初始化,最简单的是:
ShakerHelper.init(true)
然后在BaseActivity中得到初始化Shaker,并绑定相关监听。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
shaker = ShakerHelper.instance(this);
}
@Override
protected void onResume() {
super.onResume();
shaker.onResume();
}
@Override
protected void onPause() {
super.onPause();
shaker.onStop();
}
到这里,最基本的使用就搞定啦,接下来说说对应支持的新功能。这些新功能都是在 ShakerCallback 里实现。
/**
* When you'd like to ignore some fragments to show in the shaker dialog, you should call this method.
*
* @return the ignore list of Fragment.
*/
@Nullable
List<Class> ignoreFragments();
/**
* If you don't want to some Activities have the shaker ability,you may call this method to add them to the
* disable list.
*
* @return the disable show shaker dialog Activities.
*/
@Nullable
List<Class> disableActivities();
/**
* If you'd like to have you own shaker dialog,you should call this method to add you layout resource id.
*
* @return the specified layout resource.
*/
@LayoutRes
int initHintViewLayout();
/**
* When your specified view is inflated to the dialog,this method will callback. so that you can dell with the
* views.
*
* @param dialog the shaker dialog
* @param view the view inflated by method {@link #initHintViewLayout()}
*/
void onHintViewInflated(DialogInterface dialog, View view);
/**
* When the Sensor result is changed,this method will callback.
*
* @param event the Sensor event
* @return return true if you want to show the shaker dialog, otherwise not.
*/
boolean onSenseChanged(SensorEvent event);
/**
* If you'd like to handle the shaker dialog content by yourself, you may need to add your
* {@link FragmentsHandler} and call this method to add to {@link ShakerHelper}
*
* @return yourself list of {@link FragmentsHandler}
*/
List<FragmentsHandler> fragmentHandlers();
/**
* When shaker dialog is dismiss,this method will callback,so that you can do something when the dialog is dismiss.
*
* @param context current Activity
* @param dialog current dialog
*/
void onDismiss(@NonNull Activity context, DialogInterface dialog);
每个方法都带有相关的解释,当然,让你把每个方法都实现一次也挺尴尬,所以这里有一个 DefaultShakerCallback ,默认全部方法都是空实现,然后只需要关心自己需要的方法就好。下面挑重点说下。
自定义UI
之前这一块并没有扩展出来,就是摇一摇功能太单一,比如我们在开发调试模式时还需要类似切换环境等功能,需要一个按钮时,就可以根据自己指定 UI 实现相关信息显示和对应环境切换。这里提供 initHintViewLayout() 和 onHintViewInflated() 两个方法,第一个是告诉ShakerHelper 你要使用指定的布局展示相关内容。 第二个方法是在View填充好之后返回给你,方便设置相关事件。
自定义过滤条件
之前写死过滤掉 Glide 自带的 Fragment,然后如果你自己也有一些「骚操作」也用到 Fragment ,并且不想让它显示在 Dialog 里,那么你可以指定这个过滤条件。ignoreFragments() 就是用来指定相关需要过滤的 Fragment。
另外还有一些 Activity ,可能你并不希望它有摇一摇功能,但是,我们初始化当然是放在 BaseActivity 里,这时候你可以过滤一些 Activity。disableActivities() 同理就是用来过滤这些 Activity。
摇一摇触发条件
Shaker 中默认是去判断 X 轴加速度相关的变化,如果你想通过 Y 轴或者 Z 轴或者自己的组合逻辑来触发弹窗展示,这里也给你提供相关方法,方便你实现相关功能。onSenseChanged() 将相关 SensorEvent 事件传递给你,你可以自己觉得是否触发弹窗。
自定义展示格式和展示逻辑
如果我写这一套你觉得不太好,比如你不喜欢 > 这符号,没关系,这里你可以自定义 FragmentsHandler 的实现类,自己实现相关功能。FragmentsHandler 其实就两个方法,canHandleFragment() 和 handleFragment() ,当 canHandleFragment() 返回 true 之后,handleFragment()才能被执行。
说到这里,新功能说的差不多了,目前我已经写好 SupportFragment 的 FragmentsHandler ,但是对于 Fragment ,这个对应的 FragmentsHandler 还没有实现,因为里面有使用到 FragmentManager 的 getFragments() 方法,但是在 Fragment 中,这个方法要 O 才开始支持。所以,目前只支持support 包 Fragment,当然,你可以自己完成相关 FragmentsHandler 实现相关拓展。
PS : 昨天 微软已经正式把 GitHub 给收购~~~
---- Edit By Joe At 2018 06 05 ----








网友评论