BaseFramework 究竟是什么(BaseFramework 全解析)

BaseFramework 究竟是什么?

Github: https://github.com/kongzue/BaseFramework

BaseFramework 本質(zhì)上就是一個對 Activity田巴、Fragment力细、Adapter 等 Android 標(biāo)準(zhǔn)組件的一次封裝,而我對這些組件進行封裝的根本意義來源于對快速敏捷開發(fā)固额、高效管理的追求。

就像大家所知道的煞聪,Android 開發(fā)中總有很多令人頭痛而官方未進行解決的問題斗躏,而這些問題都讓我們在進行一次新項目的開始鋪設(shè)時總要集成大量的工具類來輔助我們進行新工程的構(gòu)架,類似于響應(yīng)式適配、吐司提示啄糙、乃至于界面間跳轉(zhuǎn)笛臣,都有很多令人詬病的地方,簡單的來說隧饼,就是他們并不夠好用沈堡。

真正好用的代碼絕對是一句話能干完的事情絕對不拖泥帶水的 BB 好幾句,接下來我就從以下幾個方面為大家介紹 BaseFramework 所做的一些努力燕雁。

舉例

①我是一句簡單的吐司

 Toast.makeText(MainActivity.this, "你好!", Toast.LENGTH_SHORT).show();

你看诞丽,他至少包含了以下幾個不好用的地方:

  1. 是否有在主線程運行?你得自己加判斷拐格;
  2. 語句繁瑣僧免,在 Activity 中使用的話為什么還需要傳 Context?自己 this 一下不好么捏浊?
  3. 繁瑣+1懂衩,我們多半需要的簡單提示都是短時間 LENGTH_SHORT 的,而非 LENGTH_LONG 的金踪,能否默認一個 LENGTH_SHORT 而不要每次都要輸入一遍時間參數(shù)浊洞?
  4. 新手總忘記 .show();

那么,這么一個吐司提示就這么復(fù)雜胡岔,每次在進行開發(fā)需要使用到 Toast 的時候總要輸入這么一大段的話法希,十分繁瑣,而我在 BaseFramework 的 BaseActivity 和 BaseFragment 等 UI 相關(guān)的封裝類中都對 Toast 進行了精簡姐军,現(xiàn)在要顯示一個簡單的 Toast 你只需要:

 toast("你好!");

是不是簡單的多了呢铁材?

②我是一個日志

是否我們都有一個相同的需求,當(dāng) App 被編譯為 Release 的時候我們需要把 Log 全部關(guān)閉奕锌?而每次調(diào)用 Log 的時候都需要使用 .i 著觉、.e、 .d這些類型以及要設(shè)定 Tag 令人感到繁瑣惊暴,我的日志能否用一句話完成饼丘?

來看看 BaseFramework 的 BaseActivity 和 BaseFragment 中如何快速的打一個日志吧?

 log("你好!");

就是這么簡單辽话。你還可以通過 BaseActivity 提供的總開關(guān):BaseActivity.DEBUGMODE 來直接控制它是否可用肄鸽,我們建議直接在您的 Application 初始化時將其與您的項目的編譯模式進行綁定:

BaseActivity.DEBUGMODE = BuildConfig.DEBUG;

這樣在編譯為 Release 版本時就不會忘記關(guān)閉 log 輸出了。

思想

你也許會說 BaseFramework 不就是把一些工具類的方法封裝到了其中來使用嘛油啤,雖然我就簡單的舉了兩個例子典徘,但 BaseFramework 可不僅僅如此,它其中除了帶有一些簡單的益咬,諸如 toast逮诲、log 這樣的工具類,還包含有響應(yīng)式適配、權(quán)限管理與申請梅鹦、字符串判空裆甩、高級跳轉(zhuǎn)與回傳、大到 Application 中所有 Activity 的生命周期管理齐唆、集成式屬性工具類等嗤栓,應(yīng)有盡有,這些東西都是我們在日常開發(fā)實戰(zhàn)中的總結(jié)箍邮,他可能帶有一定的個人編程思想和習(xí)慣茉帅,但絕對不失為一個相當(dāng)好用的開發(fā)工具。

BaseFramework

你還可以下載 Demo 來體驗這個項目:


