各タスクのボタンがタップされたときの処理
各タスクのボタンにsetOnClickListenerメソッドで登録している、onClick時の処理をみていきましょう。
private void createButton(int i,String objId,String taskName) { LinearLayout LLayout = (LinearLayout) findViewById(R.id.main_layout); Button btn = new Button(this);(4) btn.setText(taskName); btn.setTag(objId); btn.setId(i+1); btn.setOnClickListener(new OnClickListener() { public void onClick(View v) { // 各タスクのボタンが押されたら Button btn0 = (Button) findViewById(0);(5) if (btn0.getTag() == null) { // タスクが未選択のとき // タスク名とObjIdのセット Button btn = (Button)v; btn0.setText(btn.getText()); btn0.setTag(btn.getTag()); btn0.setBackgroundColor(Color.RED); getTask((String)btn.getTag());(6) } else { } } }); Space spc = new Space(this); LLayout.addView(spc,600,10); LLayout.addView(btn,600,160); }
btn0はIdが0ですので、「タスクはまだ選択されていません」と表示している一番上のボタンです(5)。そのボタンのgetTagメソッドがnullを返すときは、まだタスクが選択されていない状態なので、選択状態を作って行きます。まず引数として渡ってくるvが押されたボタンなので、Buttonオブジェクトに型変換して、getTextメソッドでタスク名を取得してbtn0にsetTextメソッドでセットします。そして、同様にgetTagメソッドでオブジェクトIDを取得してsetTagメソッドでbtn0にセットします。そして、btn0の背景色をREDにします。これで見た目の変更は完了です。
たとえば、メールサーバー構築を選ぶと、一番上のボタンの背景色が赤くなり、メールサーバー構築とテキスト表示されています。これがタスクを選んだ状態です。
次にNCMBのデータストア上にメールサーバー構築タスクを開始した状態を作成します。getTagメソッドで取得したオブジェクトIDを引数に与え、getTaskメソッドを実行します(6)。
getTaskメソッドでは、やはりクエリを実行するのですが、getInBackgroundメソッドは指定したオブジェクトIDを持つオブジェクトを取得します(1)。
private void getTask(String objId) { NCMBQuery<NCMBObject> query = NCMBQuery.getQuery("TaskClass"); query.getInBackground(objId, new GetCallback<NCMBObject>() {(1) @Override public void done(NCMBObject task, NCMBException e) { if (e == null) { // 成功 createCurTask(task);(2) } else { // エラー } } }); } private void createCurTask(NCMBObject task) { NCMBUser currentUser = NCMBUser.getCurrentUser();(3) // ログデータの作成 NCMBObject curTask = new NCMBObject("CurTaskClass"); curTask.put("task", task); curTask.put("UserName", currentUser.getUsername()); curTask.put("startTime",new Date() ); curTask.saveInBackground(new SaveCallback() { @Override public void done(NCMBException e) { if (e == null) { // オブジェクト保存成功! Toast.makeText(getApplication(), "計測を開始しました!", Toast.LENGTH_SHORT).show(); } else { // 失敗! Toast.makeText(getApplication(), "失敗!", Toast.LENGTH_SHORT).show(); } } }); }
指定したオブジェクトIDを持つtaskオブジェクトが取得できたら、そのオブジェクトを引数にcreateCurTaskメソッドを実行します(2)。createCurTaskメソッドでは、まずNCMBUserクラスのgetCurrentUserメソッドで現在ログインしているユーザー情報を取得します(3)。次にCurTaskClassのオブジェクトcurTaskを作成して、Key-Value形式のフィールドをセットしていきます。最初にセットしているtaskがtaskオブジェクトへの参照です。そして、ログインしているユーザー名、startTimeに現在の日時をセットしてsaveInBackgroundメソッドで非同期に保存します。保存できたら、「計測を開始しました!」と表示します。計測を開始しました!と言っても、実は開始日時を記録するだけの処理なのです。
NCMBのダッシュボードにどのようにtaskオブジェクトへの参照がどのように表現されているかみてみましょう。
次の図は、メールサーバー構築のボタンをタップしたところです。taskフィールドは参照なので、ポインターを見るとボタンで表示されています。
ポインターを見るボタンをクリックすると、TaskClassのメールサーバー構築タスクが表示されますので、参照がちゃんと保存されていることがわかります。