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 ----
网友评论