MonthlyCalendarView 確認など

View は基本的に invalidate というメソドを呼び出すことで画面の描画を指示する、とのことでそこ起点でもごもごしてみることに。
MonthlyCalendarView.java 内で invalidate メソドを呼び出しているのは

  • protected void calcCalendarMatrix()
  • private void select(int col, int row)

の二つ。そしてそれぞれの呼び出し元は、というと

  • public boolean onTouchEvent(MotionEvent event)
  • public boolean onTrackballEvent(MotionEvent event)
  • public boolean onKeyDown(int keyCode, KeyEvent event)
  • public void setToDay(int day)

これらが select メソドを呼び出してて

  • private void initResource(AttributeSet attrs)
  • public void setCalendar(Calendar calendar)
  • public void setCalendar(int year, int month)
  • public void setCalendar(int year, int month, int day)

これらが calcCalendarMatrix メソドを呼び出してます。あと、private な initResource メソドですがコンストラクタから呼び出しされてますね。

とりあえづ

Fragment の中に MonthlyCalendarView を盛り込んでどうなるかを見てみることに。ちょっと脳がへろへろ杉で読む体力がアレだったもので。
MonthlyCalendarView.java 以外にも以下が必要な模様。

  • src/org/kazzz/view/calendar/DataInfo.java
  • src/org/kazzz/util/HolidatUtil.java
  • src/org/kazzz/util/StrUtil.java
  • res/values/colors.xml

で、もごもごヤッてると表示はできたのですが色々不具合。

  • テーマが Holo Dark なのでorz
    • Theme.Holo.Light に変更したら正常に表示
  • カレンダだけ出しちゃってるので何年何月かが不明
    • やっぱ何かで wrap しないと駄目なのか

ということでもごもごしてみました。
とりあえずフラグメントなレイアウトを以下にして

<?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"
    android:orientation="vertical">
    
    <TextView 
        android:id="@+id/header"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"/>
    
    <jp.shuri.yamanetoshi.mcs.MonthlyCalendarView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"/>
    
</LinearLayout>

Fragment の onCreateView メソドが以下なカンジ。

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.main_fragment, container, false);
        TextView tv = (TextView)v.findViewById(R.id.header);
        Calendar c = Calendar.getInstance();
        String y = Integer.toString(c.get(Calendar.YEAR));
        String m = Integer.toString(c.get(Calendar.MONTH) + 1);
        tv.setText(y + "年" + m + "月");
        return v;
    }

フォントをも少し大きくした方が見栄えがアレ。で、盛り込まないと、なナニとして

  • 日付けを押したら詳細画面
  • ViewPager で頁めくり

あたりか。日付けを押して云々、なあたりは Fragment 側で onTouchEvent なリスナを作ってあげて MonthlyCalendarView な方法で場所を特定して intent を云々すれば良いのかどうか。
あと、頁めくり用に id 付けて次の月に云々、なのか。そゆ意味では Fragment 側でカレントな年月持ってないとマズいな。
で、色々見てて分かったんですが、これ系の無限リストには ViewPager は対応できないみたいに見えます。getCount() というメソドが ViewPager が持ってる頁数戻さなきゃ駄目みたいですね。ちょっとハンドル切って CalendarView をそのまんま流用しちゃえ的な形にしようかな、と思っていたりして。

ライブラリプロジェクト

作成してみることに。とりあえず Activity 無し、という形でプロジェクトを新規作成してプロジェクトのプロパティで isLibrary にチェック入れておいて CalendarView のソースをコピィ。.jar なファイルまで出力できました。
で、以下なカンジで Fragment に CalendarView をセットしたら動いた。月を切り替えるボタンが表示されていないけれど、ちゃんと動いてます。

<?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"
    android:orientation="vertical">

    <org.kazzz.view.calendar.CalendarView
        android:id="@+id/Calendar"
   	android:layout_height="0dip"
   	android:layout_width="fill_parent"
   	android:layout_weight="1"/>
    
</LinearLayout>

2.x 系と 4.x 系の混在なナニはライブラリプロジェクト使え、と yanzm さんの本にありましたが、これはなかなか便利ですね。

とりあえづ

CalendarView をライブラリプロジェクトにしたソレと動作確認したナニは github に置いておくことに。

使い方ですが CalendarView は clone して頂いておいてこれを使うプロジェクト側でライブラリプロジェクトを使う設定 (プロジェクトのプロパティの Android の項) を盛り込んで頂ければ上記な形でレイアウトな xml にて使うことができます。
ライセンスなどについては配布元の以下の記述に沿って頂ければと。