2012年7月28日土曜日

秒数無しのDigitalClock作成

チームEggの赤峰です。

さて、本日はDigitalClockの話です。
ネイティブのViewにDigitalClockというものがあります。
これを利用することで、時間を簡単に表示することができます。


しかし、DigitalClockではフォーマット指定により秒数が必ず表示されます。
秒数が非表示のDigitalClockを利用する場合は、
オリジナルDigitalClockを自作することになります。

以下が秒数を非表示にしたオリジナルのDigitalClockです。
SimpleDigitalClock.java
package com.example.digitalclock;

import java.util.Calendar;

import android.content.Context;
import android.os.Handler;
import android.os.SystemClock;
import android.text.format.DateFormat;
import android.util.AttributeSet;
import android.widget.TextView;

public class SimpleDigitalClock extends TextView {
    private Calendar mCalendar;
    private Runnable mTicker;
    private Handler mHandler;
    private boolean mTickerStopped = false;
    private static final String FORMAT = "k:mm";

    public SimpleDigitalClock(Context context) {
        super(context);
        initClock();
    }

    public SimpleDigitalClock(Context context, AttributeSet attrs) {
        super(context, attrs);
        initClock();
    }

    private void initClock() {
        if (mCalendar == null) {
            mCalendar = Calendar.getInstance();
        }
    }

    @Override
    protected void onAttachedToWindow() {
        // ViewがWindowにアタッチされたとき(結合したとき)に呼び出される。
        mTickerStopped = false;
        super.onAttachedToWindow();
        mHandler = new Handler();

        mTicker = new Runnable() {
            @Override
            public void run() {
                if (mTickerStopped)
                    return;
                mCalendar.setTimeInMillis(System.currentTimeMillis());
                setText(DateFormat.format(FORMAT, mCalendar));
                invalidate();
                long now = SystemClock.uptimeMillis();
                long next = now + (1000 - now % 1000);
                mHandler.postAtTime(mTicker, next);
            }
        };
        mTicker.run();
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        mTickerStopped = true;
    }
}

次に独自ViewをXMLで読み込みます。 activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <com.example.digitalclock.SimpleDigitalClock
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:textSize="50dp" />
</LinearLayout>

以上で、秒数無しのDigitalClockを利用可能になります。
表示フォーマットを変更したい場合は、SimpleDigitalClockのFORMATを修正してください

0 件のコメント:

コメントを投稿