無料ブログはココログ

« 2013年8月 | トップページ | 2018年4月 »

2013年9月

2013年9月26日 (木)

プリファレンスアクティビティ

Preferenceact3gattai_2
 先の「プリファレンス」に関連するものとして「プリファレンスアクティビティ」も実装した。
 Androidにはユーザと対話してプリファレンスのデータを編集し結果を記入してくれる高機能なアクティビティがあり、それを使うためのAPIが用意されている。プログラマとしては設定ファイルを用意せずに済み、ユーザインターフェースのコードも大幅に削減されるのでおおいに助かる。ただ高機能な分、Mindに実装するには手間がかかった。

 まず呼び出し元から。
 呼び出し先である本機能はダイアログ的に見えるがダイアログではなく独立したアクティビティなので本機能を呼び出すには一般的なアクティビティ起動と同じ手順を踏む。

   (Mindソース例)
    私のパッケージ名と "PreferenceActSub"で インテントを実行し _結果に 入れ

 次に本機能を実行するアクティビティについて。
 通常のアクティビティとは異なり、プリファレンスのGUIパーツの描画のみを記述する。
 Androidの標準的な開発手法では、設定画面のフォーマットをXMLファイルで記入するらしい。このあたりはレイアウト系の実装と同じ事情になるが、Mindでそのようなファイルを扱うことは避けたかったのであくまでJavaのコードで設定画面を作る方式をベースとし、そのJavaのコードをMindから駆動するようにした。
 書籍やWeb上の情報にはJavaコードでデザインをおこなう例が少なく困ったが、コードでの駆動方法を把握するのに以下のWebページは大変参考になった。

    「Preference(3)-Preference画面に関するTips - 愚鈍人」
    http://ichitcltk.hustle.ne.jp/gudon/modules/pico_rd/index.php?content_id=96#use_code

 上記Webページにおいて、スクリーンの設定は以下のようになっている。

    public class MyPreferenceActivity extends PreferenceActivity {

      @Override
      protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
                        ~略~

        PreferenceScreen pScreen =
             getPreferenceManager().createPreferenceScreen(this);
        pScreen.setTitle("PreferenceScreenのタイトル");
        setPreferenceScreen(pScreen);

 これをMindで書く場合は以下のようになる。

    メインとは
                _スクリーンは 変数

        プリファレンススクリーンを生成し   _スクリーンに 入れ
        "PreferenceScreenのタイトル"を  _スクリーンに プリファレンスにタイトルを設定し
        _スクリーンで プリファレンススクリーンを有効化し

 同様に上記Webページにおいて、チェックボックス・プリファレンスを表示するJavaのコードは以下のようになっている。(依存関係の指定は省略)

        CheckBoxPreference pCheckBox = new CheckBoxPreference(this);
        pCheckBox.setKey("checkKey");
        pCheckBox.setTitle("CheckBoxPreference");
        pCheckBox.setSummary("チェックボックスの例");
        pCheckBox.setDefaultValue(true);
        pCategory1.addPreference(pCheckBox);

 Mindで書く場合は以下のようになる。(以下ではカテゴリではなくスクリーンに追加)

                _チェックボックスは 変数

        チェックボックスプリファレンスを生成し _チェックボックスに 入れ
        "checkKey"を              _チェックボックスに プリファレンスにキーを設定し
        "CheckBoxPreference"を _チェックボックスに プリファレンスにタイトルを設定し
        "チェックボックスの例"を   _チェックボックスに プリファレンスにサマリを設定し
        真を                        _チェックボックスに プリファレンスにデフォルト値を設定し
        _チェックボックスを _スクリーンに プリファレンスを追加し

 上記のようにプリファレンスアクティビティ系のMindの処理単語はおおむねJavaのメソッドと一対一になった。例外はリストプリファレンスで、項目名と項目値はJavaでは別々に与えているがMindでは一度に与える仕様とした。

 前記事に書いた通り、(単なる)「プリファレンス」の実装ではJava側インスタンスの管理はあえて行わなかったが、こちらでは行なっている。スクリーン、カテゴリをはじめ、チェックボックスなどGUIパーツすべてについてJavaで生成したオブジェクトは大域配列に格納し、その要素番号でJavaとMindを結びつけるようにした。

 現段階で実装したMindの処理単語は以下の通りである。(数が多いので入出力パラメータは記載せず単語名だけとした)

        プリファレンスファイルを指定

        プリファレンススクリーンを生成
        プリファレンスカテゴリを生成
        チェックボックスプリファレンスを生成
        エディットテキストプリファレンスを生成
        リストプリファレンスを生成
        リングトーンプリファレンスを生成

        プリファレンススクリーンを有効化

        プリファレンスにキーを設定
        プリファレンスにタイトルを設定
        プリファレンスにサマリを設定
        プリファレンスにデフォルト値を設定
        プリファレンスにダイアログタイトルを設定
        プリファレンスにダイアログメッセージを設定
        プリファレンスにリスト項目を設定

        プリファレンスを追加


 プリファレンスが変更された時のイベント処理は現時点では未実装である。




参考URL: 「日本語プログラミング言語Mind」 (スクリプツ・ラボ)

2013年9月25日 (水)

プリファレンス

Preference アプリ固有の設定情報を不揮発性で記憶するのに、簡単なものだったら「プリファレンス」という(正確には「共有プリファレンス」らしい)機構が使える。Windowsだったら自前で*.iniファイルあるいはレジストリに記録するところだが、この点Androidは便利だと思った。
 さらには、ダイアログを開いてユーザと対話してプリファレンスのデータを編集し結果を記入してくれるAPIも用意されていて驚いた(そちらは次の記事に)。

 プリファレンス(Javaクラス名は「SharedPreferences」)が最終的に記入される先はファイルのようだ。最初に(Javaレベルでは)インスタンスを生成する必要があり、このときファイル名とアクセスモードを指定する。このあたりはMindでの手順も同様とした。

 今までの記事でも書いたことだが、Javaのクラスインスタンス(オブジェクト)をMindで得てもあまり意味がない。レイアウトなどでは生成したオブジェクトを大域配列に記憶し、Java←→Mindはその配列要素番号で連携をとったたが、今回の場合、複数のプリファレンスを同時に処理する場面は想定しずらいと考え、オブジェクトは配列にはせずJava側で単一の大域変数に格納、それを暗黙の了解で扱うようにしてJava←→Mindのインターフェースを単純化した。

プリファレンスの生成

 Mindでの記述は以下の通りである。

    (文法)
        <ファイル名>と <パーミッション>で プリファレンスを獲得
                                                         → [ErrorMessage]、真偽


    (ソース例)
        "testdb"と MODE_PRIVATEで プリファレンスを獲得し 偽?
                ならば 重大エラー
                つぎに


 上記にある「パーミッション」は、同じアクティビティ内であるいは同一パッケージ内アクティビティ同士で共用すれば済む場合は定数「MODE_PRIVATE」を指定する。(定数を日本語名にするか考えたがとりあえずJavaと同名の英語にした)
 なお、プリファレンスの生成のあと書き込みをおこなうのか、読み出しをおこなうのかはこの段階では区別する必要はない。(このあと書き込み処理をおこなえば書き込みとなる)

エディタの割り当て(書き込み時)

 書き込みを行うには、一連の書き込みの前に一度だけ、プリファレンスに対して「エディタ」(Javaでは SharedPreferences.Editor クラス)を割り当てる必要がある。プリファレンス本体のオブジェクト維持と同様にエディタのクラスインスタンスもJava側大域変数に格納するためMindからエディタを特定する情報は無い。

    (文法)
        プリファレンスのエディタを割り当て → [ErrorMessage]、真偽

    (ソース例)
        プリファレンスのエディタを割り当て 偽?
                ならば 重大エラー
                つぎに


データの書き込み

 プリファレンスに記入するデータは必ず<キー>と<値>の対である。キーは常に文字列だが、値は論理値/整数/文字列のように種類がある。Mind側でも値のデータ型に応じて複数の処理単語を設置した。またJavaでは書き込み時にエディタを指定するのだが前述の通り暗黙のオブジェクトとしたためMindでは指定しない。

    (文法)
        <キー>と <値(1/0)>を プリファレンスに論理値を書き込み
                                                         → [ErrorMessage]、真偽
        <キー>と <値(整数)>を プリファレンスに整数を書き込み
                                                         → [ErrorMessage]、真偽
        <キー>と <値(文字列)>を プリファレンスに文字列を書き込み
                                                         → [ErrorMessage]、真偽

        <キー>と <デフォルト値(1/0)>で プリファレンスの論理値を読み出し
                                                → <値(1/0)|ErrorMessage>、真偽
        <キー>と <デフォルト値(整数)>で プリファレンスの整数を読み出し
                                                → <値(整数)|ErrorMessage>、真偽
        <キー>と <デフォルト値(文字列)>で プリファレンスの文字列を読み出し
                                                → <値(文字列)|ErrorMessage>、真偽


    (ソース例(書き込み))
        "age"と 62を プリファレンスに整数を書き込み 偽?
                ならば 重大エラー
                つぎに


    (ソース例(読み出し))
        "name"と 空列で プリファレンスの文字列を読み出し 偽?
                ならば 重大エラー
                つぎに
        氏名に 入れ


 論理値の書き込みは、Mindで論理値は「ゼロ/非ゼロ」で判定される整数として扱っているがJavaでは論理値自身がデータ型なので両者間で型変換をおこなっている。
 Mindへの実装では当初は論理値の読み書きは含めず「~に整数を書き込み」「~の整数を読み出し」で代用すれば可と思っていた。しかし後述するプリファレンス・アクティビティにおいて、論理値を扱うAPIがあるため仕方なく設置したものである。
 読み出し操作で指定するデフォルト値は、指定したファイルが存在しないか、指定したキーが存在しない場合、ここで指定した値を読み出し値とみなして返すために使われる。

コミット

 これはデータベースの用語だが手続きもデータベース流になっている。一連の書き込みのあと、コミットをおこなうことで実際にファイルに書き込まれる。(割り当てたエディタはその後明に開放する)

    (ソース例)
        プリファレンスをコミットし 偽?
                ならば 重大エラー
                つぎに


プリファレンスとエディタの開放

 Java側にそのようなAPIは無いがあえてMindに実装した。以下を実行することでJava側の大域変数にnullを記入することでメモリ開放するためである。(後者はアプリ終了時にも自動実行される)

    (ソース例)
        プリファレンスのエディタを開放し 偽?
                ならば 重大エラー
                つぎに
        プリファレンスを開放し 偽?
                ならば 重大エラー
                つぎに



参考URL: 「日本語プログラミング言語Mind」 (スクリプツ・ラボ)

« 2013年8月 | トップページ | 2018年4月 »