近年日本では国民の睡眠時間の減少が見受けられる。 2010年のNHKの調査[1]によると国民全体の平均睡眠時間は平日、土曜、日曜のいずれにおいても以前より短くなっていることが分かる。
特に大学生においては、坂本玲子の研究[2]によると高校生までの規則正しい生活から一変して自分で決める時間割やアルバイトなど自由な生活が送れるようになることが原因とされている。これにより睡眠の不規則化または夜型化になっていく状況に置かれやすくなっている。また高橋 敏治の研究[3]によると、昼間部と夜間部の学生を比べると夜間部の学生は昼間部の学生より就寝時間が遅いことが分かっている。これらのことから、いずれ社会人になる大学生にとってはこのような習慣を改善する方法があるのではないかと感じ、それを解決する方法を考えた。
本研究の目的は大学生活において不規則になった睡眠時間を改善することである。そのために、日々の規則正しい睡眠の習慣づけを目的とするゲーミフィケーションを導入したアプリケーションの開発をする。そして、実際に使用して効果があったかを検証する。 ゲーミフィケーションについては第2章で述べる。
市村らは[4]、家事の一つである掃除に関してゲーミフィケーションを導入している。これにより掃除することに対するモチベーションを持続させることを目標としている。掃除機には加速度を取得できる装置を取り付けている。その装置から情報を得て、PC上で処理して後に、結果に基づいた動作をする仕組みである。具体的な動作として①掃除機の動作の応じたポイントを与える、②リアルタイムにスコアを表示されることで前日のポイントと比較することができる、③掃除の連続回数や掃除開始時のTwitterへの投稿、④投稿がリツイートされた場合の音で通知するといったものである。これらは動作にはゲーミフィケーション要素である「即時フィードバック」、「成長の可視化」が導入されている。結果としてこのシステムを用いた場合、楽しみながら掃除ができることが実証されている。このことからゲーミフィケーションによるモチベーションの維持もしくは向上ができていることが分かる。ゲーミフィケーションの要素については第2章で述べる。
ここではゲーミフィケーションの概念について述べる。
ゲーミフィケーションとは、『非ゲーム的な環境にゲーム的な要素を盛り込むこと』[1]である。これにより、ユーザーのモチベーション向上が見込める。一例として、店舗のポイントカードなどが挙げられる。
ゲーミフィケーションの要素として (1)能動的参加、(2)賞賛演出、(3)即時フィードバック、(4)自己表現、(5)成長の可視化、(6)達成可能な目標が挙げられる[5]。それぞれの要素について説明していく。
この章では作成したアプリケーションに関して述べる。
今回作成したアプリケーションはJava言語を使用して開発したAndroidスマートフォン用アプリケーションである。開発環境はEclipseを用いた。また、実機のAndroidスマートフォンにて実装を行った。
このアプリケーションは睡眠時間を記録することができ、睡眠の習慣付けを目標としている。睡眠の習慣づけのために「成長の可視化」と「達成可能な目標」のゲーミフィケーション要素を用いている。具体的には睡眠時間に応じた評価をみることができ、起床後の食事に関する目標を提示している。仕様として、睡眠時間の記録は端末を動かした場合にその時点で停止するようになっている。これにより就寝前にスマートフォンを使えないようにすることで睡眠を促す効果を狙っている。アラーム機能は備えていないが、それは十分な睡眠を取ることを狙っている。また評価機能があり、起床後にユーザーが設定した食事ができるかどうか、ユーザーが指定した時間より早く起きれたかどうかといった二つの項目で評価される。
アプリケーションの動作の流れを以下の通りである。
アプリを起動して表示される図2のメイン画面が表示される。上部には記録中において睡眠時間が適時表示される。初回記録以降では、画面中央に前回の記録が表示される。これはゲーミフィケーション要素である「成長の可視化」を導入している。メイン画面の下部には「開始準備」「履歴」「停止」の3つのボタンが配置されている。「開始準備」ボタンを押下することで起床時間設定ダイアログの表示、「履歴」ボタンを押下することで履歴確認画面を表示することができる。「停止」ボタンについては記録開始後で使用する。
図3に起床時間設定ダイアログを示す。起床時間設定ダイアログからユーザーは任意の起床時間を設定する。起床時間設定ダイアログではユーザーの起床予定時刻を設定してもらう。ここではゲーミフィケーションの要素である「達成可能な目標」が導入されている。例として、図3では午前8時30分を指定している。任意の時間を設定後、「OK」ボタンを押下することで次のダイアログが表示される。
図4に食事設定ダイアログを示す。食事設定ダイアログではユーザーの起床後の食事を設定してもらう。ここではゲーミフィケーションの要素である「達成可能な目標」を取り入れている。例として図4では「食パン」と入力している。任意の食事を入力後、「OK」ボタンを押下することで次のダイアログが表示される。
図5に設定確認ダイアログを示す。設定確認ダイアログではユーザーが設定した起床時間と起床後の食事を確認することができる。表示されている内容を確認後、「記録開始」ボタンを押下することでメイン画面に戻り、記録が開始される。図6のようにメイン画面上部には現在の記録が表示される。ここで「停止」ボタンを押下する、または端末をある程度動かした場合に次のダイアログが表示される。
図5 設定確認ダイアログ |
図6 記録開始後のメイン画面 |
端末を動かしたかどうか判定する主なソースコードを以下に示す。
public void onSensorChanged(SensorEvent event) { // TODO 自動生成されたメソッド・スタブ float a0 = radianToDegree(orientationValues[0]); float a1 = radianToDegree(orientationValues[1]); float a2 = radianToDegree(orientationValues[2]); if (event.accuracy == SensorManager.SENSOR_STATUS_ACCURACY_LOW) return; switch (event.sensor.getType()) { case Sensor.TYPE_MAGNETIC_FIELD: magneticValues = event.values.clone(); break; case Sensor.TYPE_ACCELEROMETER: accelerometerValues = event.values.clone(); break; } if (magneticValues != null && accelerometerValues != null) { SensorManager.getRotationMatrix(inR, I, accelerometerValues, magneticValues); SensorManager.remapCoordinateSystem(inR, SensorManager.AXIS_X, SensorManager.AXIS_Z, outR); SensorManager.getOrientation(outR, orientationValues); Log.v("Orientation", String.valueOf(radianToDegree(orientationValues[0])) + ", " + String.valueOf(radianToDegree(orientationValues[1])) + ", " + String.valueOf(radianToDegree(orientationValues[2]))); } boolean isOverYaw = (Math.abs(a0) - Math.abs(val0)) > 30; boolean isOverPitch = (Math.abs(a1) - Math.abs(val1)) > 30; boolean isOverRoll = (Math.abs(a2) - Math.abs(val2)) > 30; if (isStart == true) { timeTextView = (TextView) findViewById(R.id.timeTextView); RecordTime.setEndTime(); timeTextView.setText(RT.ViewRecordTime(RT.getStartTime(), RT.getEndTime())); if (isOverYaw || isOverPitch || isOverRoll) { isStart = false; isOver = true; RecordTime.setEndTime(); timeTextView.setText(RT.ViewRecordTime(RT.getStartTime(), RT.getEndTime())); ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<RunningAppProcessInfo> processInfoList = am .getRunningAppProcesses(); for (RunningAppProcessInfo info : processInfoList) { if (info.processName.equals(getPackageName())) { if (info.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { if (isScreenon) ShowCheckDialog(); } } } changeData(); } } val0 = a0; val1 = a1; val2 = a2; }
ここではセンサー値が変化した場合に呼び出されるonSensorChangedを用いて、端末がある程度動いたかを判定を行っている。判定方法としてはonSensorChangedが呼び出されたときのセンサー値と、その直前に呼び出されたときのセンサー値からそれぞれの場合の方位角と傾きを求めて比較している。ここでは30°を超えた場合に端末を動かしたときの処理を行うようにしている。センサー値については加速度センサーと地磁気センサーを取得しており、これらを変換することで方位角と傾きを求めることができる。
図7に食事確認ダイアログを示す。食事確認ダイアログでは質問が表示される。質問の内容は「ユーザーが設定した食事ができる時間があるかどうか」である。その質問に対してユーザーは「はい」ボタンもしくは「いいえ」ボタンを押下することで回答する。いずれかのボタンを押下した後、次のダイアログが表示される。
図8に結果確認ダイアログを示す。結果確認ダイアログでは、記録と質問の回答に応じた結果、またそれらの評価を確認することができる。「OK」ボタンを押下することでメイン画面が表示されて、一連の記録が終了となる
次回以降、メイン画面に前回の記録が表示されるようになる。また「履歴」ボタンを押すことで、いままでの記録を確認することができる。図9に履歴確認画面を示す。履歴確認画面ではこれまでユーザーが記録してきた睡眠時間、その日時と評価が一覧で表示される。「戻る」ボタンを押下するとメイン画面に戻る。ここではゲーミフィケーション要素である「成長の可視化」が導入されている。
この章では行った実験について述べる。
実際にゲーミフィケーションを導入したアプリケーションを使用することで、睡眠にどのような影響があるのかを調べるための実験を行った。
以下の2つのアプリケーションを用いて、自分の睡眠時間を記録した。
(1)に関しては4週間、(2)に関しては1週間に利用して記録した。なお、(1)は(2)の睡眠時間を記録する機能のみで、ゲーミフィケーションを導入していないアプリケーションである。これらの結果から、①「無理なく取り組めたかどうか」、②「十分に寝ることができているかどうか」の2つの項目を検証することで、ゲーミフィケーションを用いたアプリケーションの有用性を示す。
まず睡眠時間のみを記録するアプリケーションを使用した場合の記録を表1と表2、図10と図11に示す。なお、データが0の箇所は未記録であることを示している。
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
図10 1週間目から2週間目の記録結果 | 図11 3週間目から4週間目の記録結果 |
|
1月2日 | 1月3日 | 1月4日 | 1月5日 | 1月6日 | 1月7日 | 1月8日 | |
質問 | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
起床時間 | ○ | ○ | × | ○ | ○ | ○ | ○ |
評価 | ◎ | ◎ | ○ | ◎ | ◎ | ◎ | ◎ |
実験結果について考察する。まずゲーミフィケーションを用いたアプリケーションを使用した場合の記録から、一週間全ての記録を取ることができていることが確認できる。限られた期間ではあるが、継続的にアプリケーションを使用することができている。また表4から分かるように、ほぼ高評価であることからゲーミフィケーション要素である「達成可能な目標」が実現できている。さらにアプリケーション起動時にメイン画面で前回の記録が表示されることで「成長の可視化」も有効に働いたと考えられる。これらのことがモチベーションの維持に繋がり、継続的に記録を取ることができたと考えられる。よって睡眠の記録の関しては無理なく取り組めたと考えられる。次に睡眠時間に関しては、ゲーミフィケーションの有無に関わらず大きな変化は見られなかった。しかしながら生活が乱れやすい年明けにも関わらず、睡眠を確保できていることが結果からわかる。これはゲーミフィケーションを導入したアプリケーションにより意識して睡眠に取り組めたことが要因であると考えられる。このことから睡眠時間をある程度取ることができていると考えられる。これらのことから今回の実験において、ゲーミフィケーションを導入したアプリケーションにより、意識してある程度睡眠を確保することができ、研究目標である睡眠の習慣づけが達成できたと言える。
この章では本研究全体のまとめと、今後の課題を述べる。
年々、日本において国民の睡眠時間の低下が顕著になっている。特に大学生に関してはいままでよりある程度自由な生活ができることから、睡眠の不規則化や夜型になりやすい状況になっている。いずれそのような生活は改善しなければならないと感じ、今回睡眠習慣を改善するためのゲーミフィケーションを導入したアプリケーションを開発した。このアプリケーションは睡眠の記録を取るのみではなく、モチベーションを維持して睡眠を改善していくことを目指した。このアプリケーションを用いて実験を行った。実験の結果からはゲーミフィケーションを導入したアプリケーションを使うことで、意識して睡眠の記録と確保ができた。よって研究目標である睡眠の習慣づけがある程度達成できた。
今後の課題としては、まずどのようにして十分な睡眠を取り続けれるようにするのかが挙げられる。よく寝れたかどうかといった質問も追加して、よく寝れた場合の記録から適した睡眠時間の算出する機能が必要だと感じた。これにより様々なユーザーに対応できると考えられる。また実験では著者のみの記録だったことから、さらに期間を伸ばして複数人のデータを取るべきであった。その結果から良い睡眠の習慣づけの方法の模索を今後の課題としたい。
本研究を進めるにあたり、ご指導頂いた工学部情報通信工学科ネットワークシステム研究室 坂本 直志 教授に感謝します。 また日常の議論を通じて多くの知識や示唆を頂いたネットワークシステム研究室の皆様に感謝します。
本研究で作成したソースコードを以下に示す。
MainActivity.java (メイン画面)
package com.example.sleep; import java.util.List; import com.example.sleep.R; import android.annotation.SuppressLint; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.RunningAppProcessInfo; import android.app.AlertDialog; import android.app.FragmentManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.database.sqlite.SQLiteDatabase; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.view.WindowManager; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.TextView; @SuppressLint("SimpleDateFormat") public class MainActivity extends Activity implements SensorEventListener { private SensorManager sm; private float val0; private float val1; private float val2; private static final int MATRIX_SIZE = 16; float[] inR = new float[MATRIX_SIZE]; float[] outR = new float[MATRIX_SIZE]; float[] I = new float[MATRIX_SIZE]; float[] orientationValues = new float[3]; float[] magneticValues = new float[3]; float[] accelerometerValues = new float[3]; static SleepRecordDao dao; private SQLiteDatabase db; private DBHelper helper; private static LinearLayout showData; private EditText dataEdit; private boolean IsMagSensor; private boolean IsAccSensor; private static boolean isStart = false; private static boolean isOver = false; boolean isScreenon = true; private static TextView timeTextView; public static RecordTime RT = new RecordTime(); String TAG = getClass().getSimpleName(); BroadcastReceiver onReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.v(TAG, "onReceive()"); isScreenon = true; } }; BroadcastReceiver offReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.v(TAG, "onReceive()"); isScreenon = false; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); IntentFilter onfilter = new IntentFilter(Intent.ACTION_SCREEN_ON); try { registerReceiver(onReceiver, onfilter); } catch (RuntimeException e) { } IntentFilter offfilter = new IntentFilter(Intent.ACTION_SCREEN_OFF); try { registerReceiver(offReceiver, offfilter); } catch (RuntimeException e) { } getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); sm = (SensorManager) this.getSystemService(SENSOR_SERVICE); Button stopbtn = (Button) findViewById(R.id.stopbtn); stopbtn.setOnClickListener(getOnClickStopListener()); Button historybtn = (Button) findViewById(R.id.history); historybtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent subintent = new Intent(MainActivity.this, SubActivity.class); if (!isStart) startActivity(subintent); } }); Button testbtn = (Button) findViewById(R.id.startbtn); testbtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (isStart == false) { FragmentManager manager = getFragmentManager(); TimeDialogFragment dialog = new TimeDialogFragment(); dialog.show(manager, null); } } }); helper = new DBHelper(this, null, 1); db = helper.getReadableDatabase(); dao = new SleepRecordDao(db); showData = (LinearLayout) findViewById(R.id.showData); changeData(); } public static OnClickListener getOnClickListener() { return new OnClickListener() { @Override public void onClick(View v) { if (isStart == false) { v.getContext().startService( new Intent(v.getContext(), MainService.class)); RecordTime.setStartTime(); isStart = true; } } }; } public OnClickListener getOnClickStopListener() { return new OnClickListener() { @Override public void onClick(View v) { if (isStart == true) { RecordTime.setEndTime(); timeTextView = (TextView) findViewById(R.id.timeTextView); timeTextView.setText(RT.ViewRecordTime(RT.getStartTime(), RT.getEndTime())); isStart = false; FragmentManager manager = getFragmentManager(); CheckDialogFragment dialog = new CheckDialogFragment(); dialog.show(manager, null); changeData(); } } }; } @Override protected void onStart() { super.onStart(); System.out.println("onstart"); } @Override public void onResume() { super.onResume(); List<Sensor> sensors = sm.getSensorList(Sensor.TYPE_ALL); for (Sensor sensor : sensors) { if (sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { sm.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL); IsMagSensor = true; } if (sensor.getType() == Sensor.TYPE_ACCELEROMETER) { sm.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL); IsAccSensor = true; } } if (isOver == true) { ShowCheckDialog(); } } protected void onPause() { super.onPause(); if (isStart == false) sm.unregisterListener(this); } @Override protected void onStop() { super.onStop(); if (isStart == false) { sm.unregisterListener(this); } } @Override protected void onRestart() { super.onRestart(); if (isStart == false) sm.unregisterListener(this); } @Override public void onDestroy() { super.onDestroy(); sm.unregisterListener(this); unregisterReceiver(offReceiver); unregisterReceiver(onReceiver); db.close(); if (IsMagSensor || IsAccSensor) { sm.unregisterListener(this); IsMagSensor = false; IsAccSensor = false; } } public void ShowCheckDialog() { FragmentManager manager = getFragmentManager(); CheckDialogFragment dialog = new CheckDialogFragment(); dialog.show(manager, null); isOver = false; } @Override public void onAccuracyChanged(Sensor sonsor, int accuracy) { // TODO 自動生成されたメソッド・スタブ trace("onAccuracyChanged : " + accuracy); } @Override public void onSensorChanged(SensorEvent event) { // TODO 自動生成されたメソッド・スタブ float a0 = radianToDegree(orientationValues[0]); float a1 = radianToDegree(orientationValues[1]); float a2 = radianToDegree(orientationValues[2]); if (event.accuracy == SensorManager.SENSOR_STATUS_ACCURACY_LOW) return; switch (event.sensor.getType()) { case Sensor.TYPE_MAGNETIC_FIELD: magneticValues = event.values.clone(); break; case Sensor.TYPE_ACCELEROMETER: accelerometerValues = event.values.clone(); break; } if (magneticValues != null && accelerometerValues != null) { SensorManager.getRotationMatrix(inR, I, accelerometerValues, magneticValues); SensorManager.remapCoordinateSystem(inR, SensorManager.AXIS_X, SensorManager.AXIS_Z, outR); SensorManager.getOrientation(outR, orientationValues); Log.v("Orientation", String.valueOf(radianToDegree(orientationValues[0])) + ", " + String.valueOf(radianToDegree(orientationValues[1])) + ", " + String.valueOf(radianToDegree(orientationValues[2]))); } boolean isOverYaw = (Math.abs(a0) - Math.abs(val0)) > 30; boolean isOverPitch = (Math.abs(a1) - Math.abs(val1)) > 30; boolean isOverRoll = (Math.abs(a2) - Math.abs(val2)) > 30; if (isStart == true) { timeTextView = (TextView) findViewById(R.id.timeTextView); RecordTime.setEndTime(); timeTextView.setText(RT.ViewRecordTime(RT.getStartTime(), RT.getEndTime())); if (isOverYaw || isOverPitch || isOverRoll) { isStart = false; isOver = true; RecordTime.setEndTime(); timeTextView.setText(RT.ViewRecordTime(RT.getStartTime(), RT.getEndTime())); ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<RunningAppProcessInfo> processInfoList = am .getRunningAppProcesses(); for (RunningAppProcessInfo info : processInfoList) { if (info.processName.equals(getPackageName())) { if (info.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { if (isScreenon) ShowCheckDialog(); } } } changeData(); } } val0 = a0; val1 = a1; val2 = a2; } int radianToDegree(float rad) { return (int) Math.floor(Math.toDegrees(rad)); } private void trace(String msg) { // TODO 自動生成されたメソッド・スタブ } public void addData(View view) { dao.insert(dataEdit.getText().toString()); changeData(); } private void changeData() { showData.removeAllViews(); List<DBEntity> entityList = dao.getLastData(); for (DBEntity entity : entityList) { final TextView LastRecordView = (TextView) findViewById(R.id.lastrecordtime); LastRecordView.setText("前回の記録 " + entity.getTime() + " " + entity.getAssess()); } } public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (isStart == false) { return super.onKeyDown(keyCode, event); } else { AlertDialog.Builder ad = new AlertDialog.Builder(this); ad.setMessage(getString(R.string.endMessage)); ad.setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { finish(); } }); ad.setNegativeButton(getString(R.string.no), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { } }); ad.create(); ad.show(); return false; } } else { return super.onKeyDown(keyCode, event); } } public static String getTimeTextView() { // TODO 自動生成されたメソッド・スタブ return timeTextView.getText().toString(); } }
SubActivity.java (履歴確認画面)
package com.example.sleep; import java.util.List; import android.app.Activity; import android.database.sqlite.SQLiteDatabase; import android.graphics.Color; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.view.WindowManager; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; public class SubActivity extends Activity { private SleepRecordDao dao; private LinearLayout showData; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.sub_main); Button backbtn = (Button) findViewById(R.id.backbtn); backbtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { finish(); } }); DBHelper helper = new DBHelper(this, null, 1); SQLiteDatabase db = helper.getReadableDatabase(); dao = new SleepRecordDao(db); showData = (LinearLayout) findViewById(R.id.showData); changeData(); } private void changeData() { showData.removeAllViews(); List<DBEntity> entityList = dao.findAll(); for (DBEntity entity : entityList) { TextView textView = new TextView(this); textView.setTextColor(Color.WHITE); textView.setTextSize(24.0f); textView.setText(entity.getRowId() + " : " + entity.getAssess() +"\n" + entity.getRecord()+"\n 経過時間: "+entity.getTime()+"\n"); showData.addView(textView); } } }
TimeDialogFragment.java (起床時間設定ダイアログ)
package com.example.sleep; import java.util.Calendar; import android.app.Dialog; import android.app.DialogFragment; import android.app.FragmentManager; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.view.WindowManager; import android.widget.TimePicker; public class TimeDialogFragment extends DialogFragment { private static int SetHour; private static int SetMinute; private static Calendar cal; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { Dialog Timedialog = new Dialog(getActivity()); Timedialog.setCanceledOnTouchOutside(false); Timedialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); Timedialog.getWindow().setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); Timedialog.setContentView(R.layout.timedialog); Timedialog.getWindow().setBackgroundDrawable( new ColorDrawable(Color.TRANSPARENT)); final TimePicker timepicker = (TimePicker) Timedialog .findViewById(R.id.time_picker); timepicker.setIs24HourView(true); Timedialog.findViewById(R.id.positive_button).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { SetHour = timepicker.getCurrentHour(); SetMinute = timepicker.getCurrentMinute(); cal = Calendar.getInstance(); cal.setTimeInMillis(System.currentTimeMillis()); // 設定した時刻をカレンダーに設定 //cal.set(Calendar.DAY_OF_YEAR, Calendar.DAY_OF_YEAR); cal.set(Calendar.HOUR_OF_DAY, SetHour); cal.set(Calendar.MINUTE, SetMinute); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); if (cal.getTimeInMillis() < System.currentTimeMillis()) { cal.add(Calendar.DAY_OF_YEAR, 1); } FragmentManager manager = getFragmentManager(); EatDialogFragment dialog = new EatDialogFragment(); dialog.show(manager, "dialog"); dismiss(); } }); Timedialog.findViewById(R.id.close_button).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { dismiss(); } }); return Timedialog; } public static Calendar getSetCalender() { return cal; } static int getSetHour() { return SetHour; } static int getSetMinute() { return SetMinute; } }
EatDialogFragment.java (食事設定ダイアログ)
package com.example.sleep; import android.app.Dialog; import android.app.DialogFragment; import android.app.FragmentManager; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.text.SpannableStringBuilder; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.view.WindowManager; import android.widget.EditText; public class EatDialogFragment extends DialogFragment { String setFoodName = null; private static SpannableStringBuilder FoodName; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Dialog Eatdialog = new Dialog(getActivity()); Eatdialog.setCanceledOnTouchOutside(false); Eatdialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); Eatdialog.getWindow().setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); Eatdialog.setContentView(R.layout.eatdialog); Eatdialog.getWindow().setBackgroundDrawable( new ColorDrawable(Color.TRANSPARENT)); final EditText editFoodName = (EditText) Eatdialog .findViewById(R.id.editfoodname); Eatdialog.findViewById(R.id.positive_button).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { setFoodName = editFoodName.getText().toString(); if (!isBlank(editFoodName.getText().toString())) { FragmentManager manager = getFragmentManager(); StartDialogFragment dialog = new StartDialogFragment(); FoodName = (SpannableStringBuilder) editFoodName .getText(); dialog.show(manager, "dialog"); dismiss(); } } }); Eatdialog.findViewById(R.id.close_button).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { dismiss(); } }); return Eatdialog; } public static boolean isBlank(String str) { if (str == null || str.length() == 0) return true; int l = str.length(); for (int i = 0; i < l; i++) { if (!Character.isWhitespace(str.codePointAt(i))) return false; } return true; } static SpannableStringBuilder getFoodName() { return FoodName; } }
StartDialogFragment.java (設定確認ダイアログ)
package com.example.sleep; import java.util.Date; import android.app.Dialog; import android.app.DialogFragment; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.view.WindowManager; import android.widget.TextView; public class StartDialogFragment extends DialogFragment { private static Date date = new Date(); @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Dialog Startdialog = new Dialog(getActivity()); Startdialog.setCanceledOnTouchOutside(false); Startdialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); Startdialog.getWindow().setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); Startdialog.setContentView(R.layout.startdialog); Startdialog.getWindow().setBackgroundDrawable( new ColorDrawable(Color.TRANSPARENT)); TextView time = (TextView) Startdialog.findViewById(R.id.settime); time.setText("設定した時刻 "+TimeDialogFragment.getSetHour()+"時"+TimeDialogFragment.getSetMinute()+"分"); TextView food = (TextView) Startdialog.findViewById(R.id.foodname); food.setText("設定した朝食 "+EatDialogFragment.getFoodName()); Startdialog.findViewById(R.id.positive_button).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { v.setOnClickListener(MainActivity.getOnClickListener()); v.callOnClick(); dismiss(); } }); Startdialog.findViewById(R.id.close_button).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { dismiss(); } }); return Startdialog; } static Date getStartDate(){ return date; } }
CheckDialogFragment.java(食事確認ダイアログ)
package com.example.sleep; import android.app.Dialog; import android.app.DialogFragment; import android.app.FragmentManager; import android.content.Intent; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.view.WindowManager; import android.widget.TextView; public class CheckDialogFragment extends DialogFragment { String setFoodName = null; private static int id; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Dialog Checkdialog = new Dialog(getActivity()); Checkdialog.setCanceledOnTouchOutside(false); Checkdialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); Checkdialog.getWindow().setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); Checkdialog.setContentView(R.layout.checkdialog); Checkdialog.getWindow().setBackgroundDrawable( new ColorDrawable(Color.TRANSPARENT)); this.setCancelable(false); TextView food = (TextView) Checkdialog.findViewById(R.id.foodname); food.setText("「" + EatDialogFragment.getFoodName() + "」を食べる時間はありますか?"); Checkdialog.findViewById(R.id.positive_button).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { FragmentManager manager = getFragmentManager(); ResultDialogFragment dialog = new ResultDialogFragment(); v.getContext().stopService(new Intent(v.getContext(),MainService.class)); id=v.getId(); dialog.show(manager, "dialog"); dismiss(); } }); Checkdialog.findViewById(R.id.negative_button).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { FragmentManager manager = getFragmentManager(); ResultDialogFragment dialog = new ResultDialogFragment(); v.getContext().stopService(new Intent(v.getContext(),MainService.class)); dialog.show(manager, "dialog"); id=v.getId(); dismiss(); } }); return Checkdialog; } static int getbtnId(){ return id; } }
ResultDialogFragment.java (結果確認ダイアログ)
package com.example.sleep; import java.text.SimpleDateFormat; import java.util.Calendar; import android.app.Dialog; import android.app.DialogFragment; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.view.WindowManager; import android.widget.TextView; public class ResultDialogFragment extends DialogFragment { int score = 0; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Dialog Resultdialog = new Dialog(getActivity()); RecordTime RT = new RecordTime(); Resultdialog.setCanceledOnTouchOutside(false); Resultdialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); Resultdialog.getWindow().setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN); Resultdialog.setContentView(R.layout.resultdialog); Resultdialog.getWindow().setBackgroundDrawable( new ColorDrawable(Color.TRANSPARENT)); TextView sleepingtime = (TextView) Resultdialog .findViewById(R.id.hours_of_sleep); TextView checkontime = (TextView) Resultdialog .findViewById(R.id.ontime); TextView checkeat = (TextView) Resultdialog.findViewById(R.id.checkeat); TextView evaluation = (TextView) Resultdialog .findViewById(R.id.total_evaluation); String btnid = String.valueOf(CheckDialogFragment.getbtnId()); Calendar cln = Calendar.getInstance(); sleepingtime.setText("継続時間" + RT.ViewRecordTime(RT.getStartTime(), RT.getEndTime())); DoEat(checkeat, btnid); int diff = cln.compareTo(TimeDialogFragment.getSetCalender()); ValueonTime(checkontime, diff); TotalEvaluation(evaluation); String START = new SimpleDateFormat("MM/dd HH:mm:ss").format(RT .getStartTime()); String END = new SimpleDateFormat("MM/dd HH:mm:ss").format(RT .getEndTime()); MainActivity.dao.doAddinsert(MainActivity.getTimeTextView(), START + " ~ " + END, " " + evaluation.getText().toString()); Resultdialog.findViewById(R.id.positive_button).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { score = 0; dismiss(); } }); Resultdialog.findViewById(R.id.close_button).setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { score = 0; dismiss(); } }); return Resultdialog; } private void DoEat(TextView checkeat, String btnid) { System.out.println(btnid); if (btnid.equals("2131034183")) { checkeat.setText("食事:○"); score += 1; } else if (btnid.equals("2131034184")) { checkeat.setText("食事:×"); } } private void ValueonTime(TextView checkontime, int diff) { if (diff < 0) { checkontime.setText("起床時間:○"); score += 1; } else { checkontime.setText("起床時間:×"); } } private void TotalEvaluation(TextView evaluation) { if (score > 1) { evaluation.setText("総合評価:◎"); } else if (score > 0) { evaluation.setText("総合評価:○"); } else { evaluation.setText("総合評価:△"); } } }
DBEntity.java
package com.example.sleep; public class DBEntity { private int rowId; private String record; private String time; private String assess; public void setRowId(int rowId) { this.rowId = rowId; } public int getRowId() { return rowId; } public void setTime(String time) { this.time = time; } public String getTime() { return time; } public void setRecord(String record) { this.record = record; } public String getRecord() { return record; } public void setAssess(String assess) { this.assess = assess; } public String getAssess() { return assess; } }
DBHelper.java
package com.example.sleep; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; public class DBHelper extends SQLiteOpenHelper { private static final String DB_NAME = "recorddb"; private static final String CREATE_TABLE_SQL = "" + "create table recorddb (" + "rowid integer primary key autoincrement, " + "data text not null," + "day text not null," + "assess text not null" + ")"; private static final String DROP_TABLE_SQL = "drop table if exists recorddb"; public DBHelper(Context context, CursorFactory factory, int version) { super(context, DB_NAME, factory, version); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_TABLE_SQL); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL(DROP_TABLE_SQL); db.execSQL(CREATE_TABLE_SQL); } }
MainService.java
package com.example.sleep; import android.app.Notification; import android.app.NotificationManager; import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.IBinder; import android.support.v4.app.NotificationCompat; //import android.util.Log; public class MainService extends Service { private static final int START_STICKY = 1; @Override public void onCreate() { } protected void onHandleIntent(Intent intent) { } @Override public int onStartCommand(Intent intent, int flags, int startId) { Notification notification = new NotificationCompat.Builder(this) .setContentTitle("睡眠時間記録中").setContentText("睡眠時間を記録しています") .setSmallIcon(R.drawable.ic_launcher).build(); NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); manager.notify(1, notification); startForeground(1, notification); return START_STICKY; } @Override public void onDestroy() { super.onDestroy(); stopSelf(); } @Override public IBinder onBind(Intent intent) { // TODO 自動生成されたメソッド・スタブ return null; } }
RecordTime.java
package com.example.sleep; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStream; import android.app.Activity; public class RecordTime extends Activity { private int second; private int min; private int hour; private long time; private static long EndTime; private static long StartTime; ByteArrayOutputStream str = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(str); public static void setStartTime() { StartTime = System.currentTimeMillis(); } public static void setEndTime() { EndTime = System.currentTimeMillis(); } public long getStartTime() { return StartTime; } public long getEndTime() { return EndTime; } public String ViewRecordTime(long starttime, long stoptime) { time = stoptime - starttime; time /= 1000; second = (int) (time % 60); time /= 60; min = (int) (time % 60); time /= 60; hour = (int) (time % 60); ByteArrayOutputStream str = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(str); ps.printf("%1$02d:%2$02d:%3$02d", hour, min, second); try { str.close(); } catch (IOException e) { } ps.close(); return str.toString(); } }
SleepRecordDao.java
package com.example.sleep; import java.util.ArrayList; import java.util.List; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; public class SleepRecordDao { private static final String TABLE_NAME = "recorddb"; private static final String COLUMN_ID = "rowid"; private static final String COLUMN_DATA = "data"; private static final String COLUMN_DAY = "day"; private static final String COLUMN_ASSESS = "assess"; private static final String[] COLUMNS = { COLUMN_ID, COLUMN_DATA, COLUMN_DAY,COLUMN_ASSESS }; private SQLiteDatabase db; public SleepRecordDao(SQLiteDatabase db) { this.db = db; } public List<DBEntity> findAll() { List<DBEntity> entityList = new ArrayList<DBEntity>(); Cursor cursor = db.query(TABLE_NAME, COLUMNS, null, null, null, null, COLUMN_ID); while (cursor.moveToNext()) { DBEntity entity = new DBEntity(); entity.setRowId(cursor.getInt(0)); entity.setTime(cursor.getString(1)); entity.setRecord(cursor.getString(2)); entity.setAssess(cursor.getString(3)); entityList.add(entity); } return entityList; } public DBEntity findById(int rowId) { String selection = COLUMN_ID + "=" + rowId; Cursor cursor = db.query(TABLE_NAME, COLUMNS, selection, null, null, null, null); cursor.moveToNext(); DBEntity entity = new DBEntity(); entity.setRowId(cursor.getInt(0)); entity.setTime(cursor.getString(1)); entity.setRecord(cursor.getString(2)); entity.setAssess(cursor.getString(3)); return entity; } public long insert(String value) { ContentValues values = new ContentValues(); values.put(COLUMN_DATA, value); return db.insert(TABLE_NAME, null, values); } public void doAddinsert(String value, String day,String assess) { ContentValues values = new ContentValues(); values.put(COLUMN_DATA, value); values.put(COLUMN_DAY, day); values.put(COLUMN_ASSESS, assess); db.insert(TABLE_NAME, null, values); } public int update(DBEntity entity) { ContentValues values = new ContentValues(); values.put(COLUMN_DATA, entity.getRecord()); String whereClause = COLUMN_ID + "=" + entity.getRowId(); return db.update(TABLE_NAME, values, whereClause, null); } public int delete(int rowId) { String whereClause = COLUMN_ID + "=" + rowId; return db.delete(TABLE_NAME, whereClause, null); } public List<DBEntity> getLastData() { List<DBEntity> entityList = new ArrayList<DBEntity>(); Cursor cursor = db.query(TABLE_NAME, COLUMNS, null, null, null, null, COLUMN_ID); DBEntity entity = new DBEntity(); while (cursor.moveToNext()) { entity.setRowId(cursor.getInt(0)); entity.setTime(cursor.getString(1)); entity.setRecord(cursor.getString(2)); entity.setAssess(cursor.getString(3)); entityList.add(entity); } return entityList; } }
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/black" tools:context="com.example.sleep.MainActivity" > <ScrollView android:id="@+id/ScrollView" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true" > <LinearLayout android:id="@+id/showData" android:layout_width="wrap_content" android:layout_height="230dp" android:layout_marginTop="0dp" android:orientation="vertical" android:padding="0px" android:textSize="18sp" > </LinearLayout> </ScrollView> <TextView android:id="@+id/timeTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:layout_marginTop="57dp" android:text="@string/_00_00_00" android:textColor="@color/white" android:textSize="30sp" /> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentTop="true" /> <Button android:id="@+id/stopbtn" android:layout_width="100dip" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:background="@drawable/button_corners" android:text="@string/stop" android:textColor="@color/black" /> <Button android:id="@+id/startbtn" android:layout_width="100dip" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:background="@drawable/button_corners" android:text="@string/setting" android:textColor="@color/black" /> <TextView android:id="@+id/lastrecordtime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="" android:textColor="@color/white" android:textSize="24sp" /> <Button android:id="@+id/history" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:background="@drawable/button_corners" android:text="@string/history" android:textColor="@color/black" /> </RelativeLayout>
sub_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/black" tools:context="com.example.sleep.SubActivity" > <ScrollView android:id="@+id/ScrollView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/backbtn" android:fillViewport="true" > <LinearLayout android:id="@+id/showData" android:layout_width="wrap_content" android:layout_height="230dp" android:layout_marginTop="0dp" android:orientation="vertical" android:padding="0px" android:textSize="18sp" > </LinearLayout> </ScrollView> <ListView android:id="@+id/listView1" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/backbtn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:background="@drawable/button_corners" android:text="@string/back" android:textColor="@color/black" /> </RelativeLayout>
timedialog.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginLeft="6dp" android:layout_marginRight="6dp" android:layout_marginTop="6dp" android:background="@drawable/bg_dialog" android:gravity="center_horizontal" android:orientation="vertical" android:paddingBottom="20dp" > <TextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/bg_dialog_title" android:padding="10dp" android:text="@string/settimedialogtitle" android:textColor="@color/black" android:textSize="18sp" /> <TextView android:id="@+id/message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="20dp" android:lineSpacingExtra="6dp" android:text="@string/settimedialogMessage" android:textColor="#333333" android:textSize="16sp" /> <TimePicker android:id="@+id/time_picker" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/positive_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="6dp" android:background="@drawable/bt_dialog_positive" android:text="@string/OK" android:textColor="@android:color/white" /> </LinearLayout> <Button android:id="@+id/close_button" android:layout_width="40dp" android:layout_height="40dp" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:background="@drawable/bt_dialog_close" android:text="@string/close" android:textColor="#9acd32" /> </RelativeLayout>
eatdialog.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginLeft="6dp" android:layout_marginRight="6dp" android:layout_marginTop="6dp" android:background="@drawable/bg_dialog" android:gravity="center_horizontal" android:orientation="vertical" android:paddingBottom="20dp" > <TextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/bg_dialog_title" android:padding="10dp" android:text="@string/whateat_title" android:textColor="@color/black" android:textSize="18sp" /> <TextView android:id="@+id/message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="20dp" android:lineSpacingExtra="6dp" android:text="@string/whateat_message" android:textColor="#333333" android:textSize="16sp" /> <EditText android:inputType="text" android:id="@+id/editfoodname" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="" android:ems="10" > <requestFocus /> </EditText> <Button android:id="@+id/positive_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="6dp" android:background="@drawable/bt_dialog_positive" android:text="@string/OK" android:textColor="@android:color/white" /> </LinearLayout> <Button android:id="@+id/close_button" android:layout_width="40dp" android:layout_height="40dp" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:background="@drawable/bt_dialog_close" android:text="@string/close" android:textColor="#9acd32" /> </RelativeLayout>
startdialog.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginLeft="6dp" android:layout_marginRight="6dp" android:layout_marginTop="6dp" android:background="@drawable/bg_dialog" android:gravity="center_horizontal" android:orientation="vertical" android:paddingBottom="20dp" > <TextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/bg_dialog_title" android:padding="10dp" android:text="@string/startdialog_title" android:textColor="@color/black" android:textSize="18sp" /> <TextView android:id="@+id/message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="20dp" android:lineSpacingExtra="6dp" android:text="@string/startdialog_message" android:textColor="#333333" android:textSize="16sp" /> <TextView android:id="@+id/settime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/foodname" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" android:textAppearance="?android:attr/textAppearanceLarge" /> <Button android:id="@+id/positive_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="6dp" android:background="@drawable/bt_dialog_positive" android:text="@string/start" android:textColor="@android:color/white" /> </LinearLayout> <Button android:id="@+id/close_button" android:layout_width="40dp" android:layout_height="40dp" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:background="@drawable/bt_dialog_close" android:text="@string/close" android:textColor="#9acd32" /> </RelativeLayout>
checkdialog.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginLeft="6dp" android:layout_marginRight="6dp" android:layout_marginTop="6dp" android:background="@drawable/bg_dialog" android:gravity="center_horizontal" android:orientation="vertical" android:paddingBottom="20dp" > <TextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/bg_dialog_title" android:padding="10dp" android:text="@string/check_title" android:textColor="@color/black" android:textSize="18sp" /> <TextView android:id="@+id/message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="20dp" android:lineSpacingExtra="6dp" android:text="@string/check_message" android:textColor="#333333" android:textSize="16sp" /> <TextView android:id="@+id/settime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/foodname" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" android:textAppearance="?android:attr/textAppearanceLarge" /> <Button android:id="@+id/positive_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="6dp" android:background="@drawable/bt_dialog_positive" android:text="@string/yesbtn" android:textColor="@android:color/white" /> <Button android:id="@+id/negative_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="6dp" android:background="@drawable/bt_dialog_positive" android:text="@string/nobtn" android:textColor="@android:color/white" /> </LinearLayout> </RelativeLayout>
resultdialog.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_marginLeft="6dp" android:layout_marginRight="6dp" android:layout_marginTop="6dp" android:background="@drawable/bg_dialog" android:gravity="center_horizontal" android:orientation="vertical" android:paddingBottom="20dp" > <TextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/bg_dialog_title" android:padding="10dp" android:text="@string/result_title" android:textColor="@color/black" android:textSize="18sp" /> <TextView android:id="@+id/checkeat" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" android:textColor="#333333" /> <TextView android:id="@+id/ontime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" /> <TextView android:id="@+id/hours_of_sleep" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=""/> <TextView android:id="@+id/total_evaluation" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" android:textAppearance="?android:attr/textAppearanceLarge" /> <Button android:id="@+id/positive_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="6dp" android:background="@drawable/bt_dialog_positive" android:text="@string/OK" android:textColor="@android:color/white" /> </LinearLayout> <Button android:id="@+id/close_button" android:layout_width="40dp" android:layout_height="40dp" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:background="@drawable/bt_dialog_close" android:text="@string/close" android:textColor="#9acd32" /> </RelativeLayout>
bg_dialog_title.xml
<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" > </animation-list>
bg_dialog.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <corners android:radius="5dp" /> <stroke android:width="2dp" android:color="#9acd32" /> <gradient android:angle="90" android:endColor="#dcdcdc" android:startColor="#ffffff" /> </shape>
bg_title.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <corners android:topLeftRadius="5dp" android:topRightRadius="5dp" /> <solid android:color="#9acd32" /> </shape>
bt_dialog_close.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > <solid android:color="@android:color/white" /> <stroke android:width="3dp" android:color="#9acd32" /> </shape>
bt_dialog_positive.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <corners android:radius="5dp" /> <solid android:color="#9acd32" /> </shape>
button_corners.xml
< xml version="1.0" encoding="utf-8" > <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="false"> <shape android:shape="rectangle"> <solid android:color="#ff4effa5"/> <stroke android:width="1dp" android:color="#fffdfdfd"/> <corners android:radius="4dp"/> <padding android:top="8dp" android:left="16dp" android:bottom="8dp" android:right="16dp"/> </shape> </item> <item android:state_pressed="true"> <shape android:shape="rectangle"> <solid android:color="#ff409048"/> <stroke android:width="1dp" android:color="#fffdfdfd"/> <corners android:radius="4dp"/> <padding android:top="8dp" android:left="16dp" android:bottom="8dp" android:right="16dp"/> </shape> </item> </selector>
main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.b01.MainActivity" > <item android:id="@+id/action_settings" android:orderInCategory="100" android:title="@string/action_settings" app:showAsAction="never"/> </menu>
colors.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="white">#FFFFFF</color> <color name="black">#000000</color> <color name="blue">#0000FF</color> <color name="red">#FF0000</color> <color name="yellow">#FFFF00</color> <color name="green">#00FF00</color> <color name="purple">#9900CC</color> <color name="pink">#FF00FF</color> <color name="gray">#BEBEBE</color> <color name="ivory">#EEEEE0</color> <color name="orange">#FF9900</color> <color name="brown">#CC9900</color> <color name="cream">#FFFFCC</color> <color name="darkcyan">#008B8B</color> <color name="lightyellow">#ffffE0</color> <color name="wheat">#F5DEB3</color> <color name="slateblue">#6A5ACD</color> </resources>
strings.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">sleep</string> <string name="action_settings">Settings</string> <string name="endMessage">アプリを終了しますか?</string> <string name="yes">終了する</string> <string name="no">アプリへ戻る</string> <string name="_00_00_00">00:00:00</string> <string name="stop">停止</string> <string name="setting">記録準備</string> <string name="start">記録開始</string> <string name="history">履歴</string> <string name="back">戻る</string> <string name="settimedialogMessage">起床する時刻を選択してください。</string> <string name="settimedialogtitle">起床時間の設定</string> <string name="whateat_title">起きたら何を食べますか?</string> <string name="whateat_message">食べるものを入力してください。</string> <string name="startdialog_title">設定完了</string> <string name="startdialog_message"> 記録開始ボタンを押すと記録が開始されます。 テーブルなどの安定する場所に置いて記録を開始してください。</string> <string name="OK">OK</string> <string name="close">X</string> <string name="check_title">確認</string> <string name="check_message">以下のことを確認してボタンを押してください</string> <string name="result_title">今回の結果</string> <string name="result_message">以下のような結果になりました。</string> <string name="yesbtn">はい</string> <string name="nobtn">いいえ</string> </resources>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.sleep" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" /> <uses-permission android:name="android.permission.GET_TASKS" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.sleep.MainActivity" android:label="@string/app_name" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name="MainService" android:enabled="true" > </service> <activity android:name="com.example.sleep.SubActivity" > </activity> <activity android:name="CheckDialogFragment" android:launchMode="singleInstance" android:theme="@android:style/Theme.Translucent.NoTitleBar" > </activity> </application> </manifest>