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

  • 662
    いいね
  • 4
    コメント

追記(宣伝):
今年の夏から大阪でフルリモートなフリーランスAndroid/iOS/Webエンジニアをやっています。ただいま週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

image

Alt+Enter高速コーディング

Alt+Enterでキータイプ数を飛躍的に減らす方法集です。Alt+Enterでおそらく最初に使う自動インポートは設定で自動化できるし、単なるQuickfixとかは割愛して高速に書くためのテクニックを紹介します。

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

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

alt-enter-undef-variable.gif

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

image

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

もっと怠惰に右辺だけ書くこともできる。
右辺のメソッド名などがそのまま変数名になるのも便利(findViewByIdだとちょっと不便)。
image

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

String nickname = user.getNickname();

秒速キャスト

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

alt-enter-cast.gif

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

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

秒速でクラス追加

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

alt-enter-new-class.gif

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

image

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

image

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

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

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

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

image

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

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

image

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

image

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

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

作成

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

image

image

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

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

image

くくり出し

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

image

image

enumのswitchを一瞬で作る

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

alt-enter-switch.gif

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

Iterable(リストとか配列とか)をfor-eachループに展開

image

↓(|がカーソル位置)

for (Comment | : comments) {

}

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

static import

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

image

lambda式の変更

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

image

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

image

↓元に戻したり

image

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

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

Methodの例

Alt+Command+M

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

image

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

@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

Shift+F6:リネーム

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

image

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

image

F6:移動

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

image

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

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

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

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

image

Command+N: Generateメニュー

image

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

Command+Delete: Safe Delete

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

image

あとよく使うやつ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の力だ・・!!