2011年9月28日水曜日

Eclipseでプロジェクトをインポートする(zipのまま)

AndroidのレイアウトのXMLの講義を行うに当たって、サンプルプロジェクトを作成しています。それを元に、記事を書いていきたいなぁと思っているのですが、今回はそのサンプルプロジェクトをEclipseのワークスペースにインポートする方法をご紹介します。

サンプルは、githubにアップしています。
https://github.com/patorash/AndroidLayoutXmlStudy-Sample01

gitを使ってプロジェクトを読み込むこともできますが、今回はzip形式で読み込む方法です。まず、ダウンロードボタンを押します。
すると、ポップアップが出てくるので、Download .zip のほうを選択します。すると、zipでダウンロードされます。インポートはzipのままでもできますから、解凍しないでください。

ダウンロードしたプロジェクトを、Eclipseにインポートします。ファイルより、インポートを選択します。

既存プロジェクトをワークスペースへを選択し、次へを押します。
 さきほどダウンロードしたzipファイルを指定します。アーカイブ・ファイルの選択を選び、参照を押して、zipを選びます。すると、解析されて、プロジェクトが出てきます。出てきたのを確認したら、完了ボタンを押しましょう。
 なんかビックリマークがでてます。これは、プロジェクトの状態がおかしいぞ!というマークです(自分もよくわかってないですが)。直しましょう。
 プロジェクトより、クリーンを選択します。プロジェクトを一度綺麗にしてビルドしなおすという作業をしてくれます。プロジェクト単位で指定もできますし、全プロジェクトをすることもできます。お好きなほうを選びましょう。
 クリーンが終わると、ビックリマークが消えました。これでOKです。

以上で、サンプルプロジェクトのインポートが終わりました。
ようやく次回より、レイアウトXMLの説明ができそうです。

2011年9月27日火曜日

Eclipseでデバッグするための方法の基礎(DDMS)

さて、WebデザイナーのためのレイアウトXML講座と言っているのに、未だにレイアウトXMLの話に入らなくてごめんなさい。もう心折れかけているかもしれませんが、もうしばらく辛抱してください。これを説明してからじゃないと、完全に心が折られると思ったのです。すみません。

Androidを使っている人だったら見たことがあるかもしれませんが、アプリはエラーで強制終了することがあります。こんな画面です。


レイアウトを書いて、いざ確認しようと思ったら、いつか遭遇してしまう画面です。悲しいですね。一体なにがいけないの?プログラムがわからないとやっぱりダメなの?と、困惑することでしょう。画面を見ていても、エラーの原因はわかりません。デバッグ画面を見なければ。

ということで、Eclipseのデバッグ画面を見る方法です。
Androidの場合、Javaのデバッグ画面とは別にDDMSというものがあります。DDMSとはDalvik Debug Monitor Serviceの略です。AndroidはJavaのVMではなく、Dalvik VMというものの上で動いているので、それをデバッグ用にモニタするものです。

では、早速表示させてみましょう。 Eclipseの右上のほうには、パースペクティブというものがあります。今、Eclipseで扱っている機能を表してる感じです。Androidのコーディングをする場合はJavaのパースペクティブを表示しています。赤枠のところを押して、新しくパースペクティブを開きましょう。
すると、候補が色々出てきます。DDMSを選択します。なかったら、その他を押して、そこからDDMSを選択します。
すると、Javaのパースペクティブのボタンの横にDDMSというものができて、パースペクティブが切り替わり、DDMS用の画面が出てきます。以下のような感じです。
エミュレータや端末をデバッグモードでつないでいたら、左上のほうに以下のような感じで表示されているはずです。表示される情報は1端末ごとなので、繋がっている端末を選択しましょう(エミュレータでもOK)。
DDMSは多機能で私も全部使いこなしているわけではないですし、デザイナーの方にもDDMSの詳しい情報は今のところ必要ないと思うので、エラーの原因を調べるヒントを見る方法を説明します。それは、ログです。

アプリが強制終了したら、DDMSにログが出力されます(設定次第では出力されませんが、普通は開発中は出力されます)。 Devicesでデバッグ用の端末を選択したあと、下のほうにあるLogCatを見ます。いろんなログが出ていると思いますが、エラーの原因を見る方法は簡単です。

ログの表示レベルをEにします。右側にあるログレベルを表すアルファベットをクリックすると、そのログレベル以上のログしか表示されなくなります。
エラーでアプリが落ちるときは、Eレベルのログになります。直近のエラーなので、一番下のログを見れば、だいたいわかるというわけです。見たことがあるログだったら、エラーの原因がわかりますし、わからない場合はそのエラーの原因でググれば、大体の情報はネット上にあります。

