Android Studioの超高速コーディングを支える技術（テクニック）

追記（宣伝）：
今年の夏から大阪でフルリモートな[フリーランスAndroid/iOS/Webエンジニア](https://stargzr.net/users/ypresto/contact/new)をやっています。ただいま週1-2または請負のお仕事お待ちしております・・！

----

画面見た人から（Enterやらショートカットやら連打で）何やってんだかわからないって言われることがたまにあるので、Android Studioでどうやってコーディングしているのかを書きました。
単なるショートカット集ではなく、あえてエラーのある状態を作るなどのテクニック集です。
なおMacかつAndroid Studio標準のキーバインドを前提としているので違う方は読み替えてください。（もちろんIntelliJでも同じことができるはずです・・！）

# 原則

- _考えるな、感じろ。_: Alt+Enterや補完キーなどを押した次の状態~~を頭の中に思い浮かべながら~~に対して反射的に操作すると、超高速コーディングできる
- エラーだろうが汚かろうが、一番素早い方法で書く
- **なんでもいいからいけそうな予感がしたらAlt+Enterを押してみて覚える・・！**
- 補完いけそうな予感がしたら補完キーを押してみる

# 補完キーを使う

デフォだとCtrl+Spaceに当たってますが**Spotlight検索と被ってる**ので、どちらかを違うキーに当てておいてください（自分は英数キーがAltになっているので、Android Studio側をAlt+Spaceにしてみました）。

なぜ先頭で取り上げるかというと、1、2文字入力したら補完出ますが補完キーを押した方が楽なケースもありなんだかんだよく使うためです。例えば、↓のようにリスナの実装を作るときに、`new `のあと補完が出ないので補完キー押します。Java 8以上だとlambdaの引数名（v）予測するのめんどいので補完キー必須です・・！

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/cc003917-d61d-079b-bc4d-b0aa90918ae3.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/5df6014b-f93f-decc-c95c-54b8e4025fef.png)

# Alt+Enter高速コーディング

Alt+Enterでキータイプ数を飛躍的に減らす方法集です。Alt+Enterでおそらく最初に使う[自動インポートは設定で自動化できる](http://qiita.com/sugoi_wada/items/db449d5cbb5c83cb586c#%E8%87%AA%E5%8B%95%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88)し、単なるQuickfixとかは割愛して高速に書くためのテクニックを紹介します。

## 秒速で新しい変数を作って代入

Swift慣れしすぎて型書くのがめんどくさくなっても大丈夫。型やセミコロンすら省略して書いて（`hoge = "fuga"`）、hogeのところでAlt+Enter→EnterでOK。型は右辺に合わせて選択されます。

![alt-enter-undef-variable.gif](https://qiita-image-store.s3.amazonaws.com/0/4153/115c62a8-b12e-2687-f60a-2feb1699ecb9.gif)

~~残像か・・！？~~ Alt+Enter離した瞬間にはEnter押しちゃってるので写ってないですが、１番目の選択肢です↓

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/5ebf747f-a09a-017a-e7bf-637980291c89.png)

### 右辺だけ書いて新しい変数に代入

もっと怠惰に右辺だけ書くこともできる。
右辺のメソッド名などがそのまま変数名になるのも便利（findViewByIdだとちょっと不便）。
![image](https://qiita-image-store.s3.amazonaws.com/0/4153/a5a25237-ac5d-79ac-2beb-5b883ba72e4b.png)


（または同じ場所でRefactor→Extract→Variable or Alt+Command+V）

```java
String nickname = user.getNickname();
```

## 秒速キャスト

キャストを手動で書く時代は終了。型が違おうがなんだろうがそのまま代入してAlt+Enter→Enter（これはセミコロンまで書く）。

![alt-enter-cast.gif](https://qiita-image-store.s3.amazonaws.com/0/4153/e515bda7-7d25-389c-1cf1-9999435c9fce.gif)

## トップダウンコーディング

未定義の型やメソッドなどをわざと赤いまま書いてAlt+Enterで秒速で作成するテクニックです。
すなわち、ボトムアップ的にあらかじめクラスやメソッドを作ってそれを補完するのではなく、トップダウン的にその場でコードを書き殴って登場したものをAlt+Enterで作成します。

### 秒速でクラス追加

実際は配置先のパッケージを選択する必要があるので秒速とまではいかないことが多いけど、操作の数は格段に減ります。↓では秒速変数代入とコンボしてます。

![alt-enter-new-class.gif](https://qiita-image-store.s3.amazonaws.com/0/4153/3e3fd906-db8b-8313-58af-6e8dac98c6cc.gif)

2番目の選択肢がinner classなのでこれも重宝しています。

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/58b52872-33f3-e950-847b-cc9d622135f9.png)

### 秒速でメソッドorフィールド追加

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/1e69f155-674d-9a3f-921f-82422b5f2e49.png)

getやsetから始まるメソッドだとCreate Getter/SetterやCreate propertyも使えます。普通のメソッドがほしいときはCreate methodでOKです。

|コマンド|フィールド|getter|setter|
|----|----|----|----|
|Create Getter|○|○| |
|Create Setter|○| |○|
|Create property|○|○|○|
|Create method| | | |

左辺の型を書かないと返り値のデフォルトがObjectになって面倒なので、**型推論の気持ちになって**左辺書くとあとはEnter連打で済むというコツがあります。

## 秒速でPOJOを作成

未定義コーディングのPOJO版ですが、この方法は新しいフィールドを追加するときにも便利です。
（※Gson使ってるなど、コンストラクタで引数渡さないタイプの場合は後で出てくるGenerateメニューからGetter自動生成で対応しましょう）

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/563963e8-d1b4-ae7a-cbb7-12ac7e814afe.png)

※すでにクラスが存在する場合は「Create constructor」になります。

ここでコンストラクタ引数の型と名前を聞かれるのでそのままでいい場合はEnterを高速連打。

それから、フィールドも作っちゃいましょう。

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/77b7595a-27ea-a9ba-f9e6-baa5a9086237.png)

