カテゴリー別アーカイブ: アプリ開発

【Androidアプリ作成】単純なコードでエラーが出るときに確認したいポイント

開発をはじめてからもうすぐ3ヶ月。私が最初の方でつまづいたちょっとしたエラーたちをご紹介します。
(初心者向けなのでプログラムに詳しい方は読み飛ばしてください^^)

【 なぜこんな単純なソースでエラーが?? 】

最初の頃は(今でもそうですが)、XMLレイアウトを簡単に組んで実行して意図したとおりに
動いているか確認したいものです。それで簡単にえい、や!で作成したサンプルコードが
下記のものです。

エラーが出るサンプルコード)
<LinearLayout

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:orientation="horizontal"

android:layout_gravity="center"

android:layout_marginBottom="10sp">

<TextView

android:text="あああ"

android:textStyle="bold"

android:layout_gravity="center">

</TextView>

<TextView

android:text="いいい"

android:textStyle="bold"

android:layout_gravity="center"

android:layout_marginLeft="5sp">

</TextView>
</LinearLayout>

書いてみても特に構文エラー(書いて保存すると赤線引かれしまうアレです)
も出ないし起動してみると、エラーが出ます><
なんで、XMLでエラーでるんだよぉ!と嘆いたことありませんか。

このエラーはTextViewなどのタグの必須要素が指定されてないので
エラーが出たわけです。

必須要素はlayout_widthとlayout_heightです。
指定するときはいつでもこのお二方を入れてあげてください。

エラーを修正したサンプルコード)

<LinearLayout

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:orientation="horizontal"

android:layout_gravity="center"

android:layout_marginBottom="10sp">

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="あああ"

android:textStyle="bold"

android:layout_gravity="center">

</TextView>

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="いいい"

android:textStyle="bold"

android:layout_gravity="center"

android:layout_marginLeft="5sp">

</TextView>
</LinearLayout>

【 文字列を差し替えただけなのに動かない 】

とりあえずレイアウトがうまくいったので、
@stringを使って日本語と英語によって振り分けしようと文章を入れ替えたら
動かないということは今までにありませんでしたか。

こんな指定をすると構文エラーがでますので、注意しましょう。
<string name="param1">1. Let's Try Again</string>
<string name="param2">2. ' please touch me '</string>

何がいけないのかというと ' (アポストロフィー)が使われていることです。
アポストロフィーはプログラムで使用しますので、使うとプログラムだと解釈されて
「こんなところに書いてくれるなー!」と怒られてしまうわけですね。
(他の言語だと文字列に書くスペースなので、そんな解釈されることもない場合もあるのですが
Androidはエラーを出すプログラムのようです。)

じゃあ、アポストロフィーを使った表現は避けて記述しなきゃだめなのでしょうか。
いいえ、そんなことはありません。
Let's TryやI'mという表現もよく使う英文だし、使えないとうっとおしくて仕方ありません。

そんなときのためにあるのがエスケープシーケンス。
さきほどのエラーが出る文字列にエスケープシーケンスを入れてみましょう。

<string name="param1">1. Let\'s Try Again</string>

こんな感じに入れて実行すると、Let's Try Again と表示されます。
\を入れることで「この文字はプログラムに出てくるかもしれないけど、文字列ですから!!」と主張できるんです。

ちなみに\マークを表示させたい場合は、\をもう一つ記述します。
「\\」で「\」と表示されます。

2011.7.22
神森 真昼

【Androidアプリ作成】TableLayoutでborder(罫線)をつける方法

昨日はTableLayoutの使い方という基本的なところを書きましたが、
今回は罫線について書きます。

Tableといえば、やはりborderがつけて表みたいに見せるのが本来の使い方なので
borderをつけいたいという需要は多いのではないでしょうか。

私も調べてみましたが、
なんとTableLayoutでは罫線をつけるためのborder関係のプロパティがありません!