BaseFramework Demo

我們的努力

上述簡單的介紹了兩個工具在 BaseFramework 框架中的簡化使用媒殉,可能看起來十分簡單担敌,但從我們一步步的簡化過程中就能使我們的項目和構(gòu)建變得更加高效,接下來我還會在這里介紹一些 BaseFramework 中更深層次的思想和行為廷蓉,以幫助你更好地理解 BaseFramework 所能做的事全封,以及提升開發(fā)效率。

③ BaseActivity

  1. 約定

首先桃犬,我們使用了約定關(guān)鍵詞 “me” 來代替 XXXActivity.this刹悴,只要你的 Activity 繼承了 com.kongzue.baseframework.BaseActivity 那么在你的 Activity 生命周期中,你可以在任何需要傳入 Context 的地方直接傳 “me”攒暇,而無需再繁瑣的使用 XXXActivity.this土匀。

當(dāng)你將自己的 Activity 繼承了 com.kongzue.baseframework.BaseActivity 后你會發(fā)現(xiàn),系統(tǒng)會強制你重寫三個方法:

@Override
public void initViews() {
    //此處用于綁定組件(findViewById)
}

@Override
public void initDatas(JumpParameter parameter) {
    //此處用于加載數(shù)據(jù)形用,JumpParameter 的作用后邊會有講到
}

@Override
public void setEvents() {
    //此處用于編寫組件事件
}

之所以這么做就轧,就是為了將我們的代碼規(guī)范化,一般一個 Activity 啟動后需要執(zhí)行的三步流程即是如此田度,按照相應(yīng)的規(guī)范行事能夠減少很多錯誤妒御,提升程序的可靠性。

  1. 使用注解構(gòu)建模式

可能有人注意到了镇饺,onCreate 方法在這里不再推薦重寫使用乎莉,您可以直接在您的 Acttivity 上使用注解完成 Layout 的綁定:

@Layout(R.layout.activity_adapter_test)
public class AdapterTestActivity extends BaseActivity {
    //...
}

之所以這么做,也是方便當(dāng)我們的工程開發(fā)到后期時奸笤,避免當(dāng)代碼復(fù)雜繁亂的時惋啃,想在其中確定 onCreate 的位置以及尋找 Activity 界面布局 layout 的位置十分麻煩的情況。
除此之外监右,BaseActivity 還支持的注解有:

@Layout(R.layout.xxx)                      //綁定布局
@DarkStatusBarTheme(true)           //開啟頂部狀態(tài)欄圖標(biāo)边灭、文字暗色模式
@DarkNavigationBarTheme(true)       //開啟底部導(dǎo)航欄按鈕暗色模式
@NavigationBarBackgroundColor(a = 255,r = 255,g = 255,b = 255)      //設(shè)置底部導(dǎo)航欄背景顏色(a = 0,r = 0,g = 0,b = 0可透明)

//也可從代碼中進行控制:
setDarkStatusBarTheme(true);            //開啟頂部狀態(tài)欄圖標(biāo)、文字暗色模式
setDarkNavigationBarTheme(true);        //開啟底部導(dǎo)航欄按鈕暗色模式
setNavigationBarBackgroundColor(Color.argb(255,255,255,255));       //設(shè)置底部導(dǎo)航欄背景顏色(a = 0,r = 0,g = 0,b = 0可透明)
  1. 如何進行沉浸式適配健盒?

BaseActivity 默認就會支持沉浸式適配绒瘦,最低支持到安卓4.4宠互,您還需要單獨做的只有在您的布局中使用 android:fitsSystemWindows="true" 構(gòu)建安全區(qū):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <!--背景部分-->
        
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        android:orientation="horizontal">

        <!--內(nèi)容部分-->

    </LinearLayout>
</LinearLayout>

具體的范例可以參考:

《Android基礎(chǔ) - 如何做魯棒性更高的布局》 http://www.reibang.com/p/174bcb6c0d93

  1. 如何快速方便的使用權(quán)限?

以往的權(quán)限申請與管理需要我們手動申請椭坚,并在 onRequestPermissionsResult 中進行處理,十分繁瑣搏色。BaseActivity 則對其進行了進一步的封裝善茎,并設(shè)立了回調(diào)監(jiān)聽器,一句話即可以使用:

