2010年12月15日水曜日

[android]ListViewを2列表示にする方法

今まで、ListViewを使用してViewの表示をしていたのですが、
横向き表示の時には2列にしたいと思って方法を探してました。


調べてみると、GridViewっていうのがあるみたい。
参考にさせていただきました。
hyoromoの日記-GridViewを使ってみたよ


使い方は、ListViewとほとんど同じで、
 1.Adapterを用意 (ListViewで使ってるので使い回し可能!)
 2.GridViewの用意
 3.GridViewにAdapterを設定
でいいらしい。


ということでListViewとGridViewの記述の違いだけをメモメモ。


ListViewとGridViewの/layout-land/main.xmlの違い
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical" android:layout_width="fill_parent"
 android:layout_height="fill_parent"> 

 <!--ListViewの場合はこっち-->
 <ListView android:id="@+id/list" android:layout_width="wrap_content"
  android:layout_height="wrap_content"> </ListView>

 <!--GridViewの場合はこっち-->
 <GridView android:id="@+id/list" android:layout_width="fill_parent"
  android:layout_height="fill_parent" android:numColumns="2"
  android:stretchMode="columnWidth"
  android:gravity="center" />

</LinearLayout>

srcの違い(のある部分だけ)
// ListView listView;
 GridView gridView;

 // listView = (ListView) findViewById(R.id.list);
 gridView = (GridView) findViewById(R.id.list);

 //listView.setAdapter(mAdapter);
 gridView.setAdapter(mAdapter);

と変更した箇所はたったこれだけで、横表示の時に2行にすることが可能になりました!
ちなみに、縦表示は1行のままにしたいので、
GridViewの android:numColumns="1"とすることで、縦表示は1行にできました!



2010年11月25日木曜日

[google calendar]繰返し登録方法


Googleカレンダーでイベントを繰り返し登録する方法を探したところ、
以下の話題がありました。
Google calendar API での繰り返しスケジュールの取得


"RRULE:FREQ=WEEKLY;..." といった形式で繰返しが登録できるとのこと。
詳しいフォーマットとしては、色いろあるようで
 FREQ=DAILY/WEEKLY/YEARLY (毎日/週ごと)
 BYDAY=MON/FRI (曜日指定)
 INTERVAL=2 (間隔)


これらを組み合わせて、以下の設定が可能。


隔週月曜日
 FREQ=WEEKLY; INTERVAL=2; BYDAY=MON;
毎年最終月曜日
 FREQ=YEARLY; BYDAY=-1MON; (-1で最終〜になる) 

で、今回は毎年同じ日に登録したい場合は、単純に以下だけ。
 FREQ=YEARLY;


で、ここから例えば、何年間だけ同じ日に登録したいときは
どうするのか?
方法は2つあるみたいですが、片方しか試してないので、
とりあえずわかった方を記載しておきます。


■UNTILを使う方法
 以下のように記載するとどうやら2015年1月1日まで
 繰り返し登録することが可能みたい。

 FREQ=YEARLY UNTIL=20150101;
 

以下が実際に書いたコード

ContentValues values = new ContentValues();
    ContentResolver cr = this.getContentResolver();

    values.put("calendar_id", calId);
    values.put("title", title);
    values.put("allDay", 1);
    values.put("dtstart", startDay);
    values.put("dtend", endDay);

    values.put("rrule", "FREQ=YEARLY;UNTIL=20150101T010000Z");
    values.put("duration", "P1D");

    cr.insert(events, values);



rruleで、2015年まで毎年登録。
durationは設定しておかないとエラーになってしまいますが、
なぜ必要なのかはまだ不明です…

■COUNTを使う方法
 こちらの方法でもいけるのかな?未確認です。


2010年11月17日水曜日

[android]連絡先から誕生日をGoogleカレンダーに登録するアプリ「Birth2Cal」1.0.1公開しました。

marketに公開中のアプリ「Birth2Cal」のバージョンアップしました。
ちょっと紆余曲折ありまして、アプリを再度登録しなおしております。


■旧 Birth2Calからver.1.0.1の変更点
・ユーザのリスト表示がふりがなソート順になりました
・誕生日だけでなく、記念日も表示しました。

・アイコンが透過できていなかったのを修正。
・実はandroid2.2 のみから2.1も対応。
 (但し、動作確認は出来ておりません。)

■今後の対応予定
・現在、カレンダーへの登録が1年分しか行っていないため、
 繰り返し登録年数の設定
・アプリ起動時の読込み時、2〜3秒かかっているため、
 「読込中」などの表示をつける。
・登録完了時のダイアログに[OK]ボタンの設置

となっております。
不具合、要望等ありましたらコメント等いただければと思います。

2010年11月16日火曜日

[android]ふりがなソートについて

