初心者なりにAndroidStudioを触ってみる

# やった理由
## 考えたこと
　プログラム未経験、さっぱり何もわかりません状態から技術の研修(Java)に行っているけど、
これって実際どんな風になるの？動くの？というところがいまひとつ実感わかないのが正直なところ
→　じゃあやってみて動かしてみればいいんだよ(名案)

## つまり
1. javaでSystem.out.printlnで出力するとか以外のことをしたいな
2. 更に言うなら身近なもの(完成形、目指したいもののイメージがつきやすいもの)がいいな
3. 更に更に言うならPCで作ったものが別のところで動いてる！！と思えるのがいいな

→　AndroidはJavaらしいし、条件も満たすし、情報も多そうだし、やってみよう！

# 前提
## 事前知識
* AndroidはJavaで開発らしい
* Java少しだけできる
    * 技術研修を２ヶ月やったくらい
    * つまり本当に少しだけ

以上

## 環境
* mac
    * macOS 10.13.2 

# 準備
## 環境構築
AndroidStudioなるもので開発するらしい・・・。

###以下を参考にとりあえずAndroidStudioインストール

[MacでAndroidアプリの開発環境を構築する方法（Android Studio）](https://techacademy.jp/magazine/1531)
[【Mac版】初心者のためのAndroid Studioインストール方法まとめ](https://blog.codecamp.jp/android_studio_mac)

AndroidStudio 3.1.2をインストール。

###英語のままだと使いづらいので以下を参考にして日本語化
[Android Studioのインストールと日本語化(3.0日本語化手順追記)](https://fidscreate.com/tool/android-studio#japanese3)

とりあえずの準備は完了。


# 実装
## 作るもの
とりあえず動くものをつくって、実機で動作する姿を見るのが目標なので、
単純に数字を入力して引き算をするアプリを作成することに。

##ActivityとLayout
AndroidStudioの開発では、プロジェクトを作成した段階でActivity(処理を記述するファイル)とLayout(画面上のレイアウトをXMLで記述するファイル)が用意されるので、そこに記述していく。

### Layoutいろいろ
今回書いたレイアウトは以下だが、指定したタグによって相対値/絶対値で配置を指定できる。
今回はRelativeLayoutを使用しているのでView(ボタン等)の相対値で表示するように指定されている。(組み合わせたりもできるみたい)

``` activity_main.xls

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout
    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:padding="16dp">

    <TextView
        android:id="@+id/mainText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="50dp"a
        android:layout_centerHorizontal="true"
        android:clickable="true"
        android:onClick="colChange"

    />
    <TextView
        android:id="@+id/addText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"/>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/mainFab"
        android:layout_width="54dp"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentEnd="true"
        android:layout_marginBottom="23dp"
        android:layout_marginEnd="49dp"
        android:clickable="true"
        android:src="@android:drawable/ic_menu_add"
        app:backgroundTint="?attr/actionMenuTextColor"
        app:rippleColor="?android:attr/actionMenuTextColor"
        tools:ignore="KeyboardInaccessibleWidget" />

</RelativeLayout>
```
また、AndroidStudioにはレイアウトを設定できるGUIがあるので、そちらで設定する方が直感的に操作できるかと。
微調整はXMLでするなど、使い分けで効率的にやれそう。。
ボタンなどの素材も一通り揃っているので、下準備なども簡単なものなら不要みたい。
<img width="1257" alt="スクリーンショット 2018-09-30 20.57.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/294274/e57e9a30-6a35-9019-c609-2f6ac5857f62.png">



以下参考
[今さら聞けないRelativeLayoutの話](https://qiita.com/yysk/items/c686153b39d32571d1bd)

### Activityの実装
こちらはにLayoutで記述したViewに紐づけて処理を実装していく。

``` MainActivity.java

package com.example.ma.itcamp;

import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import java.util.Random;

public class MainActivity extends AppCompatActivity {

    private SharedPreferences prefer;

    // onCreateというのは初めてActivityが生成された時の動き
    // 初期化時の処理はここに書く
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        // 大きく表示する部分のテキストをidで紐づける
        final TextView mainText = (TextView)findViewById(R.id.mainText);

        prefer = getSharedPreferences("init",this.MODE_PRIVATE);

        // 値を取得してテキストエリアに設定
        final int num = prefer.getInt("init",10000);

        // ここ表示の初期値
        mainText.setText(String.valueOf(num));


        // fab
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.mainFab);


        // fab長押した
        fab.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                SharedPreferences.Editor editor = prefer.edit();
                editor.putInt("init",10000);
                editor.apply();
                mainText.setText(String.valueOf(prefer.getInt("init",10000)));
                return true;
            }
        });

        // fab押した
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final EditText editView = new EditText(MainActivity.this);

                new AlertDialog.Builder(MainActivity.this)
                        .setIcon(android.R.drawable.ic_dialog_info)
                        .setTitle("入力してください。")
                        .setView(editView)

                        //OK押した
                        .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                SharedPreferences.Editor editor = prefer.edit();
                                int input = Integer.parseInt(editView.getText().toString());
                                int remain = prefer.getInt("init",10000);
                                int afterMinus =remain-input;
                                editor.putInt("init",afterMinus);
                                editor.apply();
                                mainText.setText(String.valueOf(afterMinus));

                            }
                        })
                        //キャンセル押した
                        .setNegativeButton("キャンセル", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                            }
                        })
                        .show();
            }
        });

    }

    public void colChange(View view){
        Random rand = new Random();
        int r = rand.nextInt(255);
        int b = rand.nextInt(255);
        int g = rand.nextInt(255);
        TextView mainText = (TextView)findViewById(R.id.mainText);
        mainText.setTextColor(Color.rgb(r,b,g));
    }

}
```
以下あたりを参考にして実装していく。
[onCreate と　onStart と onResume の違い](https://qiita.com/m2mtu/items/ac0d61e884519a4c61bb)
[Androidにてテキスト入力ダイアログを表示する[サンプルソース付き]](http://androidkaihatsu.seesaa.net/article/165325417.html)
[AndroidのFloatingActionButtonを実装する](http://developer.wonderpla.net/entry/blog/engineer/Android_FloatingActionButton/)

### こんな感じに。
<img width="341" alt="スクリーンショット 2018-10-01 0.40.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/294274/0e9c56f6-4174-285b-0268-309e04e0a756.png">
<img width="347" alt="スクリーンショット 2018-10-01 0.41.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/294274/5c8be25f-f3cf-77b4-7811-d7daeb16662b.png">
<img width="352" alt="スクリーンショット 2018-10-01 0.40.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/294274/5973e10a-e169-c0ee-cd5d-3eeebcacfb4d.png">

引き算！！以上だ！！

# 実機で動かしてみる
手元にあるGalaxyS6 edgeで動作させる。
実機を開発者モードにしてUSBで接続。。
して動作するかテストしてみたが、この段階でちゃんとインストールされているみたい。
便利〜！！

ちょっと想像と違っていたので別の方法でもインストールを試してみる。
色々体験してできた方がいいですし！
仮に何か公開して多数の端末にインストールするとなるとこの方法ではだめですし。

## apkファイルを実機にインストールする
以下を参考に。
※apk=exeとかbinのような実行ファイルのこと

[apkファイルをAndroid端末（実機）にインストールする方法](http://phpjavascriptroom.com/?t=mobile&p=android_apk_install)
[AndroidStudioで未署名APKを作成](https://qiita.com/Kenichi-Suzuki/items/0ec022c7492fcfa5399c)
[[Android] アプリを Google Play に公開、apkファイルの作成
](https://akira-watson.com/android/apk.html)

・・・動いた。
これでもうGooglePlayでアプリを公開することだって不可能ではないと言うことです。料金発生するけど。


# やってみて思ったこととか
* AndroidStudioが手厚く開発をサポートしてくれる
    * 初期レイアウト、素材、レイアウト設定のGUIなど、必要なものは用意してくれるので、最低限調べてぽちぽちしてるだけで実装できた！
* Javaって聞いてたけど知らないのがいっぱい出てきた
    * 一口にJavaと言ってもできることがとても多いんだろうなぁ
* 調べたら情報がザクザク出てくる
    * 現在業務で使ってる言語(ABAP)が調べても何もヒットしないことがザラなのでありがたみがすごい。(AndroidStudioを触ってみたのは業務開始の前だけど)
* データベース関連を全く触れなかったのでそちらにも触れられるといいな
    * できることが増えてアプリらしさが増しそう
* 時間の配分をミスした
    * 合宿で1泊2日で実施したけど、かなり時間を余らせてしまった
    * 自分のできることがまだ把握できていない

#以上。
つらつらと書いていたら長くなってしまった。
ありがとうございました。また何か触れたらいいな