でも、borderをなんとかしてつけたいと思い、下記のようなサンプルコードを用意しました。
昨日のフルーツテーブルに罫線がつけてみました。

概念としては、罫線をつけたい<TableRow>にbackground要素につけたい罫線の色を設定します。
その中身の要素(この場合<TextView>)にmarginを指定します。
指定したmarginの値が大きければ大きいほど、罫線が太くなるという寸法です。

フルーツテーブル改)
<TableLayout

android:layout_width="fill_parent"

android:layout_height="fill_parent">

<TableRow

android:layout_width="fill_parent"
android:layout_height="fill_parent">

<TextView

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:text="1"

android:textColor="#FFFFFF"

android:background="#003366"

android:layout_weight="1"

android:gravity="center">

</TextView>

<TextView

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:text="2"

android:textColor="#FFFFFF"

android:background="#003366"

android:layout_weight="1"

android:gravity="center">

</TextView>

<TextView

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:text="3"

android:textColor="#FFFFFF"

android:background="#003366"

android:layout_weight="1"

android:gravity="center">

</TextView>

</TableRow>

<TableRow

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="#000000"

android:stretchColumns="*">

<TextView

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:text="みかん"

android:textColor="#000000"

android:background="#FFFFFF"

android:layout_weight="1"

android:gravity="center"

android:layout_marginLeft="1dip"

android:layout_marginBottom="1dip">

</TextView>

<TextView

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:text="りんご"

android:textColor="#000000"

android:background="#FFFFFF"

android:layout_weight="1"

android:gravity="center"

android:layout_marginLeft="1dip"

android:layout_marginRight="1dip"

android:layout_marginBottom="1dip">

</TextView>

<TextView

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:text="メロン"

android:textColor="#000000"

android:background="#FFFFFF"

android:layout_weight="1"

android:gravity="center"

android:layout_marginRight="1dip"

android:layout_marginBottom="1dip">

</TextView>

</TableRow>
</TableLayout>

2011.7.20
神森 真昼

【Androidアプリ作成】TableLayoutの使い方

HTMLの<table>タグのようにAndroidでも組むことができます。
下記は私が作成したサンプルコードです。

うまく表示することができれば、
上段に1、2,3という数字が入り
下段にみかん、りんご、メロンが入ります。

<TableLayout>は<LinearLayout>を継承したクラスなので、
基本のプロパティは一緒です。

★タグの説明
<TableLayout>・・・HTMLでいう<table>のことです。
<TableRow>・・・HTMLでいう<tr>のことです。

え、<td>なるものはないんですか?
結論から申し上げますとありません。

その代わりに
<View>、<textView>、<Button>の要素を置くことで<td>を表現します。

サンプルコード:フルーツテーブル)

<TableLayout

android:layout_width="fill_parent"

android:layout_height="fill_parent">

<TableRow

android:layout_width="fill_parent"

android:layout_height="fill_parent">

<TextView

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:text="1"

android:layout_weight="1"

android:gravity="center">

</TextView>

<TextView

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:text="2"

android:layout_weight="1"

android:gravity="center">

</TextView>

<TextView

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:text="3"

android:layout_weight="1"

android:gravity="center">

</TextView>

</TableRow>

<TableRow

android:layout_width="fill_parent"

android:layout_height="fill_parent">

<TextView

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:text="みかん"

android:layout_weight="1"

android:gravity="center">

</TextView>

<TextView

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:text="りんご"

android:layout_weight="1"

android:gravity="center">

</TextView>

<TextView

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:text="メロン"

android:layout_weight="1"

android:gravity="center">

</TextView>

</TableRow>

</TableLayout>

2011.7.19
神森 真昼

追伸:
全く関係のない話ですが、本日は一緒にアプリ開発を行なっている
ゲームプログラマーNECOの誕生日です。おめでとう!
・・・といっても特に何もプレゼントがないですが^^;