連絡帳から情報をリスト化するときに、よくありがちな
「ふりがなでソートがしたい」のメモです。


managedQuery()メソッドを使用してリスト表示していました。
ふりがなソートを行うにあたり以下の情報で、
苗字/名前のふりがなが参照できます。
android.provider.ContactsContract.CommonDataKinds.StructuredName
PHONETIC_FAMILY_NAME
PHONETIC_GIVEN_NAME


それそを以下のsortOrderで指定すればソート完成!
managedQuery(uri,projection,selection,selectionArgs,sortOrder)


となるのですが、ふりがな情報と、別のクラスの情報を選択して表示する場合、
selection で設定ができませんでした。
よく見てみると、それぞれのクラスには「CONTACT_ID」データがあるので、
それを使えば他のクラスのデータと関連した選択が可能になるらしい。


以上を踏まえた結果、以下のコードのようになりました。

Cursor c1 = managedQuery(uri, projection,
Data.MIMETYPE + "=?",
 new String[] { StructuredName.CONTENT_ITEM_TYPE },
StructuredName.PHONETIC_FAMILY_NAME + " ASC ,"
+ StructuredName.PHONETIC_GIVEN_NAME + " ASC");
while (c1.moveToNext()) {
Cursor c2 = managedQuery(uri, projection,
Data.CONTACT_ID + "=? AND " + Data.MIMETYPE + "=?",
new String[] { c1.getString(0),Event.CONTENT_ITEM_TYPE},
null);
while (c2.moveToNext()) {
//出力の記述
}
}



2010年11月14日日曜日

連絡先から誕生日をGoogleカレンダーに登録するアプリ「Birth2Cal」

あまりうまく探せていなかったせいかもしれませんが、ガラケーであった、
「連絡先に登録しているユーザの誕生日がカレンダーに表示」するアプリが
見当たらなかったので、自分で作ってみました。

欲しかった機能としては、
・連絡先のリストから、誕生日データが登録されているユーザの誕生日を拾って、
自分のGoogleカレンダーへ登録する
・Googleカレンダーは、自分が使っている他のアプリと連動したいので、
Googleカレンダーに登録できるようにしたいと考えていました。
・とりあえずは、自分が使用している環境(Nexus One)での動作が出来ればよい。

といった感じになっています。
実際に動かした画面が下のような感じです。


現在以下の不具合と要望が出ていますので対応予定です。

不具合
・登録していないカレンダーに対し、カレンダーに登録が可能。
ただし実際はカレンダーには出ていない。
・アイコンが微妙すぎるw

要望
・名前がソート順のほうが良い
・誕生日以外の記念日にも対応



2010年11月13日土曜日

アプリデータ保存方法のプリファレンスについて

androidアプリにて、データを保存する方法がいくつかあり、
そのうちの1つが「プリファレンス」。
あまりデータサイズが大きくないものに関して使用するのがほとんだそうで、
今回は簡単な設定を残すのに使用しました。

保存するデータ型は、String/boolean/float/int/long型が使用可能で、
下はString型を使用して、プリファレンスの保存をした例です。

SharedPreferences pref = getSharedPreferences("プリファレンス名", MODE_PRIVATE);
Editor e = pref.edit();
e.putString("キー名1"," Test1 ");
//e.putString("キー名2"," Test2 ");
e.commit();
一つのプリファレンスに対し、キーは複数登録できるみたいなので、
上記の記載が可能です。
なお、MODE_PRIVATEは自分のアプリでのみ使用できることを指しています。
他に、MODE_WORLD_READABLEで、他アプリから読み取り可能、MODE_WORLD_WRITEABLEで、他アプリから書き込み可能 となっています。

下はプリファレンスを取得した例です。

SharedPreferences pref = getSharedPreferences("プリファレンス名", MODE_PRIVATE);
String str1 = pref.getString("キー名1","");
String str2 = pref.getString("キー名2","hogehoge");
pref.getString("キー名1","")の第二引数は、
このキーが登録されていないときの初期値になります。

2010年11月2日火曜日

ListViewにCheckBoxを追加してみた。

前回の時点で連絡帳から、名前と誕生日をリスト表示することができました。
今回は、表示された名前と誕生日に対してチェックボックスを追加してみました。


まず、layoutにCheckBoxを追加して、そのIDに対して
view.findViewById(R.id.CheckBox)とかするわけですが、
ListViewを行っているため、チェックボックスにチェックを入れても、
そのチェックボックスが画面外に出てしまうと、
チェックが保持されません。


そこで、チェックボックスにチェックが入ったことを、
setOnClickListenerを使用して情報を保持できるようにしました。

chk01.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(chk01.isChecked() == true) {
item.setCheckFlag(true);
}else{
item.setCheckFlag(false);
    }
}
});

