fc2ブログ

2013
06/20

「Quick JUnit」とは

JUnitの
実装コード上で Ctrl+9 →テストコードを開く
テストコード上で Ctrl+9 →実装コードを開く

という便利なツール。

使ってみた。

設定に「テストケースのネーミングルール」というのがあるので
Androidの構成に合わせて追加する。
「${package}.test.${type}Test」

いざ!

テストコード上で Ctrl+9 →実装コードが開いた!

実装コード上で Ctrl+9 →「テスティングペアがありません」

おい!!
迷子か!

Android開発には対応してない模様。
スポンサーサイト



2013
06/17

前回までの画像を見ると、「XXXは必ず入力してください」の
XXXがすべて英語で表示されている。

そう、フィールド名がそのまま表示されているのだ。

それじゃぁちょっとユーザーとしては使いにくい。
というわけで、項目名を任意の文字列に差し替える方法を紹介する。

▼TestForm.java

@Widget(id = R.id.testform_edittext_name, nameResId = R.string.name)
@Required
public String name;


▼strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="name">名前</string>
</resources>


たったこれだけ。
nameResIdにはstrings.xmlで定義したIDを指定する。
EditTextの上に置いたTextViewと同じ文字列を指定してやれば、とってもわかりやすい。

同じようにすべての項目にnameResIdを設定してあげた結果がこちら。

enhancerTestフォーム6

2013
06/17

前回は必須チェックだけだったので、今回はそれ以外についても書いてみる。

前回の画像でチラリと出現しているが、
今回はチェックボックスと日付のチェックについて。

まずはチェックボックス。

enhancerTestチェック

上記の画像を見ると、メッセージに「hobbiesは少なくとも2個選択してください」と表示されている。
そう!必須選択個数を簡単に設定できるのだ!便利!!

さっそく、定義方法を紹介。
下記コードの@Requiredに注目。
※@Widgetの定義は前回のラジオボタンと同じ方法。(RadioGroupの代わりにLinearLayoutを使おう!)
▼TestForm.java

@Widget(id = R.id.testform_checkbox_hobby, values = {
@WidgetValue(id = R.id.testform_checkbox_hobby_cook, value = "cook"),
@WidgetValue(id = R.id.testform_checkbox_hobby_drive, value = "drive"),
@WidgetValue(id = R.id.testform_checkbox_hobby_pet, value = "drive") })
@Required(atLeast = 2)
public List<String> hobbies;


たったこれだけ。実に簡単。

次に、日付のチェックについて説明する。
日付のチェックは2種類用意されている。
ただ、日付形式で入力されているかどうかをチェックする「@DatePattern」と
さらに過去の日付であるかどうかもチェックする「@PastDate」。
今回は生年月日なので、過去の日付かどうかチェックする。


@Widget(id = R.id.testform_edittext_birthday)
@Required
@PastDate(value = "yyyy-MM-dd", allowToday = true)
public String birthday;


上記の通り、@PastDateをフィールドに付与するだけ。
valueは任意なので指定しなくてもいい。
デフォルトは yyyy/MM/dd となる。(※端末の言語設定が日本語の場合)

allowTodayは今日を許可するかどうか。上記は今日を許可する(エラーとしない)設定。
こちらも任意で、デフォルトはfalseになっている。

ではでは表示を見てみよう。

▼過去の日付だが、形式に誤りがある
enhancerTestフォーム3

▼形式は正しいが、未来の日付である
enhancerTestフォーム4

▼OK
enhancerTestフォーム5

欲を言うと、1番目の形式誤りは
「birthdayはyyyy-MM-dd形式で入力してください」と表示してほしいが(わがまま)
こんな便利なライブラリを本当にありがとうございます。

2013
06/17

前回はAndroidFormEnhancerというライブラリを取り込んだので
今回は実際にそれを使ってみる。

こちらに作者ご本人からの説明があるので
それに素直に従って実装してみる。
https://github.com/ksoichiro/AndroidFormEnhancer/blob/master/README.ja.md

まず、こんなフォームを用意した。
enhancerTestフォーム