requestPermission(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, new OnPermissionResponseListener() {
    @Override
    public void onSuccess(String[] permissions) {
        toast("申請權(quán)限成功");
    }
    @Override
    public void onFail() {
        toast("申請權(quán)限失敗");
    }
});
  1. 其他
    BaseActivity 支持的工具類如下频轿,都可以隨意簡單的進行使用:
toast(Obj); //簡易吐司:

log(Obj);  //簡易Log打印日志(可通過BaseActivity.DEBUGMODE = false關(guān)閉):

setIMMStatus(boolean show, EditText editText);    //軟鍵盤開關(guān):

moveAnimation(Object obj, String perference, float aimValue, long time, long delay);    //屬性動畫:

isNull(String);    //數(shù)據(jù)判空(適合網(wǎng)絡(luò)返回值判斷處理垂涯,即便為字符串“null”也為空):

jumpAnim(int enterAnim, int exitAnim);    //跳轉(zhuǎn)動畫(參數(shù)為您的動畫資源id)

copy(String);    //直接復(fù)制文字

//適配相關(guān):
dip2px(Context context, float dpValue);    //dip與像素px轉(zhuǎn)換:

dip2px(Context context, float dpValue);    //像素px與dip轉(zhuǎn)換:

getNavbarHeight();    //獲取底部導(dǎo)航欄高度

getDisPlayHeight();    //獲取屏幕高度

getDisPlayWidth();    //獲取屏幕寬度

getStatusBarHeight();    //獲取頂部狀態(tài)欄高度

③ BaseFragment

Fragment 也是常用的布局元素之一,但它先天創(chuàng)建過程較為繁瑣航邢,且綁定組件的過程也并不友好耕赘,為與 BaseActivity 保持一致的規(guī)范化,在 BaseFragment 中我采用了相同的構(gòu)建方式:

@Layout(R.layout.fragment_demo)
public class FragmentDemo extends BaseFragment {
    private TextView info;
    private Button btnHide;
    @Override
    public void initViews() {
        //此處加載組件
        info = findViewById(R.id.info);
        btnHide = findViewById(R.id.btn_hide);
    }
    
    @Override
    public void initDatas() {
        //此處編寫初始化代碼
    }
    @Override
    public void setEvents() {
        //此處為組件綁定事件
       
    }
}

使用時同樣可以直接使用 @Layout 注解綁定布局膳殷,默認強制重寫 initViews操骡、initDatas和setEvents三個方法,并且在 BaseFragment 中赚窃,您可以直接使用 findViewById 來綁定組件册招,并且 BaseFragment 同樣支持 BaseActivity 的一些工具方法。

④高級跳轉(zhuǎn)

在 BaseFramework 中勒极,您依然可以使用 startActivity(new Intent(context, class)); 的代碼形式來進行界面間的跳轉(zhuǎn)是掰,但我們都知道的是,Intent 只支持攜帶基本的數(shù)據(jù)類型格式而不支持自定義的數(shù)據(jù)類型辱匿,例如键痛,我們需要在兩個界面間傳輸一張圖像(Bitmap),這是一個很常見的業(yè)務(wù)需求匾七,但 Intent 并不能辦到絮短,也許你會使用諸如 EventBus 之類的工具來完成,但我相信依然有更加的簡單的方式實現(xiàn)它乐尊,在這里戚丸,BaseFramework 提供了一個簡單的跳轉(zhuǎn)指令來完成它:

jump(JumpActivity.class);        //這是它的基本使用方式

本質(zhì)上,jump 依然是調(diào)用了 startActivity 方法來完成操作扔嵌,但它更加簡單易用限府,一句話即可。

如上邊的例子所述痢缎,有時我們可能需要攜帶一個自定義類型的參數(shù)胁勺,例如 bitmap 到下一界面,那么可以這樣:

Bitmap bmp = xxx;
jump(JumpActivity.class, new JumpParameter()
        .put("參數(shù)1", "這是一段文字參數(shù)")
        .put("參數(shù)2", bmp)
);

而在下一個界面中独旷,您可以在已經(jīng)重寫的 initDatas 方法中直接獲取到相應(yīng)的參數(shù):