上のようにすれば、チェックボックスにチェックを入れると、
画面外から戻ってきてもチェックされたままになるし、
チェックを外しても、チェックを外した状態に出来ました。

2010年10月12日火曜日

ArryaList

ArrayListを使って、アイコン+Text2行分の情報を複数回表示するようにしてみる。

・ArrayAdapter<>には、データをTextViewのtextにセットして、Activityで表示が出来る
・ArrayAdapterをオーバーライドして自分の出力したい形式に変更する。

ということなので、連絡帳からユーザ名と誕生日情報を取得用に
ContactAdapterを作成しました。
ArrayAdapter"contactsstatus"のcontactsstatusは自分で作成したリストです。
ユーザ名と誕生日をリスト化しています。
public class ContactAdapter extends ArrayAdapter<ContactsStatus> {
private LayoutInflater inflater;
public ContactAdapter(Context context, int textViewResourceId,
List<ContactsStatus> items) {
super(context, textViewResourceId, items);
this.inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// ビューを受け取る
View view = inflater.inflate(R.layout.contactsname, null);
// データの取得
ContactsStatus item = getItem(position);
if (item != null) {
// ユーザ名をセット
TextView displayName = (TextView) view.findViewById(R.id.ContactsName);
displayName.setTypeface(Typeface.DEFAULT_BOLD);
displayName.setText(item.getDisplayName());
// 誕生日情報をビューにセット
TextView birthday = (TextView) view.findViewById(R.id.Birthday);
birthday.setText(item.getBirth());
}
return view;
}
}

開発初心者の自分へ友人からのアドバイスをもらいました。

とりあえず開発をしていたんだけど、どうやら適当に書きすぎていたようで、
以下のことに注意してみたほうが良い、と指摘をいただきました。

1.Warningは放置しない
 →不具合の元なので対処しましょう、とのこと。
2.ArrayList<E>みたいなののEの部分はちゃんと指定すること(ジェネリックでぐぐれ)
 →<>自体記載しなくても動いてたので書いてなかったんだけれど、
  入力している型があっていないときに指摘してくれるらしい。
3.APIは、意味がわからなくてもとりあえず眺める(いつかわかる日がくる)
 →頑張りましょう。
4.変数名が適切じゃない場合が多いのでこまめにリファクタリングする
 →Androidの場合、非スタティックフィールドはmから変数名を始める必要がある。
5.Control+Spaceで入力保管とCommand+Shift+Rでリソース選択は重要
 →Eclipseの機能です。超便利なので手癖に出来るようにしましょう。
6.ArrayListなどの代入先はListなどの大きな単位の型に入れた方が後々楽になる場面が。
 →ArrayListはListの中に含まれているため、大きな単位での記載が可能らしいです。

2010年10月6日水曜日

Google Calendar で新しくカレンダーを作成する方法

まだ不明。
でもCreating new calendarsに以下の説明がある。

To create a new calendar, first create the Atom or JSON-C code for a calendar <entry> element or data object like the ones in the previous example. For example, you might create the following code to represent a calendar to keep track of your Little League team:

{
  "data": {
    "title": "Little League Schedule",
    "details": "This calendar contains the practice schedule and game times.",
    "timeZone": "America/Los_Angeles",
    "hidden": false,
    "color": "#2952A3",
    "location": "Oakland"
  }
}



ここらへんいじれば何とかなるのかなー?



2010年10月4日月曜日

Google Calendar からの情報取得

Google Calendarから自分が持ってるカレンダーの一覧を取得できた!

以下のサイトが役に立ったよ!
【Working with the Android Calendar】
http://www.developer.com/ws/article.php/3850276/Working-with-the-Android-Calendar.htm&rurl=translate.google.co.jp&twu=1&usg=ALkJrhjUYAeZzDVZgnpWXwImDY38cUjA7w

【Android Developersのディスカッションより】
http://groups.google.co.jp/group/android-developers/msg/3ab354642cc7438e

2010年9月29日水曜日

githubのコマンドについて

毎回忘れてしまうので、githubのコマンドを記載。

git status    :修正があったファイルに関して、modifiedとなるので確認
git add ファイル :commit するファイルを指定
git commit -m '~'  :コミットのコメントを’’に記載。
省略しても後で記載するように求められるので何かしら入れる。
git push origin master:Originに変更点を反映

最後にgit status でmodifiedがないことを確認。


#関係ないけど、リポジトリの削除の仕方は、各リポジトリの「管理」から出来る。

ListViewについて。

Androidで電話帳のデータを取得して表示する機能を実装をしてみたい。
→なんとか電話帳のデータから「名前」と「誕生日」を取得できた!
  (ここらへんも後日書く予定です。)
→全員分表示するぞ!
→最後の一人しか表示できてない。。。

調べてみると、ListActivityという機能で特定のデータが並んでいる画面を作成できるらしい。
あとで使ってみよう。