1. 程式人生 > >[CloudReader] Android 開發中所遇問題歸納(持續更新)

[CloudReader] Android 開發中所遇問題歸納(持續更新)

本文來自我的部落格:http://jingbin.me ,是開發開源專案雲閱時遇到的問題總結。最新的更新在部落格裡,慢慢再逐步更新到CSDN。
如對您有幫助,請幫忙Star一下吧~

DataBinding

  • DataBindingHelper.jar的使用:作為外掛匯入後,和GsonFormat的使用類似。在對應的Bean裡,可自動生成@BindablenotifyPropertyChanged(BR.title);。此傑作是同事做的。網上也有類似的外掛可以使用。

  • 神坑!windows下databinding引入文字會有問題,而mac上沒有!使用@string/string_type

    引入字串!

  • layout節點寫了xmlns:android="http://schemas.android.com/apk/res/android後,子佈局不能寫.

  • include 子佈局時子佈局根節點也要宣告id,不然引用不到子佈局id

  • databinding 繫結子佈局。先繫結,後父佈局再addView()

  • 注入 databinding 後,AndriodStudio包結構變亂。解決:Android Studio2.2會出現此情況,升級到2.2.2就可以了。

  • databinding繫結bean時,裡面的子類也需要繼承BaseObservable,否則會報錯。

  • recyclerview 的viewhodler 裡,獲得繫結 view 的databinding:DataBindingUtil.getBinding(this.itemView);

  • 佈局裡沒有宣告id,則對應的 ItemEverydayBinding 無法生成。

  • 更改包名之後(rename – gradle.applicationId), databinding 相關檔案會報錯,進入Build --> Build Project就好了!

  • 注意:引用如:android:showImg=’@{bean.images.large}’時,裡面的bean寫錯會造成編譯錯誤!

  • 注意:text='@{xx}'裡面的值應為String型別。引用方法裡的引數型別應一致。報錯是不告訴具體的哪行程式碼,寫多了只能自己一個個地方找。

  • android:showImg=’@{bean.images.large}’這樣設定圖片會閃一下!尤其是在recyclerview裡面,效果很不好,如果是寫在 adapter裡就好了:ImgLoadUtil.displayEspImage(bean.getImages().getLarge(), binding.ivTopPhoto, 0);。不僅僅圖片,文字也會閃。加上這句就好了:binding.executePendingBindings();

    ,意思是:當資料改變時,binding會在下一幀去改變資料,如果我們需要立即改變,就去呼叫executePendingBindings方法。

  • 佈局裡面的子佈局裡引用的bean可以一樣(type一樣),但是最好name不一樣,不然可能會導致setBean()無效。改變name名就好了。

    1. 檔案裡引用bean:
    <variable
        name="subjectsBean"
        type="com.example.jingbin.bean.moviechild.SubjectsBean" />
    1. 檔案裡呼叫靜態方法:
    <import type="com.example.yunyue.utils.StringFormatUtil"/>
    // 佈局呼叫
    android:text="@{StringFormatUtil.formatName(subjectsBean.directors)}"
    1. 字串和靜態方法拼接(注意外層引號的區別,裡面沒有字串時任意都行,有則使用單引號):
    android:text='@{"型別:"+StringFormatUtil.formatGenres(subjectsBean.genres)}'
    1. 使用@BindingAdapter(),自定義loader用來非同步載入影象:

      • 一個引數時:
    // 任意類裡宣告
    @BindingAdapter("android:showImgBg")
    public static void showImgBg(ImageView imageView,String url) {
        displayGaussian(imageView.getContext(),url,imageView);
    }
    // 佈局呼叫
    android:showImgBg='@{subjectsBean.images.large}'
  • 兩個或多個引數時:

    /**
     * 妹子,電影列表圖
     * @param defaultPicType 妹子:1 電影:0
     */
    @BindingAdapter({"android:displayFadeImage","android:defaultPicType"})
    public static void displayFadeImage(ImageView imageView, String url,int defaultPicType) {
        displayEspImage(url, imageView, defaultPicType);
    }
    
    // XML裡使用:
    android:defaultPicType="@{1}"
    android:displayFadeImage="@{bean.url}"
    

注意:

  • 1. 方法引數第一個是控制元件宣告,放在第二位不可以!
  • 2. 佈局呼叫時,名稱空間可自動生成。

建議:

  • 1. android:showImgBg可任意寫,但是專案裡不能出現相同的命名,否則會被後來的覆蓋掉!
  • 2. 如果 imgload:showImgBg 這樣寫,第一次編譯會提示找不到該名稱空間,跳到宣告處。建議寫成 android:showImgBg。
  1. 三元運演算法:

    匯入:<import type="android.text.TextUtils" />
    使用:android:text='@{TextUtils.isEmpty(resultsBean.who)?"佚名":resultsBean.who}'
    也可以直接使用這時返回為null會不顯示。