Bindの場合はどれをbindすればよいか聞いてくるので雑にEnterで。finalが自動でつきます（イミュータブルでいきましょー！）。
（引数が1つしかない場合や、カーソル下の1個だけでいい場合はCreate fieldでOKです。こちらはfinalは選択式です。）

あとは未使用フィールドなことを活かしてAlt+Enterでgetter作る↓

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/fa24965d-5d88-d33b-3203-0b13c21da70e.png)

か、後でも出てくるGenerateメニュー（Command+N）→Getterを駆使すると多数のgetterをまとめて作れます。

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/a382477f-1e68-a461-72fd-2c364e241464.png)

↑初期状態だとこうなので、**Shift+↓を連打**して複数選択してEnterするのです・・！
_キーボードを使え、ルーク。マウスに頼るな。_

## res以下のリソースを秒速で作成orくくり出し

### 作成

トップダウンコーディングです。layoutやstring、drawable（xml）によく使いますが、xml系のresならだいたいいけるはずです。

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/fb97a5bb-191a-4b9b-eacc-c1af45f45e35.png)

↓

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/5c683d93-e876-cc7a-ded7-0f7bf3aacb04.png)

特にstringはその場でどんな文字列を入れるのか書けるのでめちゃくちゃ便利です。

あとxmlでも使えるの最高に便利です・・！

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/e801e7c3-77e5-85d4-6982-e2efea35c812.png)

### くくり出し

ハードコードされたstringのくくり出し↓

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/f67254ed-1ecd-8fa4-04dc-6f54dec039d6.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/3eb1cec1-ff2d-3f25-226e-871a0fecd8db.png)

## enumのswitchを一瞬で作る

switchブロックを秒速で作る→switchの中身がなくて黄色くなってるところをAlt+Enter。

![alt-enter-switch.gif](https://qiita-image-store.s3.amazonaws.com/0/4153/309d9080-e4ae-6106-c3a2-94d8725d69ca.gif)

どーん。
※↑IdeaVimでEsc押してますが、Esc押さなくても大丈夫でした。

## Iterable（リストとか配列とか）をfor-eachループに展開

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/fb327464-9e54-0b68-71d4-5071683d4c6a.png)

↓（`|`がカーソル位置）

```java
for (Comment | : comments) {

}
```

※メソッドの返り値にも使えます。Lightweight-Stream-APIとかでfor文書くのやめた人にとっては不要かも。

## static import

使う機会は少ないですが地味に便利です。もちろんInner Classとかにも使えます。

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/6aacb784-e9f2-1ff1-f240-dce256c99e70.png)

## lambda式の変更

↓不要な括弧を削除したり

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/fba32664-d216-d1c8-b2b4-ab312ec70ccd.png)

↓秒速でメソッドリファレンスに置き換えたり

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/41f069bf-7a8d-a9e7-8422-7e28672168ca.png)

↓元に戻したり

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/7ecd327a-6b37-3957-e1c2-157d52065616.png)

# Alt+Enter以外のよく使うショートカット

## 秒速で変数やメソッドのくくり出し

**絶対覚えておいたほうが良いやつ**。覚えてないとライトセーバー持たずに戦ってるような感じ。
メニューのRefactor→Extractの中。Alt+Command+まで思い出したらあとは思念で作りたいものの1文字目を押すだけ。

**Alt+Command+**

|キー|対象|備考|
|----|----|----|
|V|Variable|その場で変数に代入。**重要**。|
|C|Constant|定数を作成。Spectables入れてる人はキーが被るので要注意。Intent Extraのキーとか。|
|F|Field|フィールドを作成。代入する場所を選ぶことができる場合もある。**重要**。|
|P|Parameter|引数だけどこれは使ったことない・・|
|M|Method|カーソル下要素or選択範囲をくくり出してリファクタ。返り値や引数が自動判定される。 **重要**。|

同じ変数や処理やってる箇所を一括で置き換えるか聞いてきてくれるので便利。