@Override
public void initDatas(JumpParameter parameter) {
    if(parameter!=null){
        //此處可以使用 parameter.get(key); 方法獲取數(shù)據(jù)
    }
}

*從 BaseFramework 6.5.0 版本起署穗,跳轉(zhuǎn)參數(shù) JumpParameter 新增 getBoolean寥裂、getInt 和 getString 三個基礎(chǔ)方法,從此方法獲取數(shù)據(jù)不需要判斷是否為空(null)以及進行強轉(zhuǎn)類型案疲;

我們在實際開發(fā)中還可能遇到一種跳轉(zhuǎn)到下一界面后需要下一界面在關(guān)閉時回傳數(shù)據(jù)的情況封恰,一般我們得重寫 onActivityResult 來進行處理,相當(dāng)繁瑣褐啡,在 jump 方式中我們提供了回調(diào)函數(shù)來回傳數(shù)據(jù)诺舔,此方法會在回到當(dāng)前界面后執(zhí)行:
跳轉(zhuǎn)代碼范例:

jump(ResponseActivity.class, new OnResponseListener() {
    @Override
    public void OnResponse(JumpParameter parameter) {
        if (parameter == null) {
            toast("未返回任何數(shù)據(jù)");
        } else {
            toast("收到返回數(shù)據(jù),參數(shù)“返回數(shù)據(jù)1”中的值為:" + parameter.get("返回數(shù)據(jù)1"));
        }
    }
});

亦可選用同時帶參數(shù)+返回值的跳轉(zhuǎn):

jump(ResponseActivity.class,new JumpParameter()
                .put("參數(shù)1", "這是一段文字參數(shù)")
                .put("參數(shù)2", "這是一段文字參數(shù)")
        , new OnResponseListener() {
    @Override
    public void OnResponse(JumpParameter parameter) {
        if (parameter==null){
            toast("未返回任何數(shù)據(jù)");
        }else{
            toast("收到返回數(shù)據(jù)备畦,參數(shù)“返回數(shù)據(jù)1”中的值為:" + parameter.get("返回數(shù)據(jù)1"));
        }
    }
});

而要返回數(shù)據(jù)的界面可以通過以下方法直接設(shè)置要返回的數(shù)據(jù):

setResponse(new JumpParameter().put("返回數(shù)據(jù)1", "測試成功"));

④Activity 總管

當(dāng)我們的界面中擁有大量的 Activity 后低飒,這些 Activity 的管理就會相當(dāng)?shù)穆闊缥覀冃枰P(guān)閉程序懂盐,已知的 killProcess褥赊、System.exit 之類的方法只會讓 App 重啟,那么如何有效的對 Activity 進行控制呢莉恼?

AppManager 是 BaseActivity 的管理工具類拌喉,更適合 BaseActivity 的管理工作。

提供如下方法:

killActivity(baseActivity)      //結(jié)束指定BaseActivity
killAllActivity()               //結(jié)束所有BaseActivity
AppExit()                       //退出App

其他方法类垫,例如 pushActivity 添加Activity到堆棧司光,都是自動執(zhí)行的,不需要手動調(diào)用悉患。

⑤萬能適配器BaseAdapter

通常由系統(tǒng)提供的的 android.widget.BaseAdapter 和 android.widget.SimpleAdapter 雖然都能滿足我們的日常所需残家,但面對各種自定義需求以及多種布局的需求時往往捉襟見肘,以至于我們不得不重寫 Adapter 來滿足需求售躁。

但再重寫過程中實際上是有很多重復(fù)性的代碼坞淮,導(dǎo)致我們的項目臃腫不堪,從 v6.4.8 版本起陪捷,新增了 BaseAdapter 來實現(xiàn)各種自定義布局適配器的需求:

  1. JavaBean 適配方式

使用此方式需要先創(chuàng)建繼承自 BaseAdapter.BaseDataBean 的 JavaBean 數(shù)據(jù)集合來封裝數(shù)據(jù)回窘,例如在我們 Demo 中的:

List<CustomDatas> datas = new ArrayList();
datas.add(new CustomDatas().setTitle("我是布局1"));
datas.add(new CustomDatas().setTitle("我是布局2"));
datas.add(new CustomDatas().setTitle("我是布局3"));