RecyclerView

  • ✔️ NestedScrollView裡巢狀 RecyclerView 官方後期已經解決了顯示不全問題!看引用的包是什麼版本的!還需要加上這兩行程式碼:(這樣不推薦,會把內容全部一次性的載入進記憶體,造成卡頓)

    recyclerView.setNestedScrollingEnabled(false);
    recyclerView.setHasFixedSize(false);
  • ❌ NestedScrollView裡巢狀 RecyclerView ,在recyclerView.setLayoutManager(new FullyLinearLayoutManager(getActivity()));之後,需要加上,不然滑動不流暢:

    recyclerView.setNestedScrollingEnabled(false);
    recyclerView.setHasFixedSize(false);
  • RecyclerView 的item顯示出現控制元件顯示不全,item只顯示一部分,非常怪異!在adapter中的onCreateViewHolder()中
    View inflate = layoutInflater.inflate(R.layout.xxx, parent, false);注意要依附於parent。這樣就好了!

    • RecyclerView: No adapter attached; skipping layout 沒有資料時,gone掉,不然一直會提示這個!
    • addFooterView時,使用LinearLayout 包裹時會顯示部分,改為RelativeLayout或FrameLayout正常。

    • NestedScrollView包裹RecyclerView如果沒關聯下面design包會顯示不出,加了就好了!

    compile 'com.android.support:design:24.2.1'

    同時此包裡還含有Toolbar的屬性:

     app:layout_collapseMode="pin"
    app:layout_scrollFlags="enterAlways|scroll"
    • NestedScrollView裡巢狀 RecyclerView 需要在onResume里加上.setFocusable(false),不然進入頁面會定位到列表第一條或其他問題。
    • 新增headerview後,隱藏顯示,進度條不會到達螢幕頂端。

ViewPager 與 Fragment

  • 父佈局使用fragmentscrollview下拉會有陰影效果。

  • viewpager左右預載入頁面的個數設定:setOffscreenPageLimit(3);,設定後保證頁面不被銷燬,切換時就不會卡頓了(顯示時載入資料)。注意,如果是這個viewpager本身就在父一個viewpager的一個頁面裡,則設定adapter時,應傳getChildFragmentManager(),不然以上會設定不上,非法狀態異常!

  • Fragment 和當前自身所在的Activity 走一套生命週期,意思就是Activity走了onResume(),fragment才會走自身的onResume(),多個Fragment 相互切換是不走onResume()和onDestroy()的。

  • 如果listview 裡addHeaderView()新增輪播圖,則輪播圖滾動時會呼叫 listview 的滾動監聽,且返回的firstVisiblePosition = 0

  • Activity 裡放多個fragment,當載入過其中一個fragment A後,切到其他的fragment,直至銷燬fragment A後,再直接切到fragment A,這時fragmentA.getUserVisibleHint() = false。所以依賴getUserVisibleHint() = true的邏輯要注意了!最好的方式是在 viewpager 的監聽裡,手動fragment.setUserVisibleHint(true)

  • 根據setUserVisibleHint()方法的呼叫時間,來實現 fragment 的懶載入。setUserVisibleHint() 會在onActivityCreated()之前呼叫,所以可以在onActivityCreated() 進行一系列初始化的操作,然後在 setUserVisibleHint() 裡請求資料。具體請見這裡

Retrofit

  • 使用retrofit請求時,Bean裡如有Drawable欄位,而且沒有賦值,會資料解析異常,出現StackOverflowError錯誤。

  • 使用retrofit請求時,若請求成功且有資料返回還報錯,看Bean裡欄位或欄位型別是否寫錯。

  • retrofit設定post請求時,傳陣列時使用image_ids[]

    @FormUrlEncoded
    @POST("/vip/diagnostic_explains")
    Observable<ErrorBean> postDiagnosticExplains(@Header("a") String a, 
        @Field("userkey") String userkey, @Field("comment") String comment,  
        @Field("image_ids[]") List<Integer> image_ids);

ACache

  • 使用ACache工具快取時,如果快取的bean類名一致,或類裡面的內部類一致,這時logcat會提示有兩個相同bean的id,就是無效的類,或找不到該類。所以:快取的檔案裡的類名最好不要一樣!

  • 使用ACache工具快取時,subList沒有實現序列化!快取List時會出錯!詳情

TextView

  • 使TextView實現長按複製文字的功能,加上屬性:android:textIsSelectable="true"

  • textView中間加橫線:textView .getPaint().setFlags(Paint. STRIKE_THRU_TEXT_FLAG );

其他

  • 相容5.0以下水波紋效果:新建drawable-21檔案,裡面放ripple檔案,其他正常,詳情

  • listview某圖示顯示亮或不亮的問題:先全部不亮,再根據條件變亮。

  • 當ScrollView裡的元素想填滿ScrollView時,使用 fill_parent 是不管用的,必需為ScrollView設定:android:fillViewport="true"

  • Android 5.1的SDK把Button的預設Style改了,使Button上顯示因為全為大寫,加上屬性android:textAllCaps="false"就好了,詳情

  • toolbar中設定標題和副標題文字顏色和大小時,在xml檔案配置app:titleTextAppearance="@style/ToolBar.Title"可以,其中

    <style name="ToolBar.Title" parent="@style/TextAppearance.Widget.AppCompat.Toolbar.Title">
        <item name="android:textSize">18.0sp</item>
        <item name="android:textColor">@color/colorWhite</item>
    </style>

    也可以在activity中設定:
    binding.titleToolBar.setTitleTextAppearance(this, R.style.ToolBar_Title);

  • 設定透明狀態列時,佈局根節點不要設定android:fitsSystemWindows="true"否則狀態列會一直存在,被這個問題坑了一整天!!還有整塊佈局也不要給設定顏色。

  • ImageView圖片直接src會記憶體洩漏,圖片寬高大時會很嚴重,建議程式碼設定。

  • 1920*1080(1080p) 小米3,小米5等,屬於xxhdpi,將圖片放在這個資料夾內,這個解析度的手機顯示圖片會很清晰,放在xhdpi清晰度會降低。

  • 1.文字顏色選擇器:裡面的根節點應為color且最好放在新建color檔案下。2.作為背景選擇器來說,根節點應該是drawble,最好放在drawble資料夾下。

  • Glide載入圖片:自動快取當前圖片的尺寸,如果其他地方取這個比例的圖片則取的是快取。不快取等比例的圖片!如果其他地方想要取當前圖片的快取,可載入時設定當前圖片的寬高,用這個方法:override(300,400),值在dimens裡取,直接設定會損失清晰度。