天気予報アプリの設定Activityを実装する為に、
ExpandableListとSharedPreferencesの使い方を練習しました。
一応、テストアプリでは想定通りの動きができました^^
後、問題は、
47都道府県の各地域合計143件のデータを
どうやって持たせるのが効率的なのか、、、
array.xmlに設定するにしても、
ExpandableListに登録する際には、
都道府県別にまとめて登録しないといけないから、
結局ほぼベタ書きになってしまう気がする。
うーん。
まあ、大したボリュームのあるコードではないし、
基本的には変動しない項目だからベタ書いてしまっても良いかな・・・
やっぱり、
こう言う時に相談できる人がいると頼もしいんだけどな~
一匹狼×初級者はつらい、、、
週末色々悩んだ結果、
PreferenceActivityを活用した実装は挫折、、、、
やろうとしていたのは、
都道府県をListPreferenceで選択すると、
地域のListPreferenceのエントリーをXMLを取得して設定する
って感じの設定機能だったんだけど、
ListPreferenceに変更内容を設定する所がどうも駄目みたいで、
良く分からない例外が発生してしまい俺の頭がキャパオーバー。。。
やっぱ、基礎が無さ過ぎるのが問題だと言う事で、
分厚い教科書をゲットして勉強し直してます。
冷静になって考えて見ると、
設定情報を都度WEBから取得するってのはそもそもどうなの?って気がしてきた。
都道府県は45?それぞれ地域が2~5くらいあるので、
まあ、言っても3~400件。
その位はarray.xmlに保有してしまった方が安定したアプリになるんじゃなかろうか?
更に、地域をころころ変える事を想定するなら、
取得した天気予報XML情報はローカルに保存して、再利用するようにすれば、
通信コストの削減ができるんじゃないだろうか。
・・・・いや、1時間に1回更新されるからキャッシュする意味はあんまりないかな。
うーん。
試行錯誤する時間が欲しい。。。
天気予報ウィジェットできた~!!!!!
初心者ゆえに、かなり右往左往したけど、
何とかHT03-Aで稼動する週間天気予報ウィジェットができたぜ!
機能要件は↓な感じ。
・天気予報RSSフィードを読み込み
(ver.1.0では東京地方のみをサポート)
・直近5日間の天気予報をウィジェット上に表示
表示項目は以下
-日付(mm/dd)
-天気アイコン
-時間帯別降水確率(直近2日間のみ)
-最高気温
・天気予報情報は1時間に一回更新
・ウィジェットサイズは縦1横4の横長サイズ
・半透明枠のシンプルなデザイン
・クリックでの機能実装無し
本当に最小限の機能で実装したので、
これから色々バージョンアップさせて、
その内、公開(ソースも)しようと思います。
今後のバージョンアップ予定。
・東京以外の地域別天気予報設定機能
・天気概況のテロップ表示
・詳細情報表示画面作成(クリックで展開)
・土日祝の日付色分け
・曜日表示
・デザインの改善
いや~、
とにかくちゃんと動いた事が嬉し過ぎる!!
これだからプログラミングは楽しいんだよね。
ま、周りに自慢しても殆ど理解してもらえないけど、、、、
何とかウィジェット実装に必要な技術は理解できたので、
もう今日からは本番アプリ作成に入ります。
今日はXMLでwidgetのレイアウト作成に着手しました。
今回のアプリは5日分の天気予報を横に並べる想定なので、
TableLayoutの中にWeightをすべて”1″にしたTableRowを取りあえず5つ並べ、
それぞれの中にこれまたweightをすべて”1″にしたTextViewを5つ並べました。
なれるとXMLでのレイアウトは簡単だし、
後から見直した時にわかりやすそう。
当面、レイアウトの作成に努めます。
あ、そう言えば、
勢いで独自ドメインを取得しました^^;
まだ何も置いてないので公開できないけど、
ちょっとテンションあがるね。
androidアプリのパッケージ名も自分のドメイン入れて決めました。
(実はこれがやりたかっただけと言う説もある。。。)
今日は結構色々あって疲れた~
詳しくは話せないけど、結構際どかった。。。
さて、気を取り直して、
今日は久しぶりにフラットな日記を書こうと思います。
最近、昔読んではまった小説を何冊か読み返しているんだけど、
今読んでいるのは「the S.O.U.P(ザ・スープ)」と言う小説。
読んだ人いるかな?
結構マイナーな作品なんだと思うんだけど、
個人的には物凄いインパクトを受けたし、大好きな一冊です。
話の内容は↓な感じ。
インターネットが普及し「The S.O.U.Pオンライン」と言うネットゲームがはやっている中、
このゲームを立ち上げた優秀なハッカーである主人公と、
「ネットの秩序はネットによって保たれるべき」と言う思想の元、
大規模なサイバーテロを実行するEGG(eGOD genesis)と言うハッカー集団
の戦いを中心に話は展開するが、最終的には・・・・
っと読む人もいるだろうからネタばれはやめるけど、
とにかく壮大なテーマに発展して行く訳です。
で、この小説を読んで俺が一番感じる事は、
「ハッカー」ってかっこいい!!て事。
勘違いしないで欲しいんだけど、
人のサーバーに進入して悪さをする様な事に憧れてるわけじゃないよ。
小説中の主人公の発言でもあるんだけど、
「ハックとは今あるものを、より良くする行為の事であり、それを実行する人がハッカーである」
と言う事なんだそうです。
一方で、サーバー進入とか言う破壊行動の事を「クラック」と呼び、
そう言う事を実行する悪い人たちの事を「クラッカー」と呼ぶんだそうです。
俺が憧れるのは「クラッカー」ではなくて「ハッカー」なんだな。
金儲けの為ではなく、ただ自分の知的探究心を満たす為だけに
誰にもまねできない「ハック」をする。
そんなリアルハッカーに憧れる今日この頃。
ちなみに、
上記の定義からすると、ハック=コンピュータじゃあない。
どんな分野でも、フラットな志で物事をより良くする活動であれば、
それは「ハック」なんだと思う。
そう考えると、なんだかウキウキしてこない?
さて、俺にはどんな「ハック」が出来るんだろう。
10月の頭に稼働したザッピングSEOですが、
徐々にインデックスされ始め、流入も増え始めたようです。
やはり、例外無く巡航速度に達するには数か月かかるものの様です。
ただ、嬉しい誤算もひとつありました。
当初想定していたコンバージョンは一種類だったのですが、
実は別のサービスにコンバージョンしているのが多少ある事が分かりました。
今は本命のコンバージョンしか意識していないサイト構成にしているのにも拘らずです。
と言う事はですよ。
もっとマルチコンバージョンを意識した作りにすれば、
活用の幅が広がるのではないかと、期待してしまったりする訳です。
今後の展開が楽しみです。
また、ザッピングとは関係ありませんが、
サテライトサイト施策も試行し始めました。
これもどんな効果が出るのか楽しみです♪
ちなみに、明日はブログウォッチャーさんと飲みに行きます^^
色んな話ができるといいな。
通常アプリのインターフェイスはある程度分かったので、
今日はAndroidのデスクトップウィジェットである、
「AppWidget」の実装を試してみました。
まだ、サンプルをコピペしながらやって見たレベルなので、
全然理解できてないけど、多分こんなこと。
・ウィジェットアプリはappWidgetProviderクラスを継承して作る。
・appWidget設定用のXMLをres/xml/に配置。
→この中でウィジェットのサイズや、表示レイアウトを規定するXMLファイルとかを設定
・ウィジェット内のレイアウトは通常アプリ同様XMLで指定
→ただし、使えるviewは限られている。
→プログラムからのアクセスはsetTextViewText(viewID、内容)見たいな感じで、
直接設定する専用メソッドにて行う。
・マニフェストに登録が必要。
などなど。
今日はとりあえず、
現在時刻を表示する最少サイズのウィジェットを
デバック環境で動かすことに成功したので、
まあまあ満足です^^
しばらくウィジェットの勉強を続けます。
ではでは。
今日は昨日に引き続きView操作の練習をしました。
今日はListViewで色々やりました。
昨日まででアダプターを使って配列を登録できる事が分かったので、
今日はテキストボックスとボタンをListViewと並べて、
入力した項目をListViewに追加する処理を書いて見ました。
こんな時間になってしまったけど、
無事成功^^
一応、ソース貼っときますね。
変なとこあったら指摘してくれると嬉しいです。
もしニーズがあったら参考にしてくれてもいいですよ~(ないか汗)
package com.cliph.listviewsample;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListAdapter;
import android.widget.ListView;
public class ListViewSample extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.linear_layout_9);
ListView mList = (ListView)findViewById(R.id.list);
String lists[] = new String[]{“japan”,”united states of america”,”itary”,”france”,”korea”};
ArrayAdapteradpt = new ArrayAdapter (ListViewSample.this,android.R.layout.simple_list_item_1,lists);
mList.setAdapter(adpt);
Button mBtn = (Button)findViewById(R.id.mbtn);
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自動生成されたメソッド・スタブ
ListView mList = (ListView)findViewById(R.id.list);
EditText mText = (EditText)findViewById(R.id.addtext);
int cnt = mList.getCount();
String clists[] = new String[cnt+1];
for(int i=0;iadpt = new ArrayAdapter (ListViewSample.this,android.R.layout.simple_list_item_1,clists);
mList.setAdapter(adpt);
}
});
}
}