在 Android 学习的过程当中,常常须要针对某些项目来写一些测试的例子,或者在作一些 demo 的时候,都须要先写 Activity 而后注册。
若是里面有太多的跳转的话,还须要每一个跳转都增长一个事件。这些都是很是繁琐的步骤。那么如何省略这些步骤呢?java
有一种办法就是使用 Fragment,而后按照“约定大于配置”的原则,遍历安装包下符合条件的 Fragment 而后自动构建目录索引与跳转动做。
通俗来说,就是把 APK 里面的包结构文件当作树形结构的文件夹来处理,而后构建一个文件浏览器。固然,咱们构建的“类浏览器”。android
一个完整的实现请参考 https://github.com/xesam/AndroidQuickDemogit
PS:AndroidQuickDemo 同时增长了 Activity 的支持,可是因为 Android 系统的限制,Activity必须被注册,这一点是没法绕过去的。
固然,也可使用插件的原理,达到自动索引 Activity 的目的,不过,在个人实际使用中,当必定要使用 Activity 的时候,确定是为了使用或者探究 Activity 的直接效果,而不该该进行代理或者拦截。github
compile 'dev.xesam.android:quick-demo-creator:0.2.0'
如今支持两种模式:浏览器
这个方式只是使用一个列表简单列出全部的已注册 Activity,而后点击便可打开。app
用法:ide
QuickDemo.inflateActivity(activity, R.id.listview);
我的比较推荐这种用法,直接构建完整的“类浏览器”。学习
lib工程里面已经内置了一个 QuickDemoActivity,你只须要在你的 Android 项目中的 AndroidManifest.xml 中注册这个 Activity,并设置为 LAUNCHER Activity 便可测试
<activity android:name="dev.xesam.android.quickdemo.QuickDemoActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
若是你不想使用内置的 QuickDemoActivity,那么也能够在本身的 Activity 中来显示目录,只须要提供一个 container view id 就能够了,示例以下:ui
public class MyManActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); QuickDemo.inflateActivity(this, R.id.lv); } }
默认的目录索引只会显示当前 PackageName 下名称中包含 "demo 或者 sample 或者 example"的 Activity 或者 Fragment,
若是想按照本身的规则来定义过滤,能够自定义 QuickDemoFilter,一个示例以下:
public class CustomFilter implements QuickDemoFilter { Pattern target = Pattern.compile("demo|sample|example", Pattern.CASE_INSENSITIVE); String pkgName; public CustomFilter(Context context) { pkgName = context.getPackageName(); } @Override public boolean filter(String className) { String[] comps = className.split("\\."); String simpleClassName = comps[comps.length - 1]; return className.startsWith(pkgName) && target.matcher(simpleClassName).find() && simpleClassName.indexOf("$") == -1; } }
而后在对应的 Activity 中:
public class MyManActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); QuickDemo.inflateDemo(this, R.id.quick_demo_root, new CustomFilter(this)); } }