次に、このフォームの入力項目を定義したクラスを1つ作成する。

public class TestForm {

public String name;

public String gender;

public String birthday;

public List<String> hobbies;

}



そして今度はそれと入力項目のViewをidで紐づけていく。
名前(name)と性別(gender)を例とする。

▼TestForm.java

@Widget(id = R.id.testform_edittext_name)
public String name;

@Widget(id = R.id.testform_radiogroup_gender, values = {
@WidgetValue(id = R.id.testform_radiobutton_gender_male, value = "M"),
@WidgetValue(id = R.id.testform_radiobutton_gender_female, value = "F") })
public String gender;


▼activity_android_form_enhancer_test.xml

<EditText
android:id="@+id/testform_edittext_name" />

<RadioGroup
android:id="@+id/testform_radiogroup_gender" />
<RadioButton
android:id="@+id/testform_radiobutton_gender_male" />
<RadioButton
android:id="@+id/testform_radiobutton_gender_female" />
</RadioGroup>


そしていよいよ、チェック内容を定義する。
まずは名前。入力必須とする。

▼TestForm.java

@Widget(id = R.id.testform_edittext_name)
@Required
public String name;


次に、性別。こちらも入力必須。

▼TestForm.java

@Widget(id = R.id.testform_radiogroup_gender, values = {
@WidgetValue(id = R.id.testform_radiobutton_gender_male, value = "M"),
@WidgetValue(id = R.id.testform_radiobutton_gender_female, value = "F") })
@Required
public String gender;



最後にチェックを行う。
「チェック」ボタンを押下したときにチェックを行うこととする。
というわけで、下記のocClickメソッドの処理に注目してほしい。
▼AndroidFormEnhancerTestActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
~略~
Button checkButton = (Button) findViewById(R.id.testform_button_submit);
checkButton.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
ValidationResult result = new FormHelper(TestForm.class, AndroidFormEnhancerTestActivity.this)
.validate();
if (result.hasError()) {
// エラーメッセージを表示します
Toast.makeText(AndroidFormEnhancerTestActivity.this, result.getAllSerializedErrors(),
Toast.LENGTH_SHORT).show();
} else {

Toast.makeText(AndroidFormEnhancerTestActivity.this, "エラーはありません", Toast.LENGTH_SHORT).show();
}
}
});
}

FormHelperの第一引数に、さきほど定義したフォームのクラスを設定するのがポイント。
なんとこれだけでロジックごりごりせずに入力チェックが行える。

enhancerTestチェック

2013
06/14

R.javaが生成されない理由として、ネットで調べると
大概こう書いてある。

「レイアウトxmlにエラーがある」
「AndroidManifest.xmlにエラーがある」
「クリーン・ビルドせよ」
「ビルドパスが間違っている」
等々。

しかし、どれを確認しても解決しない!

AndroidManifest.xmlを見てみた。

<uses-sdk
android:targetSdkVersion="17"/>

そういえば、さっきSDKをアップデートしたんだった。

↓修正↓

<uses-sdk
android:targetSdkVersion="22"/>


直った。

2013
06/14

前編で分かった通り、inputTypeの設定だけでは望まないINPUTが来る可能性がある。
というわけで、入力チェックを行おうと思う。

ありがたいことに、AndroidFormEnhancerというライブラリが存在する。
しかも日本語メッセージ対応!!

さっそくDLして使ってみる。
取り込み方は以下を参考に行った。
http://tmpla.info/archives/1211
このライブラリはActivityを含まないので、AndroidManifst.xmlの修正は不要。

さて、インポートしてライブラリとして参照してみたが、
取り込んだプロジェクトにエラーがでている!

Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead. Please use Android Tools > Fix Project Properties.

よく分からない(というか読む気がない)が、
コンパイラーの設定が間違っているようだ。

コンパイラー準拠レベルを1.7から1.6に変更する。
直った。

今度はライブラリを参照している自前のプロジェクトにエラーが出ている。

Jar mismatch! Fix your dependencies

ライブラリのプロジェクトに入っているandroid-support-v4.jarと
自前のプロジェクトに入っているandroid-support-v4.jarを
二重に参照しているのが悪いらしい。
情報元↓
http://106n.net/toro/blog/?p=658

