Android Studio最速入門~効率的にコーディングするための使い方

第17回エディタの[その9]─いろいろなナビゲーション

はじめに

編集機能についてはあらかた説明を終えたので、今度は移動手段について説明します。

Navigateメニューひとめぐり

主な移動コマンドはメニューバーの「Navigate」に集約されています。まず手始めにこのメニューを上から順に説明していきます。Eclipseを使っていた人向けに補足すると「ナビゲート」メニューに相当すると思って下さい。Eclipseと類似している機能は極力、それと対比するように説明していきます。

クラス・ファイル・シンボルへ移動

上から順に「クラスに移動」⁠ファイルに移動」⁠シンボルに移動」です。Eclipseの相当機能は「ナビゲート → リソースを開く...」「ナビゲート → 型を開く...」だと思います。

図1 クラス・ファイル・シンボルへ移動
図1

Eclipseと比べるとシンプルな検索ウィンドウが開きます。このウィンドウ上で文字を入力して、検索対象を絞り込んでいきます。

検索対象(用途)に応じてコマンドが分かれています。使い分けは面倒かと思いますが、こういうものだと思ってあきらめて使い方を覚えましょう。

「Navigate → Class...」
Javaのクラスを検索します。
チェックボックス(Include non-project classes)をONにすることで、プロジェクトのソースコード以外のクラス(ライブラリなどのクラス)を検索することができます。
検索ワードは、コード補完と同じく中間マッチングが有効で、大文字・小文字はちょっとだけ意味を持ちます(大文字を続けた場合、キャメルケースの先頭文字をマッチしようと試みます⁠⁠。
ワイルドカードとしてアスタリスク*が有効です。ただ、検索文字は「その文字からはじまるクラス」を検索するわけでもないし、スペースもワイルドカードの一種として評価するため、アスタリスクの出番は少ないです。
図2 ⁠Navigate → Class...」の例
図2
検索ワードの後に「スペース」を入れることで「そのワードで終わるクラス」を検索できます(実は「このワードではじまるクラス」だけを検索することができません⁠⁠。
内部クラスは普通に検索ワードで検索できますが、匿名クラスについては検索ワードの末尾に$数字を指定して検索できます。とは言え、そのクラスに匿名クラスが存在しているかどうかは移動してみないとわからないので、実用性については疑問の残る指定方法だと思います(覚えなくても損はしないでしょう⁠⁠。
図3 ⁠$数字」を指定して匿名クラスに移動する(クリックすると動きがわかります)
「Navigate → File...」
プロジェクト内のファイルを検索します。
Javaのクラスもファイルとして検索できるので、機能的には「Navigate → Class...」を包括しています。
ここでもチェックボックス(Include non-project files)をONにするとプロジェクト外のファイルも検索対象となりますが、先ほどのクラスほどONにする用途は無いでしょう。
図4 ⁠Navigate → File...」の例
図4
検索する対象は「ファイル」だけではなく「ディレクトリ」も検索できます。
検索ワードの入力規則は「Navigate → Class...」と同じです。ファイル検索の場合、スラッシュ/で区切ることで、特定のディレクトリを絞り込むことができます。
図5 スラッシュ(/)でディレクトリの絞り込みを行う(クリックすると動きがわかります)
「Navigate → Symbol...」
シンボル(Javaのクラスやメソッド、フィールドなど)を検索します。こちらも機能的には「Navigate → Class...」を包括しています。
図6 ⁠Navigate → Symbol...⁠⁠」の例
図6

使い方は人それぞれだと思いますが、筆者は画面を極力広く使いたいため普段は「Projectツールウィンドウ」を閉じて使っています。そのため、目的のクラスやファイルに素早く移動するためにこのメニューを多用しています。移動対象によってコマンドが3つ(Class, File, Symbol)に分かれていますが、主に使うのはクラス検索、次いでファイル検索です。意外かも知れませんがシンボル検索は滅多に使いません。理由は簡単でシンボル名までしっかり覚えてないからです。

いずれにしろ、3種類もショートカットキーを覚えるのは苦痛なので、まずは「Navigate → File...」から使ってみる事をオススメします。

ちょっとしたTIPSですが、この検索ウィンドウにリストアップされる候補に対して"Quick Definition"や"Quick Documentation"が使えます。これは思いのほか便利です。

図7 "Quick Definition"で候補から定義内容を参照
図7

またエディタ上で何かを選択状態にして、これらのコマンドを実行すると検索ウィンドウに、その選択内容が展開されます。"Select Word at Caret"と組み合わせると、まあまあ便利なのですが、対象がクラスやメソッドの場合、後述する専用の移動コマンドがあるのであまり使い道がありません。

むしろ、コメントやリテラル中の文字列から任意の対象へ移動する場合に使うと、そこそこ便利です図8⁠。

図8 選択中の文字列があると、それを検索ワードとして引き継ぐ(クリックすると動きがわかります)

それと、IntelliJのヘルプから知ったのですが、この「Navigate → Class / File / Symbol」の検索候補を選ぶときにEnterキーではなく、SHIFT+Enterキーを押すと対象ファイルが 別ウィンドウ で開きます。

図9 SHIFT+Enterキーで別ウィンドウにファイルを開く(クリックすると動きがわかります)

この機能「Preferences / Keymap」にも載っていないので今まで見落としていましたが、これ以外でも「Projectツールウィンドウ」「TODOツールウィンドウ」⁠後ほど説明する)⁠Findツールウィンドウ」でも有効でした。

指定した行番号へ移動

「Navigate → Line...」は、Eclipseの「ナビゲート → 指定行へジャンプ」に相当します。⁠行番号:カラム位置」「行番号,カラム位置」の書式で、行番号のみならずカラム位置も指定できますが、滅多に使いません。

図14 ⁠Navigate → Line」の実行例
図14

覚えておいても得をしないTIPSですが、先ほど紹介した「Navigate → Class...」「Navigate → File...」で、検索対象の後ろに「:<行番号>」「,<行番号>」を付けると、指定したファイルの指定した行番号にジャンプします。

図15 ⁠Navigate → Class」で行番号を指定する
図15

「Navigate → Symbol...」では、たとえクラスを指定したとしても行番号付きにすることはできません。

戻る・進む、最後の編集位置へ移動

Webブラウザの「戻る」⁠進む」のように、移動系のコマンドやマウスでカーソルを移動した場所に行ったり戻ったりする機能です。メニューバーの次のコマンドが相当します。

  • 「Navigate → Back」
  • 「Navigate → Forward」

ツールバーにも同機能がありますので、マウス操作に抵抗がなければ、こちらを使うほうが簡単です。

図16 ツールバーの「戻る」⁠進む」ボタン
図16

同様の機能はEclipseにもあります(⁠⁠ナビゲート → 戻る/進む」に相当⁠⁠。移動履歴の残り方など細かいところに違いがあるので、Eclipseと同じつもりで使うと、違和感を感じると思います。なお、Eclipseでは、ツールバーの「戻る」⁠進む」ボタンはプルダウンで辿った履歴を表示できますが、Android Studioにこの機能はありません。

図17 Eclipseの「戻る」ボタン(履歴付き)
図17

最後の編集位置へ移動する「Navigate → Last Edit Location」ですが、Eclipseの同等機能(⁠⁠ナビゲート → 最後の編集位置⁠⁠)は、ホントウに「最後の編集位置」にのみ移動しますが、Android Studioのほうは「直前に編集した位置」を辿っていきます。

ブックマーク

「Navigate → Bookmarks」のサブメニューからブックマークの操作ができます。

図18 ⁠Navigate → Bookmarks」のサブメニュー
図18

Eclipseにもブックマーク機能はありますが、細かなところで多少使い勝手が異なります。

  • エディタのガーターエリア上でマウス操作してブックマークを設定することはできません。
  • ブックマークは、通常のものと「ニーモニック付き」の2種類あります。
図19 ブックマークの設定
図19

Eclipseの場合、ブックマークの一覧は「ブックマークビュー」で確認できますが、Android Studioでは「Favoritesツールウィンドウ」か、メニューバーの「Navigate → Bookmarks → Show Bookmarks」で表示する「Bookmarksウィンドウ」のいずれかで確認できます。

図20 ブックマークの一覧の確認方法
図20

どうやらAndroid Studioのブックマーク機能としては「Bookmarsウィンドウ」が本命で、⁠Favoritesツールウィンドウ」には ついで に表示しているような感じがします。この「Bookmarsウィンドウ」なのですが、他のポップアップウィンドウと異なり、フォーカスが失われても消えずに残ります(Android Studioから別のアプリケーションにフォーカスが移ると消えます⁠⁠。ちなみに明示的にウィンドウを閉じるか、ブックマークにジャンプするとウィンドウは消えます。

先ほどの「ニーモニック付きブックマーク」「Ctrl+<ニーモニック>」キーでいつでもブックマークに移動できます。ただし、このショートカットキーで移動できるのはニーモニックに数字「0~9」を使ったブックマークだけです(便利というか、ありがた迷惑な機能です⁠⁠。

しょせんはただのブックマークなので、Eclipseと比べても機能的に大きな違いはありません。筆者自身もこの機能はほとんど使ったことが無いので、イマイチ便利さを測れないでいます。

指定したツールウィンドウへ移動、ナビゲーションバーへ移動

ある程度以上の規模のプロジェクトになると編集しているファイルが「Projectツールウィンドウ」上のどこにあるのかわからなくなります。そんなときに便利なのが、メニューバーの「Navigate → Select In...」です(Eclipseだと「ナビゲート → 表示」に相当します⁠⁠。

図21 ⁠Navigate → Select In...」の実行例
図21

図21を見ればわかるように「Projectツールウィンドウ」のみではなく、他のツールウィンドウを開くことができます(とは言っても「Projectツールウィンドウ」以外を開く用途はそうありません⁠⁠。

メニューバーの「View → Tool Windows」と異なり、このコマンドを実行すると、指定したツールウィンドウで、コマンドを実行したときに開いていたファイルの場所を示します。たとえば、Foo.javaファイルを編集中に実行すると「Projectツールウィンドウ」Foo.javaの場所を示します。

似たような機能に「Projectツールウィンドウ」の"Scroll from Source"がありますが、ショートカットキーだけで操作ができるため、筆者は"Select In..."のほうを多用しています。

大概の所へジャンプできる"Select In..."なのですが「ツールウィンドウ」のみが対象らしく「ナビゲーションバー」へは「Navigate → Jump to Navigation Bar」で移動します。Eclipseも先ほどとは別の「ナビゲート → パンくずリストで表示」で移動するので、別コマンドであることに違和感を感じないかと思います。

Eclipseの違いと言えば「ナビゲーションバー」を非表示にしていても"Jump to Navigation Bar"を実行できます。その場合、⁠ナビゲーションバー」がカーソル位置にポップアップ表示されます。

図22 ナビゲーションバーのポップアップ表示
図22

宣言部、実装などクラスの関係に基づいた移動

クラス同士の関係に基づいた移動手段です。似たようなコマンドはEclipseにもあります。表1にその対比をまとめました。Eclipse側のコマンド名でおおよその機能がわかると思います。

表1 クラス同士の関係に基づいた移動手段(Eclipseとの比較)

Android Studioのコマンド名(Navigateより)Eclipseのコマンド名(ナビゲートより)
"Declaration"「宣言を開く」に相当
"Implementation(s)"「実装を開く」に相当
"Type Declaration"Eclipseに相当機能はありません。
"Super Method"「スーパー実装を開く」に相当
"Test"Quick JUnit「テスティングペアを開く」に相当
"Related File..."Eclipseに相当機能はありません(ちなみに「関連するファイルを開く」です⁠⁠。

Eclipseに無い/あるけれど振る舞いが微妙に異なる機能について補足します。

「Navigate → Declaration」
クラス、メソッドなどの「宣言部」に移動します。Eclipseとほぼ同等でこれといった差違はありません。
「Navigate → Implementation(s)」
クラスやインターフェイスの「実装部」に移動します。
Eclipseの場合、メソッド上でのみ有効ですが、Android Studioはクラス上でも有効です。インターフェイスや抽象クラスに限らず、上位クラスから下位クラスに辿ることができます。
「Navigate → Type Declaration」
メソッドの「型(戻り値の型⁠⁠」に移動します。
たとえば、Stringを返すgetMessage()の利用箇所で、このコマンドを実行するとgetMessage()の宣言部ではなく、Stringの宣言部に移動します(戻り値が void やプリミティブ型の場合は移動しません⁠⁠。
ちょっと変わっている移動コマンドで、筆者はほとんど使った事がありません。
「Navigate → Super Method」
メソッドやクラスの「上位の宣言部」に移動します。
先ほど紹介した"Implementation(s)"と同じく、クラス上でも機能します(こちらも、Eclipseはメソッドのみが対象でした⁠⁠。
「Navigate → Test」
テストクラスに移動します。テストクラス上ではメニューバーのコマンド名が"Test Subjet"に代わり、実行すると元のクラスに戻ります。
テスト対象とテストクラスの関連付けは、割りと適当でテストクラスにテスト対象の名前が含まれていると、それをテスティングペアを見なすようです。EclipseのQuick JUnitのように、テストクラス名のパターンを指定する事はできません(そのような設定箇所がない⁠⁠。
実行してみるとわかりますが、図24のようにテスティングペアの候補がでるので、テストクラスのパターン指定が曖昧でもどうにかなるようです。
図24 ⁠Navigate → Test」でテストクラスへ移動
図24
テストメソッドまで特定してビシッとジャンプするわけでは無いので、リズム良くTDDとは行かなそうです。
そもそも「Android Studioでテストクラスが使えるのか?」という話がありますが、⁠条件付きで)作れるし動きます。機会があればいずれ説明します。
「Navigate → Related File...」
「関連するファイル」に移動します。具体的には、Activityとそれに対応するレイアウトファイル(XML)間を行き来します。
Javaのソースコード中で「関連ファイル」が存在する場合、図25のようにガーターエリアに関連アイコンが表示されます。
図25 ⁠関連ファイルあり」を示すガーターアイコン(Javaクラス)
図25
このアイコンが表示されている同じ行で、このコマンドを実行すると関連ファイル(レイアウトファイル)に移動します。レイアウトファイル側にも関連するファイル(Activityクラス)が表示されていますので、同様のコマンドを実行するとJavaソースコードに戻ります。
図26 ⁠関連ファイルあり」を示すガーターアイコン(レイアウトXMLファイル)
図26

ここで紹介したコマンド全般に言えることですが、プロジェクトのソースコード以外(たとえばライブラリ中のコード)でも有効です。たとえば、図27のようにAndroid SDKのクラスからも "Implementation(s)" などを実行することができます。

図27 Android SDKのクラス上で"Implementation(s)"を実行した例
図27

ファイル構造に基づいた移動

まずは「Navigate → File Structure」です。名前からまったく連想できませんが、Eclipseの「ナビゲート → クイック・アウトライン」相当の機能です。

図28 ⁠Navigate → File Structure」の例
図28

Eclipseとの機能差ほとんどありません。強いて言えば「Show Anonymous Classes」のオプションをチェックしないと、無名クラスがアウトライン表示されない事くらいでしょうか。

図29 "File Structure"で無名クラスを表示する
図29

ちなみに、このウィンドウ中でも "Quick Definition", "Quick Documentation"コマンドは有効で実装やJavadocのプレビューを参照することができます。

ちなみに、Eclipseの「クイック型階層」に相当するコマンドはありません。⁠型階層を開く」に相当する"Type Hierarchy"だけあります(詳しくは次回説明します⁠⁠。

次のコマンドについては、ツールウィンドウが関係してくるので、次回の検索とあわせて説明します。

「Navigate → Type Hierarchy」
Eclipseの「ナビゲート → 型階層を開く」に相当します。
「Navigate → Method Hierarchy」
Eclipseに相当する機能はありません。⁠ナビゲート → 実装を開く」が比較的類似している機能です。
「Navigate → Call Hierarchy」
Eclipseの「ナビゲート → 呼び出し階層を開く」に相当します。

問題箇所への移動やその他の移動

第14回で説明したHectorおじさんによる指摘(インスペクション結果)にジャンプするのが、次のコマンドです。それぞれが、Eclipseの「ナビゲート → 次の注釈」⁠ナビゲート → 前の注釈」に相当します。

  • 「Navigate → Next Highlighted Error」
  • 「Navigate → Previous Highlighted Error」

移動先はマーカーバーで指摘している警告(warnings)とエラー(errors)ですが、マーカーバーのコンテキストメニューから「Go to high priority problems only」を選択するとエラーだけが移動対象になります。

図30 マーカーバーのコンテキストメニュー
図30

同様の設定は「Preferences / Editor」「'Next Error' action goes to high priority problems only」でも指定する事ができます。

Eclipseの「次の注釈」⁠前の注釈」はツールバーのアイコンから任意の移動対象を指定します。

図31 Eclipseのツールバーにある「次の注釈」⁠前の注釈」アイコン
図31

図31を見てもわかるように、Eclipseの「次の注釈」⁠前の注釈」は万能移動コマンドですが、Android Studioの場合、それぞれの目的に応じて使うコマンドが異なります。たとえば以下の通りです。

  • 「出現箇所」へ移動
    • 「Navigate → Previous Occurrence」
    • 「Navigate → Next Occurrence」
  • 「増分相違点」⁠変更相違点」へ移動
    • 「Navigate → Next Change」
    • 「Navigate → Previous Change」

このあたりはEclipseとAndroid Studioの思想の違いが顕著に出いている部分だと思っています。Eclipseはひとつのコマンドでいろんな事ができるようにしていますが、Android Studioは、専用のコマンドを多数用意する事を良しとしている傾向があります。考え方の違いなので、一概に善し悪しは言えませんが、Eclipseに慣れた人にとって、この思想の違いは高いハードルだよなぁと思っています。

最後がNavigateメニュー項目の一番下にある"Next Method"と"Previous Method"です。英語表記でも機能はわかると思いますが、メソッドの宣言部に移動します。Eclipseの次のメニューに相当する機能です。

  • 「ナビゲート → ジャンプ → 次のメンバー」
  • 「ナビゲート → ジャンプ → 直前のメンバー」

"Next Method"と表記してありますが、Eclipse同様、フィールドや内部クラスも移動対象になります。

次回の予告

引き続きさまざまな移動方法について説明を続けます。次回は今回説明できなかったHierarchy系のコマンドと検索・置換について説明します。

おすすめ記事

記事・ニュース一覧