2013年6月5日水曜日

和暦変換

JapaneseImperialCalendarクラスはAndroidで和暦表示できないんですかね。。
Java 6で和暦を使う
プログラミングお役立ちメモ

private String getJpYear(Calendar calendar) {
    //西暦から和暦を取得する
    //和暦変換テーブル
    String warekiTable[][] = {
        {"18680908","19120729", "明治"},   //明治          
        {"19120730","19261224", "大正"},   //大正
            {"19261225","19890107", "昭和"},   //昭和
            {"19890108","99991231", "平成"}};  //平成
 
    //YYYYMMDDの形式に変換する
    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
    String ymd = sdf.format(calendar.getTime());
    //暦変換テーブルをサーチする
    int i = 0;
    for (i=0; i<warekiTable.length; i++) {
            //当該西暦が開始年以上で最終年以下ならbreak
            if (ymd.compareTo(warekiTable[i][0]) >= 0 && ymd.compareTo(warekiTable[i][1]) <= 0) {
                break;
            }
        }
 
        //暦テーブルに該当レコードがあれば、和暦年を計算する
        if (i < warekiTable.length) {
            int jpYear = calendar.get(Calendar.YEAR) - Integer.parseInt(warekiTable[i][0].substring(0,4)) + 1;
            //和号+和暦年を返す
            return warekiTable[i][2] + jpYear;
        } else {
        //明治より前は西暦で返す
            return calendar.get(Calendar.YEAR).toString();
        }   
    }

日付処理(Calendarクラス)

Calendarクラス

・インスタンス取得
Calendar calendar Calendar.getInstance();

・Dateオブジェクト取得
calendar.getTime();

・年取得
int year = calendar.get(Calendar.YEAR);

・月取得
int month = calendar.get(Calendar.MONTH) + 1;

・日取得
int day = calendar.get(Calendar.DATE);

・時取得
int hour = calendar.get(Calendar.HOUR_OF_DAY);

・分取得
int minute = calendar.get(Calendar.MINUTE);

・秒取得
int second = calendar.get(Calendar.SECOND);

・曜日取得
StringBuffer dow = new StringBuffer();
switch (calendar.get(Calendar.DAY_OF_WEEK)) {
    case Calendar.SUNDAY: dow.append("日曜日"); break;
    case Calendar.MONDAY: dow.append("月曜日"); break;
    case Calendar.TUESDAY: dow.append("火曜日"); break;
    case Calendar.WEDNESDAY: dow.append("水曜日"); break;
    case Calendar.THURSDAY: dow.append("木曜日"); break;
    case Calendar.FRIDAY: dow.append("金曜日"); break;
    case Calendar.SATURDAY: dow.append("土曜日"); break;
}

2013年4月10日水曜日

ウィジェット基本

■実装の基本
(1)AppWidgetProviderクラスを継承した独自クラスを作成する
AppWidgetProviderで用意されているpublic methodは6つあります。
その中から必要なメソッドをオーバーライドして独自クラスを作成します。

・onEnabled(Context context)
一番最初のウィジェットが作成された時に呼ばれます。
ホームスクリーン上に複数ウィジェットを作成した時、一番最初に作成したウィジェットのみ
このメソッドが呼ばれます。

・onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
ウィジェットが作成された時、またはAppWidgetProviderInfoオブジェクトの
android:updatePeriodMillisに指定した時間が経過した時に呼ばれます。

・onDeleted(Context context, int[] appWidgetIds)
ウィジェットが削除された時に呼ばれます(※)

・onDisabled(Context context)
一番最後のウィジェットが削除された時に呼ばれます。
ホームスクリーン上に複数ウィジェットを作成されている時、一番最後に削除した
ウィジェットのみこのメソッドが呼ばれます。

・onAppWidgetOptionsChanged(Context context,
AppWidgetManager appWidgetManager,
int appWidgetId,
Bundle newOptions)
API Level16(Android4.1)から追加されたメソッドで、ウィジェットのサイズが変更された時、
またはウィジェットをホームスクリーンに配置した時に呼ばれます。

・onReceive(Context context, Intent intent)
ブロードキャストされたインテントを受信した時に呼ばれます。
AppWidgetProviderクラスでブロードキャストされたインテントのアクションによって
上記5つのメソッドのどれを呼ぶかハンドリングしているため、通常は使用することのない
メソッドです(※)。

※Android1.5においてonDeleted()メソッドが呼ばれるべき時に呼ばれないバグがあります。
回避手段としてonRecevie()メソッドをオーバーライドして、onDeleted()メソッドを呼んであげる
必要があります。
【参考】
http://developer.android.com/guide/topics/appwidgets/index.html
http://www.atmarkit.co.jp/fsmart/articles/android10/android10_2.html


(2)表示するウィジェットのレイアウトを定義する
/res/layout/配下にXMLファイルで定義します。
ウィジェットのレイアウトはRemoteViewsに基づくため、全てのレイアウトクラスやウィジェットクラスを
サポートしている訳ではありません。
ウィジェットでサポートしているレイアウトクラス、ウィジェットクラスは以下の通りです。

レイアウトクラス
・FrameLayout
・LinearLayout
・RelativeLayout

ウィジェットクラス
・AnalogClock
・Button
・Chronometer
・ImageButton
・ImageView
・ProgressBar
・TextView


