TONY0922のブログ

学んだことを適当に記録していくブログです。主にRuby, Java, PHPで仕事してます。更新頻度はそんなに高くないので、ご了承下さい。

Titanium MobileでAlloyでアプリ名を日本語にする

Titanium SDK:3.2.0
Alloy:1.3.0

・プロジェクトのappフォルダと同階層に「i18n」フォルダを作成
i18n/ja/app.xmlを作成。
・app.xmlを編集

<?xml version="1.0" encoding="UTF-8" ?>
<resources>
	<string name="appname">日本語アプリ名</string>
</resources>

これで、ビルドするとiOSAndroidの両方でアプリ名が日本語になります。

Titanium MobileのiOS用スプラッシュ画像はちゃんとしたpng拡張子を使おう

お前は何を言って(略

Titanium MobileでiOS用のスプラッシュ画像を使うために
gifファイル用意してたんだが、pngしか設定できないようなので、
拡張子をリネームして、下記のファイルを設定した。

Default.png
Default-568h@2x.png
Default@2x.png

iOS Simulatorは指定したインチに沿って、
使用するスプラッシュ画像を選択してくれてたんだけど、
いざ、実機で確認すると「Default-568h」を
使用すべきところを「Default」しか使ってくれず、
そのおかげで、アプリ自体、640 × 960 サイズになって、
上下に黒い部分の領域ができてしまっていて、この解消方法がわからなかった。

解消方法は素直に
gifpng にちゃんと画像変換すれば、設定出来ました。

今考えると、拡張子リネームしただけで、変換できるか!!って言われそうだけど、
寝てなかったから頭が回ってなかったんです。(言い訳)

Titanium Mobileで親Viewにイベント伝搬させない

Titanium SDK:3.2.0
Alloy:1.3.0

親Viewと子Viewに同じClickイベントを設置した時、
デフォルトでは子ViewのClickイベント後、親Viewのclickイベントが発生します。

var parentView = Ti.UI.createView({
	height : Ti.UI.FILL,
	width : Ti.UI.FILL
});

parentView.addEventListener('click', function(e){
	console.log("parent click!");	
});

var childView = Ti.UI.createView({
	height : Ti.UI.FILL,
	width : Ti.UI.FILL
});

childView.addEventListener('click', function(e){
	console.log("child click!");	
});

parentView.add(childView);

click時

child click!
parent click!

これを制御するには、bubbleParentプロパティを制御します。

var childView = Ti.UI.createView({
	height : Ti.UI.FILL,
	width : Ti.UI.FILL,
	bubbleParent : false
});

click時

child click!

これで親プロパティのイベントが発生させないようにできます。

Titanium MobileでBase64でエンコードされた画像を表示。(Android/iPhone)

Titanium SDK:3.2.0
Alloy:1.3.0

サーバーからBase64エンコードされた画像データを表示したかったのだが、
AndroidiPhoneでハマったので、メモ。

// 画像取得先のURL(仮のもの)
var url = "http://hogehoge.com/getImage";

var xhr = Ti.Network.createHTTPClient({
	onload : function(e) {
		// レスポンスは{"img_string" : "Base64でエンコードされた文字列"}で返ってくるものとする。
		var response = JSON.parse(this.responseText);
		var img = Ti.UI.createImageView({
			image : Ti.Utils.base64decode(response["img_string"]),
			width : Ti.UI.FILL
		});

		// 以下、imgを画面に表示する処理を書く。






	},
	onerror : function(e) {
			// 失敗した時の処理
		},
		timeout : 3000 // 3秒経過したら、タイムアウト
	});
xhr.open("GET", url);
xhr.send();

ここで注意したいのは、最初、createViewのbackgroundImageで
表示しようと思ってたのだが、何故かandroidでは表示できなかった。

Ti.UI.createView({
	backgroundImage : Ti.Utils.base64decode(response["img_string"]),
	width : Ti.UI.FILL
});

仕方ないので、createImageViewでやったら、AndroidiPhoneの両方で
うまくいったので参考までに。

[追記]
・ImageVIewのimage
http://docs.appcelerator.com/titanium/3.0/#!/api/Titanium.UI.ImageView-property-image

・ViewのbackgroundImage
http://docs.appcelerator.com/titanium/latest/#!/api/Titanium.UI.View-property-backgroundImage

ちゃんと、使用できる型決まってるわ。
リファレンスはしっかり見ないと(反省)

Titanium MobileのSQLite3でBooleanを使用する際の注意点(Android/iOS)

Titanium SDK:3.2.0
Alloy:1.3.0

SQLite3のカラム型でBoolean型は存在しないので、
代わりにInteger型を使用することになると思うのですが、
iPhoneだとtrueを設定しても、SQLiteでは自動的に「1」が登録されます。

しかし、Androidでは自動的に変換は行われず、
nullになってしまうので、注意が必要です。

素直にtrueなら1、falseなら0を使うようにしましょう。

Titanium MobileにてBackボタンを無効化する。(Android/iOS)

Titanium SDK:3.2.0
Alloy:1.3.0

両OSでBackを無効化したかったので調べた。
色んな所で使用したかったため、グローバル関数にしてみた。

alloy.js

Alloy.Globals.disableBack = function(windowObj) {
	if (OS_IOS) {
		// iOSはナビゲーションバーを使用している前提。
		windowObj.leftNavButton = Ti.UI.createLabel({
			text : ' '
		});
	} else if (OS_ANDROID) {
		windowObj.addEventListener('android:back', function() {
			// 何もしない。
		});
	}
};

・index.js

Alloy.Globals.disableBack($.index) // windowオブジェクトを引数にする。

これで、動きました。

Titanium Mobile でOSのバージョンを取得する。(iOS/Android)

Titanium SDK:3.2.0
Alloy:1.3.0

Android 2.3.3で試す場合

gist8799810

OSのバージョンは「4.0.4」とか「2.3.3」と言った表記なので、
そのまま数値にすると「NaN」になってしまう。

したがって、「4.0」や「2.3」などに整形する必要がある。