【Androidアプリ作成】HorizontalScrollViewの使い方

HorizontalScrollViewを使うと、横方向のスクロールが作れちゃいます。
例えばひたすら横に長い表や縦画面で見せたい横長画像などに最適です。

例)
<HorizontalScrollView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:fadingEdgeLength="25dip"
//横方向にまだコンテンツがあることを促すぼやかしの幅

android:layout_weight="1"
>

注意する点は横に長い場合はひたすらスクロールすればよいのですが、
横長でさらに縦にも長いコンテンツを扱う場合はこの方法だと縦にスクロールが適応されないことです。

さらに<HorizontalScrollView>の中に<Linearlayout>は1つしか使用できません。
正確には、

・な例)
<HorizontalScrollView>

<LinearLayout>

・・・

</LinearLayout>

<LinearLayout>

・・・

</LinearLayout>
</HorizontalScrollView>

<HorizontalScrollView>の直下に複数の<LinearLayout>が存在するため
表示がうまくいきません。

○な例)
<HorizontalScrollView>

<LinearLayout>

<LinearLayout>

・・・

</LinearLayout>

<LinearLayout>

・・・

</LinearLayout>

</LinearLayout>
</HorizontalScrollView>

複数の<LinearLayout>を使用する場合は1つの<LinearLayout>に入れて
入れ子構造にするとよいです。

2011.7.18
神森 真昼

【Androidアプリ作成】解像度の低い端末をサポート対象外にする方法

複数の端末に反映させたいのは作り手なら当然の思いですが、
あまりにも小さくてそもそも操作事態難しいアプリもあります。

そんなときはAndroidManifest.xmlに下記を記述します。

<supports-screens

android:smallScreens="false"

android:normalScreens="true"

android:largeScreens="true"

android:anyDensity="true" />

smallScreensにfalseと入れることで
「この端末では解像度が小さいディスプレイは対応してません」という意味になります。
AndroidMarketなどのマーケットでは、
ユーザー側でsmallScreensの対象となる端末が使用されている場合、このアプリは検索から除外されます。

では、どの解像度がどのscreens要素にあてはまるかはこちらのリンクを参照ください。

【 Android Developers 】
http://developer.android.com/intl/ja/guide/practices/screens_support.html
(このページの下の方に一覧表があります)

2011.7.9
神森 真昼

【Androidアプリ作成】解像度の違う端末に対応させるためには?

解像度の違う端末に対応させるためには、
res/layoutを解像度別に切って対応させるのが一番確実な方法です。

854*480の解像度に対応させたい場合
resの直下にlayout-800×480という名前のフォルダを作成し、それ用のXMLを入れます。

20110705_multidef1

複数の端末の解像度でシミュレーションするためには
エミュレータの設定をいじりましょう。

20110705_multidef2のようなアイコンを押すとエミュレータの設定画面が出ますので、
そこでNewを押して新規作成します。

20110705_multidef3

解像度やAndroidのバージョンなどが設定できます!

完了してすぐ実行してみたい人は設定したものを選んでStartを押して実行しましょう。

追記(2011.7.9)
フォルダを作って、指定したフォルダに調整したXMLを入れてみたけど動かない方は
AndroidManifest.xmlに下記のコードが記述されていないケースがあります。
動作しない場合はご確認ください。

<uses-sdk android:minSdkVersion=”3″ android:targetSdkVersion=”7″ />
<supports-screens

android:smallScreens=”true”

android:normalScreens=”true”

android:largeScreens=”true”

android:anyDensity=”true” />

miniSdkVesion : 対応させたい最小のAPI Level
targetSdkversion : 対応させたい最大のAPI Level

2011.7.5
神森 真昼

【Androidアプリ作成】Android解像別機種一覧表

続々とAndroidを搭載したスマートフォンが発表されるが、
解像度の違いに四苦八苦しそうです。
取り急ぎ解像度一覧表を作ってみました。
だいたいはこんな感じで他に見つけたらまたつけたしていきます。