其中 CustomDatas 的具體代碼為:

private class CustomDatas extends BaseAdapter.BaseDataBean {
    String title;

    @Override
    public CustomDatas setType(int type) {
        this.type = type;
        return this;
    }

    public String getTitle() {
        return title;
    }

    public CustomDatas setTitle(String title) {
        this.title = title;
        return this;
    }
}

它是一個典型的 JavaBean,其中所有屬性請根據(jù)實際業(yè)務(wù)需求添加市袖,并建議生成相應(yīng)的 get啡直、set 方法。

接下來創(chuàng)建適配器并綁定在相應(yīng)組件上:

baseAdapter = new BaseAdapter(me, datas, R.layout.item_list_layout1, new SimpleAdapterSettings() {
    @Override
    public Object setViewHolder(View convertView) {
        ViewHolder1 viewHolder1 = new ViewHolder1();
        viewHolder1.txtTitle = convertView.findViewById(R.id.txt_title);
        return viewHolder1;
    }

    @Override
    public void setData(Object viewHolder, BaseAdapter.BaseDataBean dataBean) {
        CustomDatas data = (CustomDatas) dataBean;
        ViewHolder1 viewHolder1 = (ViewHolder1) viewHolder;
        viewHolder1.txtTitle.setText(data.getTitle());
    }
});
list.setAdapter(baseAdapter);

SimpleAdapterSettings 是一個適配器控制器的回調(diào)接口苍碟,在其中重寫 setViewHolder 和 setData方法酒觅,其中 setViewHolder 需要您在此處根據(jù)父布局 convertView 創(chuàng)建布局管理組件 ViewHolder,并回傳您的 ViewHolder微峰。接下來會在 setData 中將 ViewHolder 和 相對應(yīng)的數(shù)據(jù) dataBean給出舷丹,請在此方法中對組件進行賦值和事件綁定。
注意在此方法中您可以將 dataBean 強轉(zhuǎn)為您的 JavaBean 類蜓肆,viewHolder 也可以強轉(zhuǎn)為您的 ViewHolder颜凯。

  1. Map 適配方式

應(yīng)對復(fù)雜多變的數(shù)據(jù)我們可能會選擇使用 Map 來存儲我們的需要展現(xiàn)的數(shù)據(jù)谋币,BaseAdapter 亦支持此方式的數(shù)據(jù),與上述方法類似症概,您可以輕松完成數(shù)據(jù)的綁定和組件的展現(xiàn):

List<Map<String, Object>> datas = new ArrayList<>();
Map<String, Object> map = new HashMap<>();
map.put("title", "我是布局1");
datas.add(map);
map = new HashMap<>();
map.put("title", "我是布局2");
datas.add(map);
map = new HashMap<>();
map.put("title", "我是布局3");
datas.add(map);
baseAdapter = new BaseAdapter(me, datas, R.layout.item_list_layout1, new SimpleMapAdapterSettings() {
    @Override
    public Object setViewHolder(View convertView) {
        ViewHolder1 viewHolder1 = new ViewHolder1();
        viewHolder1.txtTitle = convertView.findViewById(R.id.txt_title);
        return viewHolder1;
    }

    @Override
    public void setData(Object viewHolder, Map<String, Object> data) {
        ViewHolder1 viewHolder1 = (ViewHolder1) viewHolder;
        viewHolder1.txtTitle.setText(data.get("title") + "");
    }
});
list.setAdapter(baseAdapter);
  1. 多種布局的綁定方式

根據(jù)實際業(yè)務(wù)需求蕾额,我們可能需要在一個組件中展現(xiàn)多種布局胁附,此時您首先需要對您的布局進行編號谍珊,從0開始,依次往后呀闻,并將他們添加為一個 Map 集合精肃,其中鍵值對:id對應(yīng)布局資源id(LayoutResId):

Map<Integer, Integer> layoutResIdMap = new HashMap<>();
layoutResIdMap.put(0, R.layout.item_list_layout1);
layoutResIdMap.put(1, R.layout.item_list_layout2);
layoutResIdMap.put(2, R.layout.item_list_layout3);

