初めてのAndroidアプリ開発ープログラミングの基本

#初めてのAndroidアプリ開発ープログラミングの基本
東北TECH道場の参加者向けに作成したハンズオンです。

Androidのアプリ開発は初めてで、プログラミングもあまりやったことが無いという人でも
「プログラミングとはどういうことか体験し、スマートフォンならではのタップ操作まで試すことが出来る」
というところを想定しています。

（Google Driveのスライドで作成していたのですが、Qiitaにスライドモードが追加されたと聞いて、このようなハンズオン資料に調度良いのではないかと思い作成してみました。講師として皆の前で話す時はスライドモードを使って説明し、各自が手元で進める時は通常モードの表示を見ながらやる...というようなシチュエーションに最適なのではないかと思います。）

まだスライドから転記しただけなので非常にざっくりとした説明になっていますが、これなら細かい説明も追記できそうです。

---

#プログラミングの基本要素
- 変数
- 分岐
- ループ

---
#前準備
---

###新規プロジェクト作成
Android Studio でプロジェクトを作成します。
Add an Activity to Mobile の画面では"Empty Activity"を選択します。

---
###レイアウトの編集

`android:id="@+id/textview"`の部分を追加します。

```xml:activity_main.xml
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/rootLayout"
    tools:context="org.tohokutechdojo.test.sleeping.MainActivity">

    <TextView 
        android:id="@+id/textview"
        android:text="hello world" android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</android.support.constraint.ConstraintLayout>
```

---
#変数
計算結果や文字列などを入れておくための箱
String, int, float などがあります。

---
##変数を使ってみる

**//追加** の行を入力しましょう。

```java:MainActivity.java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String greeting = "こんにちは";                               //追加
        TextView textView = (TextView) findViewById(R.id.textview); //追加
        textView.setText(greeting);                                 //追加
    }

```

入力したら実行してみましょう。

---
##String型

###String greeting = "こんにちは";
String … 変数の型。文字列型
greeting … 変数の名前
= … 代入を意味する。
"こんにちは" … 代入する内容。” で囲むと文字列になる

---
##TextView型
Androidで画面に文字を表示する際は TextView という型（クラス）を使います。

クラスについては、この時点ではある機能を実現するための部品と思っておいてください。

前準備のところでレイアウト中のTextViewに
`android:id="@+id/textview"`
とIDを割り振っておいたのはここで使うためです。


---

#分岐

```
if (条件式）{
    …
} else {	
    …
}
```

---
##時間で挨拶を変えてみる
- 0時から12時
    - おはよう
- 12時から16時
    - こんにちは
- 17時から24時
    - こんばんは

---

##現在時刻を取得して分岐させる

**//追加** の行を入力しましょう。

```java:MainActivity.java
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String greeting = "こんにちは"; 

        Date trialTime = new Date();                   //追加
        Calendar calendar = new GregorianCalendar();   //追加
        calendar.setTime(trialTime);                   //追加
        int hour = calendar.get(Calendar.HOUR_OF_DAY); //追加
        if (hour > 0 && hour < 12) {                   //追加
            greeting = "おはよう";                       //追加
        } else if (hour > 15) {                        //追加
            greeting = "こんばんは";                     //追加
        }                                              //追加

        TextView textView = (TextView)findViewById(R.id.textview);
        textView.setText(greeting);
    }

```

入力したら実行してみましょう。

---
#これから作るアプリ
睡眠誘導アプリ

---
##ひつじを3匹数えてみる

**//追加** の行を入力しましょう。

```Java:MainActivity.java
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String greeting = "こんにちは"; 

        Date trialTime = new Date();
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(trialTime);
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        if (hour > 0 && hour < 12) {
            greeting = "おはよう";
        } else if (hour > 15) {
            greeting = "こんばんは";
        }
        greeting += "。。。ひつじが１匹。。。ひつじが2匹。。。ひつじが3匹。。。"; //追加

        TextView textView = (TextView) findViewById(R.id.textview);
        textView.setText(greeting);
    }

```

入力したら実行してみましょう。

---
##眠れるまで何十回も書くのか？
---
##ループ（繰り返し処理）

ひつじが1匹
ひつじが2匹
ひつじが3匹
ひつじが4匹
ひつじが5匹
.
.
.

---
### for ループ
```java:
for (int i = 1; i < 10; i++) {

}
```

i … カウンタ
i < 10 … 条件式
i++ ... カウンタの値を1つ増やす

---
### for ループでやってみる

**//追加** の行を入力しましょう。

```java:MainActivity.java
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String greeting = "こんにちは"; 

        Date trialTime = new Date();
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(trialTime);
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        if (hour > 0 && hour < 12) {
            greeting = "おはよう";
        } else if (hour > 15) {
            greeting = "こんばんは";
        }

        int sheepNum = 10;                        // 追加
        for (int i = 1; i <= sheepNum; i++) {     // 追加
            greeting += "。。。ひつじが" + i + "匹";  // 追加
        }                                         // 追加

        TextView textView = (TextView)findViewById(R.id.textview);
        textView.setText(greeting);
    }
```

入力したら実行してみましょう。

---
#もっとインタラクティブに
画面をタップするとカウントするように。

---
##前準備
レイアウトのXMLを編集

`android:id="@+id/rootLayout"`の部分を追加します。

```xml:activity_main.xml
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/rootLayout"
    tools:context="org.tohokutechdojo.test.sleeping.MainActivity">

    <TextView android:id="@+id/textview"
        android:text="@string/hello_world" android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</android.support.constraint.ConstraintLayout>
```
---

##タップ処理の実装

**//追加** の行を入力、 **//削除** の行を削除しましょう。

```java:MainActivity.java

public class MainActivity extends AppCompatActivity {
    TextView textView;  // 追加
    int sheepCount = 0; // 追加

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String greeting = "こんにちは"; 

        Date trialTime = new Date();
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(trialTime);
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        if (hour > 0 && hour < 12) {
            greeting = "おはよう";
        } else if (hour > 15) {
            greeting = "こんばんは";
        }

        //int sheepNum = 10;                      //削除
        //for (int i = 1; i <= sheepNum; i++) {   //削除
        //   greeting += "。。。ひつじが" + i + "匹"; // 削除
        //}                                       // 削除

        greeting += "。。。ねむれませんか？"; //追加

        //TextView textView = (TextView)findViewById(R.id.textview);
        // 次の行のように修正（変数の型である TextView を削除）
        textView = (TextView)findViewById(R.id.textview);

        textView.setText(greeting);
        View view = findViewById(R.id.rootLayout);               //追加
        view.setOnClickListener(new View.OnClickListener() {     //追加
                public void onClick(View v) {                    //追加
                    sheepCount++;                                //追加
                    String text = "ひつじが" + sheepCount + "匹"; //追加
                    textView.setText(text);                      //追加
                }                                                //追加
        });                                                      //追加
    }

```

入力したら実行してみましょう。

---
`TextView textView = (TextView)findViewById(R.id.textview);`
を
`textView = (TextView)findViewById(R.id.textview);`
と修正して
`TextView textView;`
を先頭の方に追加した理由を考えてみましょう。