(3)AppWidgetProviderInfoオブジェクトの定義
/res/xml/配下にXMLファイルを作成しエレメントを使って定義します。
設定する基本的な項目は以下の通りです。

・android:minWidth
・android:minHeight
ホームスクリーン上に配置するウィジェットの最小領域をdp(dip)で指定します。
Androidのホームスクリーンは、ウィジェットやアイコンを綺麗に配置させるため、
通常であればスマートフォンは4×4、タブレットは8×7のセルに分割されています。
ウィジェットを配置する最小領域は1セルとなりますが、指定する値はdpで指定する
必要があります。
デバイスにより異なりますが、ウィジェットの最小領域(1セル)は74dpとなります。
しかし、ホームスクリーン上に配置する際、dpからpxへの変換が行われるため、
変換の丸め誤差を考慮すると指定するdpの値には、以下の計算式を当てはめます。

(セルの数×74dp)-2dp

例えば1セルの領域に配置したい場合は72dp以下を指定し、2セルの領域に配置したい場合は
146dp以下を指定します(※)。
なお、指定する値は30dpでも1dpでも、72dpを超えなければ1セルに配置されます。
Androidのサンプルソースでは以下のコードとなっていました。
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="60dp"
    android:minHeight="30dp"
    android:updatePeriodMillis="86400000"
    android:initialLayout="@layout/appwidget_provider"
    android:configure="com.example.android.apis.appwidget.ExampleAppWidgetConfigure"
    android:resizeMode="horizontal"
    >
</appwidget-provider>


Android4.0以降は配置するウィジェットの上下左右にマージンが付加される為、
1セルに配置したい場合は64dp以下を指定する必要があり、nexus7の端末は
79dp以下を指定する必要があるようです。
【参考】
http://d1skroid.blogspot.jp/
http://developer.android.com/guide/practices/ui_guidelines/widget_design.html


・android:updatePeriodMillis
ホームスクリーン上に配置したウィジェットを更新する間隔をミリ秒で指定します。
最小値は1800000です(30分)。
端末がスリープ状態でもupdatePeriodMillisで更新が行われる時は、スリープ状態が解除されます。
30分未満の間隔で更新したい場合や、スリープ状態が解除されてしまうのを回避したい場合は、
AlarmManagerを使用するのが一般的です。
なお、0を指定するとウィジェットの更新は行われません。

・android:initialLayout
ホームスクリーン上に配置した際のレイアウトファイルを指定します。


(4)マニフェストの設定
AppWidgetProviderクラスを継承した独自クラスをブロードキャストレシーバとして定義します。
APPWIDGET_UPDATEブロードキャストインテントを受信出来るようにに指定します。
APPWIDGET_UPDATEのみ指定すれば、他のAPPWIDGET_DELETEDや
APPWIDGET_ENABLEDなどのブロードキャストインテントも受信出来るようになります。

<receiver android:name="com.aez.example.appwidget.provider.ExampleAppWidgetProvider">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
    </intent-filter>
    <meta-data android:name="android.appwidget.provider" android:resource="@xml/example_appwidget_info"/>
</receiver>

2013年3月31日日曜日

ウィジェット:基本

■ウィジェットとは
ホームスクリーン上で動作する簡易機能を持ったアプリケーションです。
(例:時計アプリ)


■実装概要
Android OSから発行された「ウィジェットに関連するブロードキャストされたインテント」を
受信することでウィジェットを管理出来ます。

ウィジェットはホームスクリーンを長押しすることで追加することが出来ますが、
この時Android OSから「ウィジェットを作ります」というブロードキャストしたインテントが
発行されます。
また、ウィジェットを削除した時は「ウィジェットを削除します」というブロードキャストした
インテントが発行されます。

このような「ウィジェットに関連するブロードキャストされたインテント」を受信できる
ブロードキャストレシーバを作成することで、ウィジェットをホームスクリーンに追加したり、
ウィジェットが削除された時にメッセージを出力したりと言った事が可能になります。


■使用する主なクラス
・AppWidgetProvider
「ウィジェットに関連するブロードキャストされたインテント」を受信するクラスです。
BroadcastReceiverクラスを継承しており、受信したブロードキャストインテントの
ハンドリングを行います。


■必要なリソース
・AppWidgetProviderInfoオブジェクトを定義したXMLリソース
ウィジェットのメタデータ(ウィジェットの最小サイズ、使用するレイアウトのリソース、
更新間隔など)を定義します。

・AppWidgetProviderクラスを継承した独自クラス
ウィジェットが作成された時、更新された時、削除された時などの処理を
AppWidgetProviderクラスのメソッドをオーバーライドして記述します。

・ウィジェットのレイアウトファイル
ホームスクリーンに追加された際のウィジェットのレイアウトを定義します。


■実装の流れ
(1)AppWidgetProviderクラスを継承した独自クラスを作成する
AppWidgetProviderクラスで用意されているonUpdateメソッドやonDeletedメソッドを
実装してウィジェットの処理を記述します。

(2)表示するウィジェットのレイアウトを定義する
/res/layout/配下にホームスクリーンに追加された際のウィジェットのレイアウトを定義します。

(3)AppWidgetProviderInfoオブジェクトの定義
/res/xml/配下にウィジェットのメタデータを<appwidget-provider>エレメントを使って
定義します。

(4)マニフェストを設定する
マニフェストファイルにAppWidgetProviderクラスを継承した独自クラスを
ブロードキャストレシーバとして<receiver>エレメントを使って定義します。