解決Android CalendarView顯示卡頓的問題
阿新 • • 發佈:2019-02-20
Android CalendarView顯示卡頓
基本情況
無論在Dialog、PopupWindow等View中巢狀CalendarView的時候,都會出現CalendarView顯示卡頓的問題,或者顯示的日曆只有星期,具體的日期無法看到的問題,更甚至出現ANR的問題,而且檢視Location也可以看到以下相關的日誌:
D/dalvikvm: GC_FOR_ALLOC freed 2649K (61944), 27% free 7714K/10480K, paused 40ms, total 40ms
D/dalvikvm: GC_FOR_ALLOC freed 3115K (84688 ), 30% free 7669K/10904K, paused 40ms, total 40ms
D/dalvikvm: GC_FOR_ALLOC freed 3072K (83720), 30% free 7669K/10904K, paused 40ms, total 40ms
D/dalvikvm: GC_FOR_ALLOC freed 3071K (83706), 30% free 7669K/10904K, paused 45ms, total 45ms
D/dalvikvm: GC_FOR_ALLOC freed 3071K (83706), 30% free 7669K/10904K, paused 41ms, total 41ms
D /dalvikvm: GC_FOR_ALLOC freed 3071K (83707), 30% free 7669K/10904K, paused 43ms, total 43ms
D/dalvikvm: GC_FOR_ALLOC freed 3071K (83709), 30% free 7669K/10904K, paused 40ms, total 40ms
D/dalvikvm: GC_FOR_ALLOC freed 3072K (83710), 30% free 7669K/10904K, paused 39ms, total 39ms
D/dalvikvm: GC_FOR_ALLOC freed 3071K (83708), 30% free 7669 K/10904K, paused 42ms, total 42ms
新增CalendarView程式碼
一般向Dialog或PopupWindow新增CalendarView,大部分人寫的程式碼都是諸如:
// 通過java程式碼動態新增CalendarView
...
CalendarView calendar = new CalendarView(this);
PopupWindow popupWindow = new PopupWindow(calendar, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);
...
或者:
// 通過layout檔案inflate
...
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
View v = getActivity().getLayoutInflater().inflate(R.layout.dialog_calendar, null);
builder.setView(v);
builder.create().show();
...
其中dialog_calendar佈局如下:
<?xml version="1.0" encoding="utf-8"?>
<CalendarView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
解決方法
新增CalendarView的方法是通過inflate對應的layout檔案來新增,而且layout檔案中CalendarView不能作為根佈局,所以完整的程式碼大概這樣子:
// 通過inflate來新增CalendarView
View calendar = LayoutInflater.from(MainActivity.this).inflate(R.layout.layout_calendar, null, false);
popupWindow = new PopupWindow(calendar, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);
其中,layout_calendar如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<CalendarView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/calendarView"
android:layout_width="match_parent"
android:layout_height="400dp"
android:clickable="true"
android:showWeekNumber="false" />
</LinearLayout>