【Android】如何快速構建Android Demo

【Android】如何快速構建Android Demo

簡介

在 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'

使用方式

如今支持兩種模式:瀏覽器

1. 列出全部已經註冊的 Activity,點擊便可打開

這個方式只是使用一個列表簡單列出全部的已註冊 Activity,而後點擊便可打開。app

用法:ide

QuickDemo.inflateActivity(activity, R.id.listview);

2. 像文件管理器同樣,列出 app 的目錄索引

我的比較推薦這種用法,直接構建完整的「類瀏覽器」。學習

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));
    }
}

效果預覽

Screenshot_2015-08-12-23-36-42.png

Screenshot_2015-08-12-23-36-47.png

Screenshot_2015-08-12-23-36-53.png

Android分享 Q羣:315658668

相關文章
相關標籤/搜索