2012年11月27日火曜日

[Titanium1日目]JSSとかエラーとかLabelとか #TitaniumJP


実際には1日目ではないんですが、更新スタートということで…w

○JSSのバグ

JSSを導入して見た目をiPhoneとandroidで異なるようにしようと思ったら、何度ビルドしてもうまく反映されない。
調べてみると、どうもバグみたいですね。

JSSは変更を保存してもビルド時に反映されない場合があります.
(反映されている時もある.不安定.)
上で例に挙げたソースコードで説明すると, colorを’#000′から’#333′に変えて保存, 実行してもエミュレータ上で何も変わらない, といった現象です.
http://markovlabo.net/?p=901

おいおい。

こういうときは現在のProjectをCleanして再ビルドしましょう.
メニューバー>Project>Clean を選択.
http://markovlabo.net/?p=901

うーん、面倒。

さらに別のところでJSSが反映されない。
JSファイルでTi.Map.createViewのプロパティにid:'mapview'を記述。
JSSファイル
#mapview{
     width:320px;
     height:240px;
}
を記述しても、マップが画面の半分だけ表示にならず、下まで表示される…。

ここはもう普通にJSSを使わずにTi.Map.createViewのプロパティで解決することに。



○変なエラー

謎なのが毎回へんなエラーが出てエミュレータが起動しません。

[ERROR] Application Installer abnormal process termination. Process exit value was 1
[ERROR] Timed out waiting for emulator to be ready, you may need to close the emulator and try again

しかし前に作ったHelloWorldではエミュレータが起動する…なんでや。

まぁどっちみちエミュレータだとGPSのテストが出来ないからいいんだけどさ。
これも余裕のあるときに検証するかぁ。



○Androidで位置情報を取得する時に気をつけること

Titaniumで位置情報を取る方法は2つあります。
ひとつはgetCurrentPosition関数を使う方法。

Ti.Geolocation.getCurrentPosition(function(e) {
    var cLat = e.coords.latitude;
    var cLong = e.coords.longitude;
});
ただしこの方法だと一度しか取得してくれません。
ずっと取り続けてほしいときは、addEventListenerを使います。

Ti.Geolocation.addEventListener('location',function(e){
  var cLat = e.coords.latitude;
  var cLong = e.coords.longitude;
});
まぁ自分が知っていたのはこれまでなんですが、気になる記事を発見。

Androidアプリで位置情報を取得したい場合、通常AndroidManifest.xmlにuses-permission"ACCESS_FINE_LOCATION"を追加する必要があります。
ですが、Titanium MobileではgetCurrentPositionという関数名がソースコード内に含まれていれば自動でpermissionを追加するようになっており、Androidアプリ独自の部分をあまり意識しなくても済むようになっています。
しかし、addEventListenerを用いた方法だと、このpermissionの自動追加が適応されないため(中略)位置情報を取得できません。
http://tech-sketch.jp/2012/01/titanium-mobile.html

TiApp.xmlに追加しないといけない内容は元記事をお読みください。
これは盲点ですね…早速追加しときました。



○Labelってどう変更するのよ

とりあえず、Android実機を持ってちゃんと緯度と経度がはかれるかどうかを調べるために、緯度と経度をラベル表示させるようプログラムを組みます。

そこでぶつかったのが「Label内の値を変更するにはどうすればいいか」。
「そんなのも分からんのかい」と思ったそこのアナタ。そのくらいド素人なので許してください。

とりあえず書いたのが下のコード。
find.js

(前略)

var labelPos = Ti.UI.createLabel({
     text: 'hogehoge',
     height: 70,
     top: 280
});

win.add(labelPos);

Ti.Geolocation.addEventListener("location", function(e) {
     cLocLat = e.coords.latitude;
     cLocLong = e.coords.longitude;
     Ti.API.info(cLocLat);
     Ti.API.info(cLocLong);
     labelPos.text(cLocLat+'\n'+cLocLong);
});
(後略)

するとこんなエラーが。

'hogehoge' is not a function (evaluating 'labelPos.text(cLocLat+'\\n'+cLocLong)')

text()っていう関数は存在しないってこと?

とりあえず別の方法として、上の部分を

labelPos.text = cLocLat+'\n'+cLocLong ;

に変えるとすんなり通りました。

※ちなみにこのバグ、text()があると思い込んでたせいで修正するだけで1時間使ってます。なんで気づかなかったんや...(´・ω・`)



○その他雑多なメモ

改行は\nを使う。逆スラッシュのやつ。ここはJSでも一緒。""で囲むことを忘れずに。



○明日の予定

・Android実機でちゃんと継続的に位置情報がとれているかを確認。
・とれていれば2地点間の距離を計算するやつを書く。
・ついでにcloseを押したら位置情報を取るのをやめさせる方法も考える。
・時間があればデータベースまで…無理かな(´・ω・`)
・JSDeferredが分からん。
・GitとGitHubでバージョン管理をしたい。

0 件のコメント:

コメントを投稿