[Android] 2回目のAndroid開発入門 - 1 -  AndroidStudio, Realm, ActionBar(tab, menu), Intent

# 状況
作ったiOSアプリをAndroidで実装してみようと思い立って、やってみているログになります。拙いところはご容赦下さい。
iOSとAndroidの思想の違いに困惑して、UIを探りながら進めています。

# ログ

![Screen Shot 2015-09-07 at 15.21.31.png](https://qiita-image-store.s3.amazonaws.com/0/18705/6202ba1d-36d3-fc42-af52-4ec2f0b8c9b8.png)

## 1日目
- 内容: MBAにかつて構築したAndroid開発環境を最新にしてみる
- 時間: 15分

　一年前くらいに構築したものだったから結構バージョンが変わっていたので、インストールしました。あ、あとAndroidStudioも更新しました。

![Screen Shot 2015-09-07 at 15.21.53.png](https://qiita-image-store.s3.amazonaws.com/0/18705/0b9f069a-7996-69e3-1d12-c7826ce6b972.png)

## 2日目
- 内容: Realmを入れる
- 時間: 15分

[こちら](https://realm.io/jp/docs/java/latest/)を見れば簡単に出来ました。
Mavenを使ってrealmを入れます。
build.gradleファイルにcompile 'io.realm:realm-android:0.82.1'を追記して、syncします。

![Screen Shot 2015-09-09 at 13.04.00.png](https://qiita-image-store.s3.amazonaws.com/0/18705/c9ee3464-6d79-2450-d06a-36f180786a6e.png)

![Screen Shot 2015-09-09 at 13.41.17.png](https://qiita-image-store.s3.amazonaws.com/0/18705/63770f94-84f8-1c9a-3675-7ff293b8c4c6.png)

Android StudioのメニューからTools->Android->Sync Project with Gradle Filesを選択したり、ナビゲーションが出るのでそれをタップしたりして、syncします。

![Screen Shot 2015-09-09 at 13.04.05.png](https://qiita-image-store.s3.amazonaws.com/0/18705/dd4a35de-ce91-9194-6be4-11273c70e6bc.png)


![Screen Shot 2015-09-09 at 13.03.43.png](https://qiita-image-store.s3.amazonaws.com/0/18705/cdae33aa-cec8-f8d0-4779-706447c1cf9c.png)

![Screen Shot 2015-09-09 at 13.04.38.png](https://qiita-image-store.s3.amazonaws.com/0/18705/49abce58-2bba-fbcc-5113-d029f27b76e1.png)

### モデルを作ってみる

ユーザーモデルを作ってみました。

```java
package com.example.android.actionbarcompat.shareactionprovider.models;

import io.realm.*;
import io.realm.annotations.*;

public class User extends RealmObject {

    @PrimaryKey
    private String          name;
    private int             age;

    @Ignore
    private int             sessionId;

    // Standard getters & setters generated by your IDE…
    public String getName() { return name; }
    public void   setName(String name) { this.name = name; }
    public int    getAge() { return age; }
    public void   setAge(int age) { this.age = age; }
    public int    getSessionId() { return sessionId; }
    public void   setSessionId(int dontPersist) { this.sessionId = sessionId; }
}
```

### Proguard対応

Realmのバージョンは0.81.1以降の場合。

![Screen Shot 2015-09-09 at 13.43.05.png](https://qiita-image-store.s3.amazonaws.com/0/18705/50f52470-c1d4-95f3-f6a9-fc73657a30a3.png)

以下を追記。

```java
-keep class io.realm.annotations.RealmModule
-keep @io.realm.annotations.RealmModule class *
-dontwarn javax.**
-dontwarn io.realm.**
```

![Screen Shot 2015-09-09 at 13.43.11.png](https://qiita-image-store.s3.amazonaws.com/0/18705/60946871-7aeb-1320-77ae-438617714a03.png)

### とりあえずビルドしてみる

とりあえずビルドも通りました。
この段階でswiftとは書き方がだいぶ違っていて、若干心が折れそうです。

## 3日目
- 内容: Tabbar形式でプロジェクトを立ち上げてみる
- 時間: 15分

Android Studioでプロジェクトを立ち上げるところから始めました。（Realmは再度入れました）

### APIのバージョンなどを決めます

![Screen Shot 2015-09-09 at 13.35.43.png](https://qiita-image-store.s3.amazonaws.com/0/18705/e681420b-088a-2275-dd13-31cc6c741c75.png)

とりあえず15以上でやってみました。

### 新規プロジェクトの設定

![Screen Shot 2015-09-09 at 13.35.54.png](https://qiita-image-store.s3.amazonaws.com/0/18705/852c90bc-57e6-4b75-fb05-35e03d5fb24d.png)

Aciton Bar Tabs with ViewPager な Activity を作ってもらいます。

![Screen Shot 2015-09-09 at 13.37.18.png](https://qiita-image-store.s3.amazonaws.com/0/18705/c06894f1-5f2e-23ce-bfc2-cbd6f4b01356.png)

![Screen Shot 2015-09-09 at 13.38.55.png](https://qiita-image-store.s3.amazonaws.com/0/18705/700bcf81-2651-e45d-bb13-46a4617d9945.png)

プロジェクトをビルドします。

![Screen Shot 2015-09-09 at 13.39.01.png](https://qiita-image-store.s3.amazonaws.com/0/18705/66425899-e0d7-6a90-59aa-8697a143e201.png)

![Screen Shot 2015-09-09 at 13.41.17.png](https://qiita-image-store.s3.amazonaws.com/0/18705/e0772d14-183c-3830-4d23-9207abbd082a.png)

### 確認

ビルドが終わってAndroid Studioが起きて、実装できるようになったら、Runしてみました。

![Screen Shot 2015-09-10 at 17.02.01.png](https://qiita-image-store.s3.amazonaws.com/0/18705/35aed44b-4852-3c70-7d39-db7afa1ff2fb.png)

(画像ではアプリ名がデフォルトから変更されています)

とりあえず表示されました！
今日はここまで

## 4日目
- 内容: タブメニューを変更してみる
- 時間: 

```java:MainActivity.java
public class MainActivity extends AppCompatActivity implements ActionBar.TabListener {
    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            return PlaceholderFragment.newInstance(position + 1);
        }

        @Override
        public int getCount() {
            return 5; // <- 5つタブを出したいので5にする
        }

        // ↓を↑に対応させる
　　　　　@Override
        public CharSequence getPageTitle(int position) {
            Locale l = Locale.getDefault();
            switch (position) {
                case 0:
                    return getString(R.string.title_section1).toUpperCase(l);
                case 1:
                    return getString(R.string.title_section2).toUpperCase(l);
                case 2:
                    return getString(R.string.title_section3).toUpperCase(l);
                case 3:
                    return getString(R.string.title_section4).toUpperCase(l);
                case 4:
                    return getString(R.string.title_section5).toUpperCase(l);
            }
            return null;
        }
```

### Stringを調整する

```java:res/values/strings.xml
    <string name="title_section1">Section 1</string>
    <string name="title_section2">Section 2</string>
    <string name="title_section3">Section 3</string>
    <string name="title_section4">Section 4</string>
    <string name="title_section5">Section 5</string>
```

![Screen Shot 2015-09-10 at 16.59.22.png](https://qiita-image-store.s3.amazonaws.com/0/18705/b765b48a-5fef-25d0-033c-01885d047737.png)

## 5日目
- 内容: option menuを追加してみる
- 時間: 

AndroidのtabとiOSのtabがだいぶ違うことにやっと気づいたので、方針転換。
とりあえず、なんとかoption menuを追加してみる。

### fooとbarのiconは常に表示させて、settingはスペースがある場合のみ表示という感じでいきたい。

http://inon29.hateblo.jp/entry/2014/03/09/162616

```xml:menu_main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:compat="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity">
    <item
        android:id="@+id/foo"
        android:icon="@android:drawable/ic_menu_gallery"
        compat:showAsAction="always" />
    <item
        android:id="@+id/bar"
        android:icon="@android:drawable/ic_menu_add"
        compat:showAsAction="always" />
    <item
        android:id="@+id/setting"
        android:icon="@android:drawable/ic_menu_preferences"
        compat:showAsAction="ifRoom"
        android:title="@string/action_settings"
        android:orderInCategory="100"
         />
</menu>

```

strings.xmlは割愛。

```java:MainActivity.java
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        switch (item.getItemId()) {
            case R.id.foo:
                return true;
            case R.id.bar:
                return true;
            case R.id.setting:
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
```

![Screen Shot 2015-09-19 at 22.44.03.png](https://qiita-image-store.s3.amazonaws.com/0/18705/27ebd990-2bb6-9b99-5903-7ce4005bd878.png)


settingが消えるのも確認しました。

![Screen Shot 2015-09-19 at 23.04.07.png](https://qiita-image-store.s3.amazonaws.com/0/18705/69c34288-5da2-b88d-2718-b6e8ef0f87fd.png)

### iconをタップすると次のActivityが立ち上がるようにする

1. Activity(例、FooActivity)をつくります
2. intentを渡します

```java:MainActivity
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.foo:
                showFoo();
                return true;
・
・
・
    private void showFoo() {
        Intent intent = new Intent(this, FooActivity.class);
        startActivity(intent);
    }
```

とりあえず実現はできました。


=================================================

# References
## Android Studio
- [対処法: Android StudioでLibraryをimportするには？](http://android.tecc0.com/?p=39)

## UI
- [Inspired UI](http://android.inspired-ui.com/)
- [Android Niceties](http://androidniceties.tumblr.com/)
- [アプリ開発で参考にしておきたい UI デザインパターンまとめサイトのまとめ](http://qiita.com/ShogoMizumoto/items/3a2293e3549ba698a71c)

## Realm
- [Realm Java latest](https://realm.io/jp/docs/java/latest/)
- [Realm for Android](http://qiita.com/wasabeef_jp/items/92bb700e37a0a57fc765)

## ActionBar
### Menu
- [Android Drawables](http://androiddrawables.com/Menu.html)
- [support-v7-appcompat を使うときの menu リソースの showAsAction](http://qiita.com/KeithYokoma/items/e7c7b960a0fb1d983355)
- [【android システムアイコン利用】Resource is not public.が出たときの対処法
2011/06/01](http://www.imamura.biz/blog/google/android/747)
- [2014-03-09
【Android】ActionBarを使ってみる ① (メニューボタン)](http://inon29.hateblo.jp/entry/2014/03/09/162616)