機能追加検討

ええと、閲覧以外の機能、というナニについて ActionBar Hands-on な資料など確認しつつ検討してみることに。あ、Notepad Tutorial も参考にします。ここからが色々な意味でポイント高いというかどう纏めるか、がアレ。
順番てきに

  • 新規にレコード追加
    • 契機としては ActionBar に新規なボタンがあって云々
  • レコード削除
    • アイテム長押しで削除な Contextual ActionBar がナニ
  • レコード修正
    • アイテムをタップしたら (ry

なカンジなのかどうか。
基本的な CRUD 的 i/f があればそれを膨らませて云々、ってことも可能なはず。
なんとなく simplepaint なソレがもの凄く参考になりますね。ハンズオン的には完成版なプロジェクト参考にやってみよう、って手もありですね。あと、SDK なサンプルの NotePad も参考になる模様。
つうか、編集画面への遷移なソレってどうするべきなのかなぁ。

  • 新規の場合は Intent.ACTION_INSERT を setAction する
  • 修正の場合は Intent.ACTION_EDIT を setAction する

あと、修正の時は id とデータを putExtra で Intent に設定で良いのかな。でも

        Intent i = new Intent(this, nextActivity.class);
        i.setAction(Intent.ACTION_INSERT);

みたいなカンジで良いのかどうか。あとは再表示用にデータを取得して表示する処理をリファクタした方が良いのか。

        new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    mList = new JSONArray(JSONFunctions.GETfromURL(BASE_URL + TASKS, mHttpClient));
                } catch (Exception e) {
                    Log.d(TAG, "e is " + e);
                }
                mHandler.post(new Data2List());
            }
        }).start();     

の run の中身を手続きにすれば良さげ。プロトタイプはその版にすれば良いのかな。

とりあえず

盛り込みつつ控えるべき何かがあれば追記の方向にて。

追記

む、よくよく考えたら UI なガワから盛り込んでいく、という手がありますね。そもそもサーバサイドとの i/f はできちゃってるので楽。
とりあえず、ActionBar からということで list_menu.xml として以下を res/menu 配下に投入。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/add"
        android:icon="@android:drawable/ic_menu_add"
        android:showAsAction="ifRoom|withText"
        android:title="作成">
    </item>
    <item
        android:id="@+id/delete"
        android:icon="@android:drawable/ic_menu_delete"
        android:showAsAction="ifRoom|withText"
        android:title="削除">
    </item>

</menu>

で、本体の onCreateOptionsMenu なナニを以下に、なのかな。

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.list_menu, menu);
        return true;
    }

アイコン二つ表示されているのを確認。次は onOptionsItemSelected の追加か。とりあえず以下で。

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.add:
            Toast.makeText(this, "add", Toast.LENGTH_LONG).show();

            return true;
        case R.id.delete:
            Toast.makeText(this, "delete", Toast.LENGTH_LONG).show();

            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

あと、Activity 作るの面倒なので (ぇ コンテキストなんちゃらなソレを盛り込んでおきます。とりあえずガワのみ追加。

    MultiChoiceModeListener mActionModeCalback = new MultiChoiceModeListener() {
        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }

        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            getMenuInflater().inflate(R.menu.list_action, menu);
            mode.setTitle("対象を選択");
            return true;
        }

        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            switch (item.getItemId()) {
                case R.id.delete:
                    // アクションモード終了
                    mode.finish();
                    return true;
                default:
                    return false;
            }
        }

次に onCreate で以下を追加か。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        getListView().setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL);
        getListView().setMultiChoiceModeListener(mActionModeCalback);

あ、あと例の処理をメソドにすれば良いのかな。

        updateList();
    }
    
    private void updateList() {
        new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    mList = new JSONArray(JSONFunctions.GETfromURL(BASE_URL + TASKS, mHttpClient));
                } catch (Exception e) {
                    Log.d(TAG, "e is " + e);
                }
                mHandler.post(new Data2List());
            }
        }).start();    
    }

編集 Activity を作るリキが残っていたら追記します。

さらに

ええとデフォなレイアウトの res/layout/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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".RoRClientActivity" >

    <EditText
        android:id="@+id/edittext"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:inputType="text"
        />

</RelativeLayout>

で、Activity を追加なのか。ガワのみ、ってことで以下。

package jp.shuri.yamanetoshi.rorapiclient;

import android.app.Activity;
import android.os.Bundle;

public class RoRClientEdit extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

あ、あと AndroidManifest.xml に情報追加して

        </activity>
        <activity
            android:name="jp.shuri.yamanetoshi.rorapiclient.RoRClientEdit" >
        </activity>
    </application>

メインな Activity に以下を盛り込んで

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.add:
            Toast.makeText(this, "add", Toast.LENGTH_LONG).show();
            Intent i = new Intent(this, RoRClientEdit.class);
            i.setAction(Intent.ACTION_INSERT);
            startActivity(i);

実行したら一応動きましたね。編集 Activity にボタンが無いのが残念。リストの項目タップして編集画面に情報を引き継げれば mock は完成ですが今日はここで力尽きることにします。失礼します。