接下來,您需要將數(shù)據(jù)存儲為一個集合帜乞,此處展示的是 JavaBean 形式的存儲方式司抱,您亦可以使用 Map 作為數(shù)據(jù)的存儲器,最后將它打包為一個 List即可:

List<CustomDatas> datas = new ArrayList();
datas.add(new CustomDatas().setTitle("我是布局1").setType(0));
datas.add(new CustomDatas().setTitle("我是布局2").setType(1));
datas.add(new CustomDatas().setTitle("我是布局3").setType(2));

需要注意的是黎烈,之前提到過习柠,您的 JavaBean(CustomDatas)需要繼承自 BaseAdapter.BaseDataBean,而在 BaseAdapter.BaseDataBean 中照棋,我們默認實現(xiàn)了一個屬性“type”资溃,它是 int 整數(shù)型,用于存儲與布局對應(yīng)的編號 id烈炭。

如果您默認使用 Map 的方式存儲數(shù)據(jù)溶锭,您需要手動 put("type", 對應(yīng)布局編號id ) 以保證能夠和布局資源相匹配。

最后符隙,創(chuàng)建適配器和綁定展示組件:

baseAdapter = new BaseAdapter(me, datas, layoutResIdMap, new MultipleAdapterSettings() {
    @Override
    public Object setViewHolder(int type, View convertView) {
        switch (type) {
            case 0:
                ViewHolder1 viewHolder1 = new ViewHolder1();
                viewHolder1.txtTitle = convertView.findViewById(R.id.txt_title);
                return viewHolder1;
            case 1:
                ViewHolder2 viewHolder2 = new ViewHolder2();
                viewHolder2.txtTitle = convertView.findViewById(R.id.txt_title);
                return viewHolder2;
            case 2:
                ViewHolder3 viewHolder3 = new ViewHolder3();
                viewHolder3.txtTitle = convertView.findViewById(R.id.txt_title);
                return viewHolder3;
            default:
                return null;
        }
    }

    @Override
    public void setData(int type, Object viewHolder, BaseAdapter.BaseDataBean dataBean) {
        CustomDatas data = (CustomDatas) dataBean;
        switch (type) {
            case 0:
                ViewHolder1 viewHolder1 = (ViewHolder1) viewHolder;
                viewHolder1.txtTitle.setText(data.getTitle());
                break;
            case 1:
                ViewHolder2 viewHolder2 = (ViewHolder2) viewHolder;
                viewHolder2.txtTitle.setText(data.getTitle());
                break;
            case 2:
                ViewHolder3 viewHolder3 = (ViewHolder3) viewHolder;
                viewHolder3.txtTitle.setText(data.getTitle());
                break;
        }
    }
});
list.setAdapter(baseAdapter);

從上述代碼中可以看到趴捅,回調(diào)函數(shù)中出現(xiàn)了一個 type 的值,在這里您可以根據(jù)不同的值綁定不同的布局霹疫,設(shè)置不同的數(shù)據(jù)和事件拱绑。

以上就是關(guān)于 BaseAdapter 的簡單介紹了。您還可以通過文檔前半部分的二維碼下載 Demo 丽蝎,其中會為您展現(xiàn)關(guān)于 BaseAdapter 全部的綁定方式猎拨。

⑥Preferences

Preferences是SharedPreferences的簡易封裝。

每次手寫SharedPreferences過于繁瑣屠阻,因此封裝了一個簡易的屬性記錄讀取類红省。 通過對屬性的常見數(shù)據(jù)類型進行封裝,使屬性讀取寫入更方便栏笆,同時提供一些屬性管理方法类腮。

//讀取屬性為String類型
//參數(shù):context上下文索引,path路徑蛉加,preferencesName屬性名
getString(context, path, preferencesName)
//類似的蚜枢,提供讀取為Boolean的方法:
getBoolean(context, path, preferencesName)
//提供讀取為Int的方法:
getInt(context, path, preferencesName)

//寫入屬性方法是統(tǒng)一的
//參數(shù):context上下文索引缸逃,path路徑,preferencesName屬性名厂抽,value根據(jù)屬性數(shù)據(jù)類型定義
set(context, path, preferencesName, ?)

//提供清除(清空)所有屬性的方法
cleanAll();

