BaseActivity 5.0幫你更優(yōu)雅的做適配

本文GitHub地址:https://github.com/kongzue/BaseActivity
歡迎Fork&Star

BaseActivity

BaseActivity是一款適配布局的框架模塊塞帐,能夠提供沉浸式狀態(tài)欄率触,可調(diào)用黑色狀態(tài)欄模式签钩,判斷了小米MIUI和flyme系統(tǒng)獨(dú)立的黑色狀態(tài)欄樣式可獨(dú)立調(diào)用,并提供了一些簡單的吐司和生成日志的方法的基礎(chǔ)Activity類,可以直接將您項目中的Activity繼成BaseActivity使用弓颈。
如何更加優(yōu)雅的編寫代碼是BaseActivity存在的主要目的哆致,也是本代碼誕生的原因。

5.0更新說明:

對于UI適配更加優(yōu)雅摄咆。

??約束

  1. 5.0版本的BaseActivity為了更快更有效的完成Activity創(chuàng)建凡蚜,因此特定的編寫了一些自動化執(zhí)行方法,如果開發(fā)者遵循我們的編寫流程和方案吭从,可以快速完成各Android系統(tǒng)UI布局的適配操作以界面的沉浸式朝蜘。
    一般Activity需要完成的事項主要由以下及部分組成:
    加載布局、處理適配問題涩金、加載數(shù)據(jù)谱醇、控件組件綁定事件,
    對應(yīng)的步做,我們在BaseActivity中提供了相對應(yīng)的方法initViews()副渴、initDatas()、setEvent()全度,用戶繼承對應(yīng)的方法并重寫其代碼煮剧,BaseActivity會自動依次執(zhí)行并對適配相關(guān)的事情進(jìn)行處理。
  2. 直接導(dǎo)入BaseActivity可能提示出現(xiàn)錯誤,有幾個布局找不到:R.id.sys_statusBar以及R.id.box_body可能缺失勉盅,這兩個布局也是約定布局佑颇,您需要在Activity對應(yīng)的Layout中加入他們,我們的標(biāo)準(zhǔn)Activity的Layout布局文件Demo如下:
<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/box_body"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:focusable="true"
    android:focusableInTouchMode="true"
    tools:context="com.kongzue.baseframe.MainActivity">

    <LinearLayout
        android:id="@+id/sys_statusBar"
        android:visibility="gone"
        android:layout_width="match_parent"
        android:layout_height="30dp"
        android:orientation="vertical"
        android:background="#303F9F"></LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:background="#3F51B5" >

        <TextView
            android:id="@+id/txt_title"
            android:layout_width="wrap_content"
            android:layout_height="55dp"
            android:layout_weight="1"
            android:layout_marginLeft="20dp"
            android:layout_centerHorizontal="true"
            android:gravity="center_vertical"
            android:textSize="20sp"
            android:textColor="#ffffff"
            android:text="測試標(biāo)題"/>

    </LinearLayout>

    <!--其他布局-->
</LinearLayout>

可以看到菇篡,設(shè)置了主父布局的ID為box_body漩符,BaseActivity會對其高度進(jìn)行修改,修改方式為(屏幕高度-狀態(tài)欄高度-底部導(dǎo)航欄高度)此處會依據(jù)不同手機(jī)——例如魅族驱还、小米等廠商不同的情況進(jìn)行調(diào)整嗜暴。
我們還在主布局下加入了一個新的布局sys_statusBar,該布局是狀態(tài)欄占位布局议蟆,該布局將會占用系統(tǒng)狀態(tài)欄的位置闷沥,將其他布局向下推移一段距離,避免Activity界面內(nèi)容與狀態(tài)欄透明后的位置重疊咐容。該布局樣式可修改舆逃。

開始

現(xiàn)在,請跟著我的慢動作(劃掉)戳粒,一起來加速編寫一個Activity路狮!
首先,你需要創(chuàng)建一個默認(rèn)的Activity如下:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

注意蔚约,重點(diǎn)開始了奄妨!

  1. 先刪除繼承的AppCompatActivity,轉(zhuǎn)而繼承我們的BaseActivity苹祟,
  2. 在onCreate方法中使用super.onCreate(Bundle,layoutRes)砸抛,
  3. 重寫三個方法initViews()、initDatas()树枫、setEvent()直焙,此處重寫三個方法的原因是這些方法會依次自動被執(zhí)行,我們保留了super.onCreate(Bundle)的原始方法砂轻,并提供了新的兩個參數(shù)的onCreate方法奔誓,若使用此方法加載布局,則會直接依次執(zhí)行initViews()搔涝、initStyle()厨喂、initDatas()和setEvent()。
    注意体谒,沉浸式方法initStyle()該方法不需要重寫,會自動執(zhí)行臼婆。默認(rèn)會對狀態(tài)欄進(jìn)行的是白色主題的適配抒痒,如有黑色主題的需要,請單獨(dú)執(zhí)行setTranslucentStatus(true, true)方法即可颁褂。
    點(diǎn)擊Android Studio的Code -> Override Methods... 菜單故响,重寫上述方法傀广,并設(shè)置super.onCreate(savedInstanceState,R.layout.activity_main)加載布局:
public class MainActivity extends BaseActivity {

    private LinearLayout boxBody;
    private LinearLayout sysStatusBar;
    private TextView txtTitle;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState,R.layout.activity_main);
    }

    @Override
    public void initViews() {
        //此處加載組件
        boxBody = (LinearLayout) findViewById(R.id.box_body);
        sysStatusBar = (LinearLayout) findViewById(R.id.sys_statusBar);
        txtTitle = (TextView) findViewById(R.id.txt_title);
    }

    @Override
    public void initDatas() {
        //此處編寫初始化代碼
        
    }

    @Override
    public void setEvent() {
        //此處為組件綁定事件
        
    }
}

其他一些建議

Kongzue BaseActivity 適配方案與建議.png
  1. 約定布局:占位布局sys_statusBar是為了將Activity中的主體部分(包含標(biāo)題欄和內(nèi)容)向下擠壓以免其位置與系統(tǒng)狀態(tài)欄存在的位置重疊,且在Android4.4以下版本(不支持沉浸式的版本)下sys_statusBar布局彩届,會隱藏伪冰,以系統(tǒng)黑色狀態(tài)欄為呈現(xiàn)方式。
  2. 建議在內(nèi)容部分外嵌套一個ScrollView樟蠕,并在內(nèi)容部分的容器View中使用:
     android:layout_height="wrap_content"
     android:fitsSystemWindows="true"

在鍵盤彈起時布局會自動上移且內(nèi)容部分的輸入框可以上彈到屏幕視野內(nèi)贮聂,從而解決沉浸式鍵盤無法上移的問題。

BaceActivity5.0版本旨在幫助開發(fā)者明晰代碼結(jié)構(gòu)與布局寨辩,輕松完成適配工作吓懈,同樣的,也提供了更為完善的小工具靡狞,例如簡易吐司耻警、簡易Log日志、控制鍵盤開啟關(guān)閉甸怕、dpi與px雙向計算轉(zhuǎn)換甘穿、Android6.0以上權(quán)限申請、屬性動畫梢杭。

小工具調(diào)用方法說明

//簡易吐司:
toast(Obj);
//簡易Log打印日志:
log(Obj);
//軟鍵盤開關(guān):
setIMMStatus(boolean show, EditText editText);
//dip與像素px轉(zhuǎn)換:
dip2px(Context context, float dpValue);
//像素px與dip轉(zhuǎn)換:
dip2px(Context context, float dpValue);
//申請權(quán)限(0x0001是返回值温兼,需要的可以重寫onRequestPermissionsResult做回調(diào)處理):
requestPermission(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION
                , Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_ADMIN}, 0x0001);
//屬性動畫:
moveAnimation(Object obj, String perference, float aimValue, long time, long delay);

4.0版本說明:http://www.reibang.com/p/3905683c5df1

開源協(xié)議

   Copyright Kongzue BaseActivity

   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)場離奇詭異,居然都是意外死亡钧排,警方通過查閱死者的電腦和手機(jī)敦腔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恨溜,“玉大人符衔,你說我怎么就攤上這事≡阍” “怎么了判族?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長项戴。 經(jīng)常有香客問我形帮,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任辩撑,我火速辦了婚禮界斜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘合冀。我一直安慰自己各薇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布君躺。 她就那樣靜靜地躺著峭判,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晰洒。 梳的紋絲不亂的頭發(fā)上朝抖,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機(jī)與錄音谍珊,去河邊找鬼治宣。 笑死,一個胖子當(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
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年横朋,在試婚紗的時候發(fā)現(xiàn)自己被綠了仑乌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡琴锭,死狀恐怖晰甚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情决帖,我是刑警寧澤厕九,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站地回,受9級特大地震影響扁远,放射性物質(zhì)發(fā)生泄漏腺阳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一穿香、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绎速,春花似錦皮获、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至萌京,卻和暖如春雁歌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背知残。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工靠瞎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人求妹。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓乏盐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親制恍。 傳聞我的和親對象是個殘疾皇子父能,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評論 2 354

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