今回は、AndroidManifest.xmlに指定されたActivityを定義し忘れていたので、ActivityNotFoundExceptionという例外が出ているというメッセージでした(もちろんわざとですよ!)。 このAndroidManifestにActivityの定義をし忘れるというのは、慣れてても時々やってしまうので、覚えておくといいと思います。本のサンプルを作っていると、定義をはしょられてて、DDMSを見て気づくことが結構あります。

2011年9月26日月曜日

Eclipse Android用Javaフォーマッタのインポートを行う

 GoogleはAndroidのソースに関して、コーディングルールを設けています。
 Eclipseだと、ctrl + shift + F(Macだとcommand + shift + F)で、Javaのコードをフォーマットしてくれるのですが、デフォルトのままだとAndroid用のフォーマットではありません。 EclipseにAndroid用のフォーマットを記憶させるために、以下の作業をしましょう。

 まず、以下のXMLをファイルとして保存します。
(本来は、Androidのソースコードが公開されているhttp://android.git.kernel.orgに置いてあるのですが、2011/09/26現在、不正な攻撃を受けたためにアクセスできないようになっていますので、こちらでコピーを公開しています。その点をご容赦ください)

<?xml version="1.0" encoding="UTF-8"?>
<profiles version="10">
<profile name="Android" version="10">
<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="100"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
</profile>
</profiles>

次に、保存したxmlファイルをEclipseに読み込ませます。
設定画面を開いて(Winならばウィンドウ > 設定。Macならば、Eclipse > 環境設定)
Java > コード・スタイル > フォーマッター を開き、インポートを選択し、上記のxmlのファイルを読み込ませます。

そして、アクティブなプロファイルの箇所で、Androidを選択し、適用ボタンを押します。
これで、Eclipseのソースフォーマット機能を使ったときに、Androidのコーディングルールでフォーマットしてくれます。(変数名などは別です。あくまでフォーマットだけです)
以上です。

レイアウトXMLを形成するXML群の概要説明

Androidのレイアウトを形成するのは、XMLがほとんどです。しかし、色んな種類があります。ここではレイアウトに関連するファイルに絞って、たくさんあるXMLの種類を説明します。まだ、レイアウト自体はしません。

先に言っておきますが、AndroidのXMLは、Web系のエンジニアを意識しているのかと思いますが、レイアウトとデザインの分離がしやすいようになっています。まさにHTMLとCSSの関係とそっくりです。HTMLとCSSの関係っぽく説明したいと思います。
レイアウトのXML = HTML
レイアウトのXMLは、ウェブサイトでいうHTMLの役割です。極論を言えばですが、CSSがなくてもウェブサイトは作れますね。それと同じくAndroidでもスタイルやテーマを使わなくてもアプリのレイアウトは作れます。しかし、似たようなパーツがたくさんできると修正が大変だったり、ミスも発生しやすくなります。そして、パーツやデザインを使い回したいのが世の常ですね。そこで、スタイルを使います。
スタイルのXML = CSS(細かいパーツ用)
スタイルは、レイアウトXML内の要素で使っている属性をまとめる事ができます。書き方はXMLですが、効果としてはCSSと似たようなものです。同じようなボタンの配置がある場合などは、まとめておくと修正も楽ですし、コード量が減ります。
テーマのXML = CSS(大枠)
ウェブサイトと多少違うところは、テーマという機能があるということですが、これもWordPressなどを使っていたらわかるかと思います。テーマを使う事で、サイトのパーツに統一性を持たせるように、アプリも統一性を持たせることができます。
例えば、ボタンの色をグラデーションかけたい、このアプリ内では全てそうしたいと思った場合に、全部のボタンにスタイルを適用するのは面倒ですし、適用忘れなどのミスも発生しかねません。そういう場合に、テーマを使います。
このアプリ内でこのパーツは全てこのデザインが適用されるという担保になりますので、積極的に使っていきたいところです。
こんなふうに書いてはいますが、私がレイアウトを作成する場合は

  1. とりあえずレイアウトのXMLをガリガリ書きながら見た目を逐一確認
  2. 見た目が完成したら、まとめられそうなものをスタイルにまとめる
  3. テーマにしたほうがよさそうなパーツはテーマへ
という感じでやっています。
まぁそこは人それぞれかと思います。

2011年9月24日土曜日

Androidプロジェクトを作り方とエミュレータ起動

Android開発環境構築はもう終わっていますでしょうか?まだの人は環境構築を先に行ってください。終わりましたか?終わってますよね?はい、終わった!!

つーことで、次はAndroidプロジェクトの作り方と、エミュレータへのインストールの方法を書きます。それができないと、何のために環境構築したのかって話ですよ。

では、いきましょう。
一番左上のプロジェクト作成ボタンを押して、Androidプロジェクトを選択します。


Androidプロジェクト作成ダイアログが表示されます。

  1. プロジェクト名を入れます。ここではとりあえずSampleというプロジェクト名にしました。
  2. ワークスペース内に新規プロジェクト作成を選択します。
  3. ビルド・ターゲットを選択します。ここでは、2.1-update1を選択しました。


続きです。パッケージ名を入力します。
パッケージ名というのは、Javaのソースを置くフォルダの構造みたいなものです。1アプリにつき、1パッケージでユニークな存在でなければなりません。まったく違うアプリでも、既に同じパッケージ名のアプリがインストールされていたら、インストールできません。
命名ルールとしては、ドメインの逆みたいな感じです。

私の場合は、
com.okolabo.android.[アプリ名]
などにしています。

ドメイン持ってる人はドメイン使いましょう。絶対に他人のドメインは使わないように!
次へボタンがありますが、次はテストプロジェクト作成なので、無視して終了を押してください。


すると、Sampleというプロジェクトができました。中身はこんな感じです。
重要なのだけ説明すると、


  • srcフォルダ・・・パッケージ名のフォルダがある。ソースを入れるところ。
  • genフォルダ・・・Eclipseが自動生成するフォルダ。絶対にいじらないこと。
  • assetsフォルダ・・・アプリで使うファイルを置くフォルダ。htmlとかを置いたりする。
  • res・・・リソースフォルダ。レイアウトのxmlファイルなどはここにある。
  • AndroidManifest.xml・・・アプリの設定ファイル。編集し忘れに注意。



では、早速作ったプロジェクトのアプリをエミュレータにインストールしてみましょう。実は、Androidプロジェクトは作られた時点でHello, world的なアプリが既にできています(Activityを作った場合)。
プロジェクトの上で右クリックして、実行を選択し、Androidアプリケーションを選びます。


すると、事前に作成しておいたエミュレータが起動します。エミュレータがない場合は作ってください。環境構築のところに書いています。


エミュレータが起動し終わったら、鍵マークをドラッグして右に引っ張ってロック解除します。

 Hello World, SampleActivity!と表示されているはずです。

こうやって、エミュレータにアプリをインストールして動作を見ながら確認していきます。ちなみに実機がつながっていたら、実機で確認できます。エミュレータは起動に時間がかかるので、実機を持っている場合は実機のほうが便利です。

あと、エミュレータを閉じてしまうと、また起動に時間がかかるので、そのままにしておきましょう。次に実行を行ったら、そのまま起動しているエミュレータにアプリがインストールされるので、手間が省けます。

ただ、エミュレータとEclipseを起動していると、かなりメモリを食うので、開発端末が重たくなります。実機を持っている場合は、実機でやったほうがいいので、次回は実機に開発中のアプリをインストールする方法を解説します。


2011年9月23日金曜日

Androidエミュレータを日本語化する方法

エミュレータを作ったはいいけど、英語じゃないかこれー!?どうすればいいの!?という人のために、書いておきます。
ホーム画面より、メニューボタンを押して、Settingsを選択します。
 すると、設定メニューが出てくるので、Language & keyboardを選びます。
 Select localeを選びます。
 一番下に、日本語がありますから、それを選択します。
 日本語になりましたー!!
以上!!

Android開発環境構築(MacOS X Lion 64bit)その3

さて、Androidのエミュレータの作り方を説明します。
まず、AVD Managerを起動させます。Virtual devicesを選択します。私の環境なのでたくさんエミュレータが作ってありますが、最初は何もないはずです。新規ボタンを押しましょう。


では、Xperiaというエミュレータを作ってみましょう。
理由は、Xperiaまでサポートすることが多いからです。画面サイズはSkinのところでいろいろと設定できますから、後でいろんなパターンのエミュレータを作ってみてください。

名前:Xperia
ターゲット:Google APIs API Level 7
SD Card:512MB
Skin:WVGA854

また、ターゲットでGoogle APIsではないものがありますが、それはGoogle Mapsが使えないタイプになります。Google Mapsアプリを作る機会もあるでしょうから、Google APIsで作ったほうがいいんじゃないかなと思います。

また、ハードウェアのところをいじれば色々と設定できますが、今回はそのままで。


Xperiaが追加されました。


Xperiaを選択して、開始ボタンを押したら、エミュレータが起動します。

起動が終わるとこんな感じの画面になります。適当にいじってみましょう。

次回は、これだけはやっておきたいEclipseの設定です。