引入方法

Maven倉庫:

<dependency>
  <groupId>com.kongzue.baseframework</groupId>
  <artifactId>baseframework</artifactId>
  <version>6.5.0</version>
  <type>pom</type>
</dependency>

Gradle:
在dependencies{}中添加引用:

implementation 'com.kongzue.baseframework:baseframework:6.5.0'

總結(jié)

BaseFramework 旨在幫助開發(fā)者快速順利的鋪設(shè)一個新的項目需频,迅速完成項目的構(gòu)建以及開發(fā),在 BaseFramework 中提供了豐富的工具類可以輕松使用筷凤,且無需擔(dān)心額外的負擔(dān)昭殉,BaseFramework 是降本增效的典型框架,也是我對于開發(fā)過程中所遇到的問題藐守、麻煩的統(tǒng)一解決方案挪丢,同時,以此基礎(chǔ)上我還有提供 基礎(chǔ)網(wǎng)絡(luò)請求框架以及基礎(chǔ)對話框框架等實用框架卢厂,以此為起點構(gòu)建安卓應(yīng)用程序會變得更加簡單乾蓬。

BaseFramework 框架的 Github 地址 https://github.com/kongzue/BaseFramework
更多參考框架請訪問 https://github.com/kongzue
或前往 https://kongzue.github.io 查看我的開發(fā)指導(dǎo)意見

喜歡的話麻煩給個贊,我還會不斷完善 BaseFramework慎恒,您可以 Fork&Star BaseFramework 的 Repositories 來訂閱更新任内。

開源協(xié)議

   Copyright BaseFragment

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市融柬,隨后出現(xiàn)的幾起案子死嗦,更是在濱河造成了極大的恐慌,老刑警劉巖粒氧,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件越除,死亡現(xiàn)場離奇詭異,居然都是意外死亡外盯,警方通過查閱死者的電腦和手機廊敌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來门怪,“玉大人骡澈,你說我怎么就攤上這事≈揽眨” “怎么了肋殴?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長坦弟。 經(jīng)常有香客問我护锤,道長,這世上最難降的妖魔是什么酿傍? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任烙懦,我火速辦了婚禮,結(jié)果婚禮上赤炒,老公的妹妹穿的比我還像新娘氯析。我一直安慰自己亏较,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布掩缓。 她就那樣靜靜地躺著雪情,像睡著了一般。 火紅的嫁衣襯著肌膚如雪你辣。 梳的紋絲不亂的頭發(fā)上巡通,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音舍哄,去河邊找鬼宴凉。 笑死,一個胖子當(dāng)著我的面吹牛表悬,可吹牛的內(nèi)容都是我干的跪解。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼签孔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了窘行?” 一聲冷哼從身側(cè)響起饥追,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎罐盔,沒想到半個月后但绕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡惶看,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年捏顺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纬黎。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡幅骄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出本今,到底是詐尸還是另有隱情拆座,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布冠息,位于F島的核電站挪凑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏逛艰。R本人自食惡果不足惜躏碳,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望散怖。 院中可真熱鬧菇绵,春花似錦肄渗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至丹诀,卻和暖如春钝的,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背铆遭。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工硝桩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人枚荣。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓碗脊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親橄妆。 傳聞我的和親對象是個殘疾皇子衙伶,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,080評論 25 707
  • Java基礎(chǔ) 什么是重載,什么是重寫害碾?有什么區(qū)別矢劲?重載(Overload):(1)Overloading是一個類中...
    勤息嘻嘻嘻閱讀 642評論 0 1
  • 分離仿似烈酒,初品慌随,刺喉芬沉,如跌宕起伏的暖流,緩緩歸入心頭阁猜,揮不盡丸逸,散不去。但不可久嘗剃袍,久嘗黄刚,麻木。一口民效,直入胃隘击。升...
    moon_神閱讀 158評論 0 0
  • 神話_shenhua閱讀 151評論 0 1
  • 沒有什么比生活更好糊弄,也沒有什么比內(nèi)心更難敷衍研铆,接受和認同埋同,才能跟這荒謬又精彩的人生冰釋前嫌。 ??? 《觀蟲》...
    神奇小癟斯閱讀 509評論 2 0