[CloudReader] Android 開發中所遇問題歸納(持續更新)
本文來自我的部落格:http://jingbin.me ,是開發開源專案雲閱時遇到的問題總結。最新的更新在部落格裡,慢慢再逐步更新到CSDN。
如對您有幫助,請幫忙Star一下吧~
DataBinding
DataBindingHelper.jar的使用:作為外掛匯入後,和
GsonFormat
的使用類似。在對應的Bean
裡,可自動生成@Bindable
和notifyPropertyChanged(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();
佈局裡面的子佈局裡引用的bean可以一樣(type一樣),但是最好name不一樣,不然可能會導致
setBean()
無效。改變name名就好了。- 檔案裡引用bean:
<variable name="subjectsBean" type="com.example.jingbin.bean.moviechild.SubjectsBean" />
- 檔案裡呼叫靜態方法:
<import type="com.example.yunyue.utils.StringFormatUtil"/> // 佈局呼叫 android:text="@{StringFormatUtil.formatName(subjectsBean.directors)}"
- 字串和靜態方法拼接(注意外層引號的區別,裡面沒有字串時任意都行,有則使用單引號):
android:text='@{"型別:"+StringFormatUtil.formatGenres(subjectsBean.genres)}'
使用
@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。
三元運演算法:
匯入:<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
後,隱藏顯示,進度條不會到達螢幕頂端。
- RecyclerView: No adapter attached; skipping layout 沒有資料時,
ViewPager 與 Fragment
父佈局使用
fragment
或scrollview
下拉會有陰影效果。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
裡取,直接設定會損失清晰度。