自前のプロジェクトのほうを削除したらエラーは消えた。

上記の記事では、ライブラリ側のandroid-support-v4.jarを差し替えているが
どちらが最新か分からないし、自前のandroid-support-v4.jarをライブラリ側に上書きすると
AndroidFormEnhancer-demoがエラーになったので、
今回は自前のプロジェクトの方を削除することにした。

※削除中にエラーが出る場合はeclipseを再起動すると削除できるようになる。

2013
06/14

AndroidのEditTextにはinputTypeという属性がある。
numberとか
textEmailAddressとか
それだけで入力チェックをしてくれるんじゃないかっていう名前のものが多数。

でも、Androidで簡単に入力チェックができるYO!っていうライブラリもある。
え?必要なの??(えー、めんどくさーい)

というわけで、まずはinputTypeの動きを検証してみる。
こちらに列挙されている全inputTypeを1つずつ設定したEditTextを並べてみた。
http://www.att42.com/menu/memo/android/xml/inputType.html

EditTextを並べてキーボードを仕舞った状態

実際に入力をしてみる。
尚、デフォルトのキーボードはJapanese IMEで行う。

結果を表にまとめた。

入力してみた結果

入力後、別の入力項目にフォーカスを移動してもチェックされたりすることはなかった。
どうもinputTypeはただの入力補助と思った方がいいようだ。

ところで私は、
「でんわ」⇔「090xxxxxxxx」
「めーる」⇔「xxxxxx@gmail.com」
といったように簡単に電話番号とメールアドレスが入力できるように単語登録しているんだが
「phone」の場合は日本語キーボードへの切り替えができないので、
ポチポチと電話番号を入力しなければならない。
あるからってなんでもかんでも使うんじゃなくて、
ちゃんとユーザーのことを考えて設計した方が良さそうだ。

2013
06/13

素朴な疑問。

INTEGER PRIMARY KEY AUTOINCREMENT は一体どこまで成長するのだろう。

調べてみた。


9,223,372,036,854,775,807 までらしい。
あ、JavaのLongと一緒だ。

ちなみにマイナスはこう。
-9,223,372,036,854,775,808

情報元
http://chipmunkland.blog104.fc2.com/blog-entry-18.html
ありがとうございます。

関連エントリ
Android SQLite 「ROWID」と「INTEGER PRIMARY KEY」と「INTEGER PRIMARY KEY AUTOINCREMENT」の関係

2013
06/13

エミュレータ(AVD)を横向きにするには、
Ctrl + F11
または
Ctrl + F12
を押します。

ちなみに左側のCtrlキーでしか動作しませんでした。
知らなかったんですが、左右にあるCtrlキーはアプリケーション側で使い分けることができるそうです。
(Wikipediaより。)
http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%82%AD%E3%83%BC

2013
06/13

SQLiteには、自分が定義したカラムのほかに、ROWIDという一意な隠れカラムがある。
そいつはデータを追加するたび連番で振られるのだが、、

データを1個削除したのち、また追加したときの動きについて分からなかったので調べてみた。

で、問題です!じゃじゃん!

各問題のカラム定義で以下のデータが存在する場合、
次のデータ追加時に自動で割り当てられるROWIDは?




ROWID
1
2
4


第1問 ROWID | NAME(TEXT)

正解は…3

第2問 ROWID | NUMBER(INTEGER PRIMARY KEY)

正解は…3

第3問 ROWID | NUMBER(INTEGER PRIMARY KEY AUTOINCREMENT)

正解は…5

つまり、ROWIDは「INTEGER PRIMARY KEY」なカラムと同じということ。
「INTEGER PRIMARY KEY」なカラムが「AUTOINCREMENT」なら、
ROWIDも「AUTOINCREMENT」。
一度使った値は使わない。

ちなみに明示的に「INTEGER PRIMARY KEY AUTOINCREMENT」な値(第3問のNUMBER)に
15とか今の最大値を超える値を入れると、
次に自動的に割り当てられる値は16になる。
また、明示的に3とかすでに削除した値を入れてもエラーにはならず、
次に自動的に割り当てられるのは、やっぱり最大値+1の値になる。