【 480・800 】( 3 : 5 )
DELL Streak
GALAXY S
GALAXY S Ⅱ
GALAPAGOS
G'zONE
HTC EVO
HTC Desire HD
Libero
Optimus bright L07C
SIRIUS α (IS06)

【 240・320 】( 3 : 4)
GALAXY Mini
HTC Wildfire

【 320・480 】( 2 : 3 )
GALAXY Ace
Optimus chat
HTC Wildfire S

【 480・854 】(
9 :16 )
AQUOS PHONE THE HYBRID
IS05
MEDIAS
MEDIAS WP N06C
Motorola Droid X
REGZA Phone
Sweety
Xperia acro
Xperia arc
Xperia X10

【 540・960 】( 16 :9 )
AQUOS PHONE
INFOBAR A01

【 640・960 】( 2 : 3 )
IS03

【 768・1280 】( 3 : 5 )
Optimus Pad

【 600・1024 】
GALAXY Tab

2011.7.4
神森 真昼

Androidプロジェクト作成手順

20110704_pro

プロジェクトを新規作成し、Androidプロジェクトを選択すると上記のような画面が出る。

[ 入力する項目 ]
Project Name :任意の名前(最初に大文字にする)

Build Target: 対応したいバージョンのものを選択。

Properties:
Application name:任意の名前(ここに入れた名前で最終的にapkファイルが作られる)
Package name:任意のパッケージ名
Create Activity:任意のActivity名をつける。Android的なメインクラスを生成する。
Min SDK vertion:Build Targetで指定した最も古いバージョンのAPI Levelに合わせる。
この場合はAndroid2.1が一番古いので、7とする。

Finishを押して確定すればプロジェクト作成は完了です。

2011.7.5
神森 真昼

【Androidアプリ作成】エミュレータの起動を高速化する方法

Androidの開発を行う際に、手元にデバイスが無い場合は
emulatorを使って開発していくことになります。
開発は、トライアンドエラーを繰り返しながら行うことが多いので、
emulatorの起動が遅いと開発の効率も落ちてしまいます。
そんな時はスナップショットから起動することでemulatorの起動を高速化を期待できます。
以下の手順になります。

(1)スナップショット用のデバイスイメージを作る
・スナップショットを有効化
AVDのsnapshotをenabledにチェックを入れておきます。
・AVDのSD Cardの設定を最小限に設定
スナップショットのイメージサイズを少なくでき起動時のディスクIOを減らせます。
作成するアプリによりますが、10MBあれば大丈夫です。
・emulatorアプリケーションの管理から削除
消せるものは消しておきましょう。

(2)スナップショットを作成する
telnetでemulatorへアクセスし、スナップショットを作成できます
> telnet localhost 5554
$ avd snapshot save test

(3)スナップショットを指定して起動する
$ANDROID_HOME\tools\emulator.exe -scale 0.5 -no-boot-anim -no-snapshot-save -no-cache -memory 64 -snapshot test

私の環境下では、上記手順により今まで3分ほど要していた
emulatorの起動が20秒程度にまで短縮されました。
ご参考まで。

[参考] Android Emulator | Android Developers
http://developer.android.com/intl/ja/guide/developing/tools/emulator.html

2011.06.26
NECO

【Androidアプリ作成】シミュレータ画面を横表示に切り替える方法

次回作は横表示のアプリなのですが、
縦表示だと首曲げないといけないし、めんどくさいなぁと思ってやってたら、
「Ctrlキー+F12で横になるよ」とNECOに言われてしまいました。。

そうだったのか、知らなかった!!
ってか、首痛める前に早く教えてくれ!!

すぐショートカットを忘れてしまうので、備忘録に記載。。
皆さんも忘れたらここみてね、リファレンスにもリンクしておきます。。

2011.6.21
神森 真昼