天天看點

Android中一些開發的小技巧總結(持續更新)前言Activity中擷取Fragment對象Activity中擷取跟布局(RootView)IntentService動态注冊廣播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後,你會發現,有部分控件被遮擋了,也就實作不了右上角未讀提醒了,可以看下我用這個實作的效果

Android中一些開發的小技巧總結(持續更新)前言Activity中擷取Fragment對象Activity中擷取跟布局(RootView)IntentService動态注冊廣播Android中的盒子模型

就是右上角的紅點,當然實作方式很多,我比較喜歡使用這個寫法,嵌套了兩層,幀布局的話會簡單點,記得我嘗試過,可能效果不太理想吧.