1. 程式人生 > >解決Android CalendarView顯示卡頓的問題

解決Android CalendarView顯示卡頓的問題

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>