※余談ですが、xmlだとRefactor→ExtractにStyleとLayoutがあるのでそれもうまく使えば便利なはずです。

### Variableの例

Alt+Command+V

Vはまず何も考えずに引数に渡すべきものをガリガリ書いて、でかくなったら変数に抜き出すというときに使える。

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/8a4b627a-d16a-04df-17de-b582182ddc68.png)

↓

```java
Uri uri = FileProvider.getUriForFile(TranscoderActivity.this, FILE_PROVIDER_AUTHORITY, file);
startActivity(new Intent(Intent.ACTION_VIEW)
        .setDataAndType(uri, "video/mp4")
        .setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION));
```

秒速で長い行が一時変数に。

### Constantの例

ハードコードされているものをとりあえず定数に。例えば下記の"user"というextraのキーをAlt+Command+Cでぶっとばせます。ただし、このやり方だとpublicな定数が作成されるので自分でprivateに書き換えなくてはなりません。

```
intent.putExtra("user", user);
```

### Fieldの例

Alt+Command+F

そのonCreate()でいじったtextView、フィールドとして持っておいて他の場所でも使いたいんだよな、というケース。

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/01b6f39a-f139-f594-4ffa-5367dd89a86b.png)

### Methodの例

Alt+Command+M

例えばIntentの作成の行が長くなってダルいケースも秒速。引数や返り値も自動判定。

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/9b4ccea4-067d-eb14-4be3-41a150d84a57.png)

呼び出し元が`Intent intent = getIntent(uri);`になって↓が追加される。

```java
@NonNull
private Intent getIntent(Uri uri) {
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(uri, "video/mp4")
    intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    return intent;
}
```

### 範囲選択

Extract系の場合、カーソルを曖昧な位置（メソッドチェーンの途中）に置いてると自動で範囲選択が登場するので、割と雑にやって大丈夫です。

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/9e449e20-27b2-59cc-efb1-cec6278edd33.png)

## Shift+F6：リネーム

idやstringなどの名前の場合はxmlも自動で変わります。（**idの場合の注意**：他のlayoutでも同じid使ってると全部置き換わります）

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/c0060a7e-3d79-e913-818f-84bcf69203e2.png)

もちろんこれもxml上でできます。

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/4bc0841d-adc0-9485-29f5-ff8717fee280.png)

## F6：移動

ただの移動ならドラッグ＆ドロップでもいいですが、高速コーディングで雑にInner Classとして書いてみてから普通のクラスに直すときによく使います。

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/48ace444-2ed7-03c2-7881-b150aec99758.png)


また、インスタンスメソッドの移動はかなり慣れないとうまく結果を出せないと思いますが、staticメソッドの移動はF6使えば簡単にできます。

## Command+F6：メソッドシグネチャの変更

~~見せてあげよう、IDEの力を・・！~~

主に引数を増やしたり減らしたり並べ替えたりするのに使います。該当メソッド呼び出してるすべての箇所で反映されます。ほとんど奥義です。**interfaceやoverrideされてるメソッドに対しても使える**のが最高に便利です。

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/cbbb3742-044f-9605-fd7c-50aa567aecc3.png)

## Command+N: Generateメニュー

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/a67bbeb2-512e-6d14-b384-ee0fe1b1f6e4.png)

本当になんでも作れるのでめちゃくちゃ便利です。特にConstructorとGetterをよく使います。BuilderとParcelableはpluginで追加したもので、これまたよく使います。

## Command+Delete: Safe Delete

クラスを消したいときこの消し方をするケースは多いかと思いますが、メソッドとかフィールドとかの削除にも使えて便利なんです・・！

![image](https://qiita-image-store.s3.amazonaws.com/0/4153/8b8c9bb9-ddac-fd47-45ca-9e19478e8be3.png)

# あとよく使うやつor便利なやつ

- Shift+F7: Find Usages. これは使う。
- Ctrl+H: Call Hierarchy. 「どこから呼ばれてるか」を調べるにはこっちのほうが断然便利・・！
- Command+B: Go to Declaration. Command+クリックでもやるけど概ねキーボードの方が早いはず。
- Shift+Command+A: ショートカット忘れたときにクラス検索のようにコマンド名で探せるやつ。メニューのHelp→Actionに同じ。

# 注意

IdeaVimな人は、コード生成直後の変数名の書き換えが「選択状態」になるのでちょっと面倒ですが、`i`でインサートモードに入ってからバックスペースを押すか、Escを押すと選択解除してから（当ててる人はCtrl+Wなどで消して）簡単に書き換えられます。

F6系の操作でたまに下側に確認画面が出ることがありますが、その場合は自動生成されたコードも書き換え対象になったパターンと、ただの文字列置換を行ってもいいかの確認パターンがあります。後者の場合は害悪なことが多い（特によく使われる単語だった場合にぶっ壊れる）ので、ツリーの根っこを選択してBackspaceで除外しましょう。

これがIDEの力だ・・！！