Study Jams 2016 in Kyoto
Android Development for Beginners Lesson 3
自己紹介
• 白山 文彦
• Android技術者
• 株式会社ミクシィ
• 株式会社リクルートマーケティングパートナーズ
• 株式会社マナボ
等でAndroidアプリ開発をしてきました
Javaのメソッド定義
public void doSomething(int arg) {
// do something
}
public void doSomething(int arg) {
// do something
}
public void doSomething(int arg) {
// do something
}
Modifiers
Modifiers
• アクセス修飾子
• public
• private
• protected
• /* package */
public void doSomething(int arg) {
// do something
}
Return Type
Return Type
• メソッドの返り値(戻り値)
• 必須
• 何も返さない場合は void
• プリミティブな型でもオブジェクトタイプ型でも良 い
ちなみに
Javaのプリミティブ型
• int…32ビット符号付き整数
• long…64ビット符号付き整数
• float…32ビット符号付き単精度浮動小数点
• double…64ビット符号付き倍精度浮動小数点
• boolean…真偽値
• char…文字型(NOT文字列) ※ byte, short は今日は省略
Javaのオブジェクト型
• String…文字列型
• Object型とそのサブクラス…自分で作る任意のクラ ス
public void doSomething(int arg) {
// do something
}
Method Name
Method Name
• メソッド名
• 動詞 + 目的語で書くことを推奨
• ex) calculateNumbers()
• キャメルケースで書くことを推奨
• ex) doSomethingReallyGreat()
• プリミティブな型でもオブジェクトタイプ型でも良い
public void doSomething(int arg) {
// do something
}
Parameter List
Parameter List
• 引数リスト
• 引数の型、引数の名前(仮引数)
• ex) void setText(String text);
• 必要ない場合は省略できる
• 必要ならコンマ区切りで複数定義できる
• ex) int calculateNumbers(int x, int y);
public void doSomething(int arg) {
// do something
}
Method Body
Method Body
• メソッド本体
• 波括弧 {} で囲む必要あり
• 任意のJavaの式や文を書くことが出来る
• メソッドの戻り値がある場合は最後にそれをreturn する必要がある
More About...
• Defining Methods
• https://docs.oracle.com/javase/tutorial/java/ javaOO/methods.html
Javaのオブジェクト指向プログラミング
オブジェクト志向とはなにか
• 処理の流れが単に上から下へ流れる手続きの塊では なく、意味のある単位で処理をまとめ、それらがメッ セージを送り合うことで協調して動作するようなプ ログラミングパラダイム
• 現在の主流と言って良い
設計図
(Class) (Instance)実際の家
クラス定義
public class Bicycle {
private int gear;
public Bicycle(int gear) {
this.gear = gear;
}
public int getGear() {
return gear;
}
}
public class Bicycle {
private int gear;
public Bicycle(int gear) {
this.gear = gear;
}
public int getGear() {
return gear;
}
}
public class Bicycle {
private int gear;
public Bicycle(int gear) {
this.gear = gear;
}
public int getGear() {
return gear;
}
}
コンストラクタ
コンストラクタ
• クラス名と同名のメソッドのようなもの
• 戻り値がない
• 初期化処理
クラスの利用方法
int gear = 1;
Bicycle bike = new Bicycle(gear);
int gear = 1;
Bicycle bike = new Bicycle(gear);
インスタンス化
Bicycle myBike = new Bicycle(1);
Bicycle dadsBike = new Bicycle(3);
Bicycle myBike = new Bicycle(1);
Bicycle dadsBike = new Bicycle(3);
両者は別物
ファクトリ
public class Bicycle { private int gear;
private Bicycle(int gear) { this.gear = gear;
}
public static Bicycle newInstance(int gear) { return new Bicycle(gear);
} }
public class Bicycle { private int gear;
private Bicycle(int gear) { this.gear = gear;
}
public static Bicycle newInstance(int gear) { return new Bicycle(gear);
} }
外からnewできない
staticメソッド
中でnew
Bicycle bike = Bicycle.newInstance(1);
ファクトリ経由でインスタンス化
More About...
• Classes and Objects
• https://docs.oracle.com/javase/tutorial/java/ javaOO/index.html
継承
public class Vehicle {
public Vehicle() {
}
public void go() {
// do something
}
}
public class Car extends Vehicle { public Car() {
}
public void feedFuel(int quantity) { // 省略
}
@Override
public void go() { super.go();
// do some extra }
}
public class Car extends Vehicle { public Car() {
}
public void feedFuel(int quantity) { // 省略
}
@Override
public void go() { super.go();
// do some extra }
}
継承
オーバーライド
継承
• 子クラス extends 親クラス
• 親の性質を引き継ぐ(プロパティ、メソッド)
• @Overrideで上書き可能
Back to Android!
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
何をしているか?
• レイアウトxmlのViewGroup(LinearLayoutとか) から再帰的に子View(ViewGroup)を読み込む
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.text_view); textView.setText("ANOTHER TEXT");
findViewById(id)
• setContentViewで読み込んだXMLの内容から引 数のidのView部品を探してコード上に読み込む
@Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.text_view); textView.setText("ANOTHER TEXT");
キャスト
• findViewById()はViewTreeの上から下まで読み込 むので具体的に何の型かプログラマが保証しないと いけない
• (TextView) findViewById(); のようにして TextView 型にキャストしている
色々なView部品
Common Android Views
Cheat Sheet
• https://s3-us-west-1.amazonaws.com/udacity- content/PDFs/Common+Android+Views
+Cheat+Sheet+(1).pdf
• Androidでよく使うView部品を簡単に一覧で確認 できる
EditText
EditText
• 使い方はこれまでのTextViewと同じような感じ
• XMLに記述 -> findViewById で探して処理を書く
<EditText
android:id="@+id/edit_text"
android:layout_width="wrap_content" android:layout_height="wrap_content" android:hint="INPUT HERE"
android:inputType="textCapWords" />
• android:hint…入力のヒント
• android:inputType="textCapWords"…先頭を大 文字にする(英字入力)
CheckBox
CheckBox
• チェックボックス
• こちらも同様に、XMLに記述 -> findViewById で 探して処理を書く
• チェック時にどんな処理をするとか、チェック状態 を調べるのは後述
<CheckBox
android:id="@+id/check_box"
android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Whipped Cream"
android:onClick="onCheckboxClicked" android:checked="true" />
• android:onClick…チェック時のイベントハンドラ
• android:checked…初期チェック状態
CheckBox checkBox = (CheckBox) findViewById(R.id.check_box); checkBox.setChecked(true);
チェック状態の コードからの変更
Intent
Intentとは
• 他のApp Componentとの連携方法
• ビデオでは「ボールをパスするようなもの」
• アプリ、機能の再利用、ユーザの選択の自由
Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:"));
intent.putExtra(Intent.EXTRA_SUBJECT, "Just Java order for " + name); intent.putExtra(Intent.EXTRA_TEXT, priceMessage);
startActivity(intent);
Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:"));
intent.putExtra(Intent.EXTRA_SUBJECT, "Just Java order for " + name); intent.putExtra(Intent.EXTRA_TEXT, priceMessage);
startActivity(intent);
何かを送る意図
Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:"));
intent.putExtra(Intent.EXTRA_SUBJECT, "Just Java order for " + name); intent.putExtra(Intent.EXTRA_TEXT, priceMessage);
startActivity(intent);
メール
Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:"));
intent.putExtra(Intent.EXTRA_SUBJECT, "Just Java order for " + name); intent.putExtra(Intent.EXTRA_TEXT, priceMessage);
startActivity(intent);
件名
Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:"));
intent.putExtra(Intent.EXTRA_SUBJECT, "Just Java order for " + name); intent.putExtra(Intent.EXTRA_TEXT, priceMessage);
startActivity(intent);
本文
Intentの種類
• 明示的Intent
• 連携する先を明示
• 暗黙的Intent
• ACTIONやデータ、カテゴリ等から連携できるコ ンポーネントを任意で選択してもらう
明示的Intent
Intent anotherActivityIntent = new Intent(this, AnotherActivity.class); startActivity(anotherActivityIntent);
別Activity
Intent anotherActivityIntent = new Intent(this, AnotherActivity.class); startActivity(anotherActivityIntent);
別画面に遷移
暗黙的Intent
なんか
http://google.com/ 開けそうな人いますかー?
ぼくら多分開けます!
アクション
• ACTION_VIEW
• 写真やマップの閲覧など「見る」アクション
• ACTION_SEND
• データの共有のアクション
データ
• setData()
• setType()
• setDataAndType()
カテゴリ
• CATEGORY_BROWSABLE
• データの表示
• CATEGORY_LAUNCHER
• 起動可能。ランチャに表示される
More About...
• インテントとインテントフィルタ
• http://developer.android.com/intl/ja/guide/ components/intents-filters.html
多言語対応
• Androidでは、テキスト、値、色、画像等々含め、 ベタ書きではなく res 以下にリソースとして定義す ることを推奨している
• 例えば、各言語向けに別々の文字リソースを用意す ることで、Javaのコードは1行も変更することな
く、日本語ロケールでは日本語を、その他では英語 を、みたいなことができる。
res/values/strings.xml
res/values-ja/strings.xml
<resources>
<string name="app_name">StudyJamSample</string> <string name="action_settings">Settings</string> <string name="button_label">BUTTON</string>
</resources>
<resources>
<string name="app_name">StudyJamSample</string> <string name="action_settings">Settings</string> <string name="button_label">ボタン</string>
</resources>
<Button
android:id="@+id/button"
android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/text_view" android:text="@string/button_label" />
余談
• AndroidStudioで覚えておくべきデバッグTIPS
• http://qiita.com/FumihikoSHIROYAMA/items/ e3159103ba2fba07e063