関連エントリ
Android SQLite テーブルをコマンドプロンプトで閲覧する方法
Android SQLite INTEGERの最大値

2013
06/12

1.コマンドプロンプトを起動
2.フォントをMS ゴシックにする (日本語データ文字化け対策)
(以下はコマンド)
3.cd C:\android-sdk-windows\platform-tools ※C:\android-sdk-windowsはSDKのルート
4.chcp 65001 (日本語データ文字化け対策)
5.adb shell (adbの起動)
6.cd /data/data/com.example.androidtestapp/databases ※com.example.androidtestappはパッケージ
7.ls (ファイルが表示される)
8.sqlite3 testapp_db ※testapp_dbは7で表示されたファイルのうち、DB名のもの(.dbなし)
9..tables (存在しているテーブル名を列挙する)
10.select * from persons; ※personsはテーブル名

select rowid, * from persons;
のようにすると、ROWIDも表示してくれます。

※まず最初にエミュレータを起動しておかないと、5でエラーになります

2013-06-12_172625.jpg

2013
06/12

AlertDialogにPositiveButton(表示:OK)とNegativeButton(表示:キャンセル)を追加して、エミュレータを実行してみた。
するとその2つのボタンの位置はこうだった。

[キャンセル] [ OK ]

違和感満載。。

これはAndroidの標準レイアウトであって、
プログラムが間違っているわけではないらしい。

情報元はこちら。
http://www.umek.topaz.ne.jp/smk/2013/01/android-apiguide-dialog.html
ありがとうございます。

以前、AVDのターゲットを古いVerにしていたが、特に違和感ない配置だったような気がする。

バージョンによるのかもしれない。

2013
06/12

AlertDialog上のEditTextに初期値を入れておきたかったんですけど、
途中で例外が発生して困っていましたが解決しました。

▼元のソース

private class OnButtonClickEvent implements OnClickListener {
@Override
public void onClick(View v) {
Dialog dialog = createPersonUpdateDialog();
dialogEditText = (EditText) dialog.findViewById(R.id.d_edittext);
dialogEditText.setText("文字列"); //ここでNullPointerException
dialog.show();
}
}

▼修正後のソース

private class OnButtonClickEvent implements OnClickListener {
@Override
public void onClick(View v) {
Dialog dialog = createPersonUpdateDialog();
dialog.show();
dialogEditText = (EditText) dialog.findViewById(R.id.d_edittext);
dialogEditText.setText("文字列");

}
}

Dialog#findViewByIdはshow()してからじゃないと使えないそうです。

情報元。
http://d.hatena.ne.jp/Kazzz/20100806/p1
ありがとうございます。

2013
06/12

http://localhost:8888/

PCでWebアプリを組んで、AVDから見ようとしたんだけど、
見つかりませんと言われるばかり。

調べてみたら、下記のURLでアクセスできるらしい。

http://10.0.2.2/

localhostはエミュレータ自身をさすらしい。
なるほど。

情報元はこちら。
http://blog.cnu.jp/2010/10/30/android-emulator-and-server/
ありがとうございます。

2013
06/12

こんな例外が出ました。

android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1

SQL文が間違っててデータが取れてないのかと思ったのですが、そうじゃなかった。

最初、Cursorは-1を指しているので、まずはデータの1番目(0)を指すようにしないといけないらしい。

データを使う前に、
cursor.moveToFirst();
しましょう。

こちらが情報元。
http://engineerblog.glpgs.com/index.php/archives/43
ありがとうございます。

2013
06/12

今まで、プログラミングで困ったこと・解決方法をエクセルに書いていたのですが、
エクセルファイルの場所を忘れそうなので、ブログに書くことにしました。

過去にメモしたことも、徐々にこちらへ移行していきます。
プロフィール

nov

Author:nov
パセリはおやつです。

最新コメント

最新トラックバック

タグクラウドとサーチ

> tags

検索フォーム

ブロとも申請フォーム

QRコード
QR