Android中一些開發的小技巧總結(持續更新)

前言

做事,寫代碼都要找到最優的方案!

 

Activity中獲取Fragment對象

      不管是佈局xml裏是fragment(有id),還是一個幀佈局,幀佈局最終要替換成對應的fragment,通過findFragmentById可以獲取到對應的fragment對象,然後你要使用fragment裏面的某些方法等比較方便,網上說的那些通過回調等也是可以的,但是通常來說,Activity裏需要使用fragment裏面某些判斷等簡單調用吧,可以使用這種方式.如下我這邊目前使用這個方式來操作一些邏輯,對於內存泄漏什麼的,目前還沒有檢測.

 EmailPullFragment fragment = (EmailPullFragment) getSupportFragmentManager().findFragmentById(R.id.frame_content);
        if (null != fragment) {
            if (fragment.checkHaveEmailData()) {
                ToastUtil.showCentreToast(EmailPullHomeActivity.this,R.string.email_no_batch_edit_hint);
                return;
            } else {
                startActivity(intent);
            }
        } else {
            startActivity(intent);
        }

Activity中獲取跟佈局(RootView)

大家如果做過“沉浸式狀態欄”的功能,可能需要這個小技巧,因爲沉浸式有個屬性,當然這個沉浸式支持的最低系統是Android4.4,實現沉浸式需要使用到這個屬性fitsystemWindows,這個需要在根佈局裏邊加上fitsystemWindows = true可以實現沉浸式的效果,當然,代碼中也可以設置這個屬性,通過setFitsystemWindows(true)即可實現效果;話又說回來了,這個我們要做統一的效果,不能在每個頁面根部都加這個屬性吧,有點麻煩哦,看過源碼的人都知道,Activity的唯一實現窗口phoneWindow就是我們手機的屏幕,裏面有個DecorView,DecorView是一個容器,它所對應的ID 爲android.R.id.content,之前我們經常調用setContentView(),我們的View就是該DecorView下面的一個子View,因此
((ViewGroup) context.findViewById(android.R.id.content)).getChildAt(0).setFitsSystemWindows(true);
通過上面的設置我們就在代碼中實現了沉浸式的效果,當然要在基類中設置,因爲是統一的效果,基類設置也需要注意下,注意Activity加載過程,要在setContentView後,系統計算好佈局高度一系列工作後展示到用戶面前的時候,展示到用戶面前,有個週期不就是onResume()嗎,在基類的這個週期里加上上述的代碼即可簡單快速的實現沉浸式效果!(4.4系統的沉浸式和5.0系統之後的設置效果一樣,雖然沉浸式的樣式有所變化,那是系統級的變化,不影響使用!)

IntentService

該類繼承於Service,執行一次,自行銷燬(stopSelf) 針對後臺耗時操作,可以使用這個,很方便!

動態註冊廣播

這個在平常開發中用的還是比較多的,IntentFilter中加入action,界面耦合等用的挺好,要注意內測泄漏的問題, 退出當前記類時記得將廣播取消註冊.

Android中的盒子模型

盒子模型最早用於前端Html,相對於外部是margin,相對於內部是Padding.Android佈局使用xml編輯,也是盒子模型的原理,這裏有個小技巧 比如你要實現一個未讀數字的效果,可以這樣編寫
<RelativeLayout
        android:layout_width="60dp"
        android:gravity="center"
        android:layout_height="60dp">

        <ImageView
            android:layout_width="wrap_content"
            android:src="@drawable/message_icon"
            android:layout_centerHorizontal="true"
            android:layout_alignParentRight="true"
            android:layout_height="wrap_content" />
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_gravity="top|right"
            android:layout_alignParentRight="true"
            android:layout_marginTop="-3dp"
            android:layout_marginRight="-3dp"
            android:gravity="right|top"
            android:layout_height="wrap_content">
            <ImageView
                android:id="@+id/iv_new_message"
                android:layout_width="10dp"
                android:layout_height="10dp"
                android:visibility="gone"
                android:src="@drawable/message_circle_bg"
                />
        </LinearLayout>

    </RelativeLayout>

 android:layout_marginTop="-3dp"
            android:layout_marginRight="-3dp"

可以看到-3dp的寫法,其實跟3dp的方向正好相反,-3dp其實就是相對於父容器並向父容器靠攏,3dp是相對於父容器分開,可你又說了,那爲什麼不使用margin_bottom,根據盒子模型,marginBottom是這個控件距離父容器底部3dp,你改成30dp後,你會發現,有部分控件被遮擋了,也就實現不了右上角未讀提醒了,可以看下我用這個實現的效果
就是右上角的紅點,當然實現方式很多,我比較喜歡使用這個寫法,嵌套了兩層,幀佈局的話會簡單點,記得我嘗試過,可能效果不太理想吧.




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章