EclipseからAndroid Studioに乗り換えたけど、しっくりこない人のためのメモ

# これなに？

EclipseからAndroid Studioに乗り換え(ようと思っ)たんだけど、キーバインドとか挙動がいろいろ違くて慣れるのつらっていう僕(@ushi3_jp)みたいな人用のメモ。
基本的に、Eclipseチックにできるところは設定方法を、無理な場合はASでの操作を書いています。


なお、僕はWindowsユーザーなので、Macの人はASの ***Settings*** を ***Preferences*** と脳内変換してください。

# IDE設定

## 起動すると、最後に開いてたプロジェクトが開かれる

俺は別のプロジェクトを開きたいのに、以前のプロジェクトが自動で開かれて、しかもgradle動き始めるからつらい…

>     Settings -> Appearance & Behavior -> System Settings
Startup/Shutdownの ***Reopen last project on startup*** のチェックを外す


## コードの折り返し文字数

>     Settings -> Code Style
***Right margin (columns)*** の値を変更する。


# KeyMap

KeyMapのプリセットにEclipseあるから、切り替えてみたけど違和感ある…
**KeyMapをEclipseにした人用**


## 左辺生成

new ArrayList<>()とか書いて、左辺を自動生成する。Eclipseだと **Ctrl+2→L** など。

> ASでは、**Ctrl+Alt+V** で左辺が生成されます。
なお、Classスコープでは左辺生成できない模様。


## コンストラクタやgetter/setterの生成

Eclipseだと、コンストラクタは**ClassスコープでCtrl+Space** で作れたりする。
getter/setterのコマンドは忘れた。

> ASでは、**Alt+Insert** で自動生成候補が出てきます。
何かしら自動生成したかったらとりあえず***Alt+Insert***押してみるとよさげ。


## 選択行の移動

選択している行を上下方向に移動する。Eclipseだと**Alt+上下**

if文の中などでやってみるとスコープごと移動される、なんか違う…

> *Alt+上下* は***Move Statement Down/Up*** になっています。
***Move Line Up/Down*** に変更すると行単位で移動します。


## 選択行のコピー

選択している行を上下方向にコピーする。Eclipseだと**Ctrl+Alt+上下**

上押しても何も起きないんだけど…
> **Ctrl+Alt+下** しか定義されてないです。


上にコピーしたいんだけど…
> 残念ながら上下の区別がないので、**下方向にしかコピーできない**です。


## 呼び出し元、型階層

> 呼び出し元は ***Ctrl+Alt+H***、型階層は ***F4***


# コーディング

## ClassなどをホバーしてもJavadocが出てこない

>     Settings -> Editor -> General
Otherカテゴリーの ***Show quick doc on mouse move*** をチェックする。
***Delay*** をいじることで、ホバーしてからdocが出るまでの時間を調整できる。


## sysoutでSystem.out.printlnが出てこない

>     Editor -> Live Templates
Javaではoutputグループの定義が有効です。デフォルトでは、***sout*** が ***System.out.println*** となっています。必要であれば、***Abbreviation*** の内容を変更することで、好みのテンプレートキーワードにできます。

同設定のiterationsグループには、for文のテンプレートが定義されています。デフォルトでは ***for-each*** のテンプレートが ***iter*** で呼び出せるようになっています。


## 1行コードのメソッドが勝手にcollapse表示される

>     Settings -> Editor -> General -> Code Folding

Collapse by defaultの ***One-line methods*** のチェックを外します。


## getter/setter生成時にJavadocを付けてほしい

> ***そんな機能はない***

> [JavaDoc](http://plugins.jetbrains.com/plugin/7157 "JetBrains Plugin Repository :: JavaDoc") ってプラグイン入れてみたら？と言われました。
インストールすると、***Alt+Insert*** にJavaDoc自動生成する項目が増えるぞ！


## メンバ変数mHogeのgetterの自動生成がgetmHoge()になってしまう

>     Settings -> CodeStyle -> Java
***Code Generation*** タブにある ***Naming*** グループの***Field***の***Name prefix***に「***m***」を入力すると、アクセサメソッドを自動生成するときにprefixを除いてくれます。
必要に応じて、Static fieldに「s」とか入れとくといいかもしれないです。


# プロジェクト構成

New Projectしたんだけど、俺の知ってるプロジェクト構成じゃなくて死ぬ…

Android Studioはgradleのマルチプロジェクト構成になってます。なので、Eclipseのときとはディレクトリ構造が違います。

```bat:tree
SampleProject
    │  build.gradle
    │
    ├─app
    │  │  build.gradle
    │  │  
    │  ├─libs
    │  └─src
    │      ├─androidTest
    │      │  └─java
    │      │
    │      └─main
    │          │  AndroidManifest.xml
    │          │  
    │          ├─java
    │          └─res
    │
    ├─build
    └─gradle
```

Eclipseで言うと、プロジェクトはappディレクトリにあたります。ただ、なんかAndroidManifest.xmlとかresとかの位置が違いますね。これは、build flavorsの影響でこのような構成になっています。（たぶん

ASはプロジェクトのソースディレクトリをbuild.gradleの記述を元に表現しています。
なので、ワシはこんなディレクトリ構造でやりとうない…という方は**app/build.gradle**を書き換えるといいでしょう。

```groovy:build.gradle
// …

android {
    // …

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src/main/java']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }
    }
}
```

プロジェクト構成を変えたい場合は、android.sourceSetsを定義します。
上のsourceSetsには、***manifest***、***java***、***res***、***assets*** のファイル(ディレクトリ)が定義されています。逆に言うと、 **build.gradleを見ればプロジェクトの構成がわかります。**

これを適用させると、プロジェクトは以下の構成に切り替わります。

```bat:tree
SampleProject
    │  build.gradle
    │
    ├─app
    │  │  AndroidManifest.xml  ←
    │  │  build.gradle
    │  │  
    │  ├─assets  ←
    │  ├─libs
    │  ├─res     ←
    │  └─src
    │      ├─androidTest
    │      │  └─java
    │      │
    │      └─main
    │          └─java
    │
    ├─build
    └─gradle
```

ちなみに、**AndroidManifest.xmlはあらかじめ自分で移動or生成しないとgradleが通らない** ので注意してください。

チーム開発でこれをやる場合は、念のためメンバーと相談してからやりましょう。