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

第18回エディタの[その10]─ 続・いろいろなナビゲーション+検索

はじめに

前回に引き続きAndroid Studioのさまざまな移動方法について説明します。

前回の補足

細かなところで違いがありますが、おもだった移動手段はほぼEclipseと変わりが無いことがわかったと思います。Eclipseのマウス操作に関してもAndroid Studioでも似たようなことができます(イマドキだと「マウス操作」ではなく「ポインティングデバイス操作」が正しいんでしょうか?本稿では「マウス操作」で統一しておきます⁠⁠。

マウスオーバーで "Quick Documentation"
もともとカーソルを対象に移動して "Quick Documentation" を実行すれば済む話なのですが、Ecilpse移行組に言わせると「ドキュメント参照するためだけにカーソルを移動するのが煩わしい」そうです。
そのあたりの要望を汲んでかAndroid Studioでも、マウスオーバーで "Quick Documentation" ができます。
この機能を有効にする/ドキュメント参照までの待ち時間については「Preferences / Editor」「Show quick doc on mouse move」で設定できます。ちなみに筆者はこの機能を鬱陶しいと思っているのでOFFにしています。
図1 ⁠Preferences / Editor」設定画面
図1
Ctrlキーを押しながらマウスオーバーでちょっと不思議な宣言表示
Ctrlキーを押しながらマウスカーソルを移動するとクリック可能な場所がハイパーリンク表示されます。この状態の対象にそのままマウスオーバーすると、図2のような定義情報がポップアップされます。
図2 Ctrlキーを押しながらリンク上にマウスカーソルを置く
図2
この機能に相当するコマンド名は存在しておらず、どうやらこのキーコンビネーションでのみ実行可能な機能のようです。また、これに相当する機能はEclipseには無いと思います。
ポップアップに表示される定義情報にもハイパーリンクが表示されるので、次に説明する「宣言に移動」の役に立つのかも知れません(筆者は、この機能をほとんど使ったことはありません⁠⁠。
Ctrlキーを押しながらマウスの左クリックで「宣言に移動」
メニューバーの「Navitate → Declaration」相当の機能です。Eclipseの場合、宣言部や実装部などジャンプする場所を選択できますが、Android Studioの場合、宣言部にだけジャンプします。
図3 EclipseのCtrlキーを押しながらクリック
図3
Eclipseとは異なり、真ん中ボタンのあるマウスの場合、真ん中ボタンのクリックでも代用できます。
MacBookなどでは「Ctrlキーとポインティングデバイスのクリック」の組み合わせは右クリックと判断されるため「宣言に移動」と一緒にコンテキストメニューも表示され、とても鬱陶しいです。そのため、当然のように筆者はこの機能を使いません。

一連のマウス操作を図4に示します。

図3 Android Studioのマウス操作の例(クリックすると動きがわかります)

EclipseではSHIFTキーとマウスオーバーで、Android Studioの"Quick Definition"相当の事ができますが、Android Studioのマウス操作には、それに該当する機能はありません。実際にSHIFTキーを押しながらマウスオーバーを行っても何も起こりません。

図5 EclipseのSHIFTキーを押しながらマウスオーバー
図5

前回の続き

ツールウィンドウが絡むため、今回に繰り越した以下の3つについて説明します。

「Navigate → Type Hierarchy」
Eclipseの「ナビゲート → 型階層を開く」に相当します。
「Structureツールウィンドウ」でも代用が利くので、あまり使ったことはありません。
「Navigate → Method Hierarchy」
Eclipseに相当する機能はありません。⁠ナビゲート → 実装を開く」が比較的類似している機能です。
どのクラスがメソッドをオーバライドしているか一覧表示されますが、Eclipse同様"Implementation(s)", "Super Method"など似たようなコマンドで代用が利くので、あまり使ったことはありません。
「Navigate → Call Hierarchy」
Eclipseの「ナビゲート → 呼び出し階層を開く」に相当します。
メソッドの呼び出し階層を開きます。Eclipseの同機能と異なりインターフェイスや抽象クラスの実装クラスも追跡します。追跡性能がとても高いため、ほかの2つと違い多用している機能のひとつです。

それぞれ実行すると「Hierarchyツールウィンドウ」にその結果が表示されます。

図6 ⁠Hierarchyツールウィンドウ」の例
図6
※標準では画面右側に表示されます。

「Hierarchyツールウィンドウ」上では、いつものように"Quick Definition"や"Quick Documentation"が有効になるので、ちょっとした参照などに活用しましょう。

後で説明する「Findツールウィンドウ」にも共通の話ですが「Hierarchyツールウィンドウ」の次のツールバーアイコンについて、その機能を説明しておきます。

図7 ⁠Hierarchyツールウィンドウ」のツールバーアイコン
図7

この中で覚えておいて欲しいのは「Pin Tab」「Close」です。このアイコンはトグルボタンで、このアイコンをONの状態にしておくと、その結果を残しておくことができます。通常(⁠⁠Pin Tab」がOFF)だと「Hierarchyツールウィンドウ」には1つの検索結果しか表示されず、Hierarchy系のコマンドを実行する都度、上書きされていきます。

ある検索結果を残しておきたい場合は、その検索結果の「Pin Tab」をONにします。すると他のHierarchy系のコマンドを実行すると、その検索結果は違うタブに出力されるようになります。

図8 ⁠Pin Tab」をONにして複数の検索結果を残す
図8
 タブの表示のされ方はShow Views as Tabsの指定によります。

Eclipseにも似たような機能と異なり、ピンを立てるとツールウィンドウ内にタブが増えていきます。このインターフェイスの都合上、複数の検索結果を並べて同時に参照することはできません。また、EclipseのHierarchy系ビューにある履歴機能に相当する機能はありません。

「Close」アイコンは説明するまでもありませんが、その検索結果を閉じます。通常(タブ表示してなく、1つの検索結果のみを表示している場合)だと「Hierarchyツールウィンドウ」自体が閉じます。残念ですが「Hierarchyツールウィンドウ」の検索結果はプロジェクトを閉じると消えて無くなります(次回プロジェクトを開いたときに復元されない⁠⁠。

この「Pin Tab」⁠Close」アイコンは、他のツールウィンドウでも見かける場合がありますが、その機能はすべて同じです。

検索と置換

エディタやIDEなら持っていて当然の検索機能についてです。

一般的なアプリケーションやIDEに使い慣れていると、検索系メニューはメニューバーのトップレベルにありそうと思いがちですが、Android Studioは1階層下で「Edit」メニューに隠れています。これが予想以上に見つけにくいです。

図9 メニューバー「Edit → Find」にある検索・置換メニュー
図9

エディタ内の検索・置換

Eclipseの「編集 → 検索/置換...」に相当する機能が、次の2つです。

  • 「Edit → Find → Find...」
  • 「Edit → Find → Replace...」

実行するとエディタウィンドウの最上部に検索・置換用のツールバーが表示されます。ツールバーの各機能の意味は表1の通りです。

図10 Find/Replaceツールバー
図10
表1 Find/Replaceツールバーの意味
No.意味
(1)⁠1)'以前に検索した検索ワードや置換ワードの履歴です。この手の機能にしては珍しく、プロジェクトを閉じても履歴が保持されます。
(2)検索ワードの出現箇所に移動します。
(3)検索結果を、この次説明する「Findツールウィンドウ」に表示します。
(4)複数行の検索ワードを入力できるように検索ワード入力エリアを切り替えます。複数行検索ワードの場合、⁠6)の正規表現や(7)単語単位のオプションが使えなくなります。
(5)ONにすると、検索ワードの大文字・小文字を区別して検索します。
(6)ONにすると、検索ワードを正規表現として検索します。
(7)ONにすると、検索ワードを単語として検索します。⁠6)がONの場合、このオプションは設定できなくなります。
(8)この不思議なオプションは、ONにすると置換対象ワードの頭文字が大文字か小文字かによって置換後の文字列に影響を与えます。たとえばmytest Mytest MYTESTという文字列に対してmytestyourtestに置換するとyourtest Yourtest YOURTESTとなります。ちょっと使い道が思いつきません。
(9)ONにすると、エディタの選択範囲のみを置換対象とみなします。
(10)現在の出現箇所を置換ワードで置き換えます。
(11)すべての出現箇所を置換ワードで置き換えます。
(12)現在の出現箇所を置換対象から除外(Exclude⁠⁠、または含め(Include)ます。除外設定された出現箇所は「Replace all」で置換されなくなります(⁠⁠Replace」では置換される⁠⁠。
(13)検索・置換オプションで範囲を「コメントのみ(In Comments Only⁠⁠リテラルのみ(In Literals Only⁠⁠」のいずれかに指定できます。

見ての通りなので使い方に悩むことは無いと思います。検索はインクリメンタルサーチです。検索ワードをタイプする都度、検索を進めていきます。それと、どうゆうわけか補完(Ctrl+SPACE)が効きます。といっても補完されるのは検索キーワードだけで、正規表現は補完候補に上がりません。

置換の場合、検索ワードにヒットした出現箇所に置換ワードがプレビュー表示されます。特に正規表現を駆使した置換処理に便利です。

図11 正規表現を用いた置換のプレビュー表示
図11

検索ツールバーからエディタにフォーカスを戻すにはESCキーを押します。

あと、カーソル下にあるキーワードを検索する "Find Word at Caret"という一見便利そうなコマンドがありますが、後述する"Highlight Usages in File"と機能が被っているため、覚えるなら後者のコマンドを覚えた方がいろいろ便利です。

指定したディレクトリ内の検索・置換

エディタ内だけではなく、プロジェクト全体を検索したい場合は、次のコマンドを使います。

  • 「Edit → Find → Find in Path...」
  • 「Edit → Find → Replaces in Path...」

これらは、Eclipseの「検索 → 検索...」に相当しますが、使い方というかインターフェイスはだいぶ異なります。基本的にEclipseもAndroid Studioもお互い似せようと思ってインターフェイスを設計しているわけではありませんが、検索まわりは特に類似性が低いです。そのため、Eclipse移行組はEclipseの事は忘れてAndroid Studioの使い方を覚えた方が習得が早いと思います。

コマンドを実行すると検索と置換、それぞれ専用のダイアログが表示されます。

図12 "Find in Path"(左)と"Replace in Path"(右)ダイアログ
図12

「Options」の内容は先ほど説明した「エディタ内の検索・置換」と同じで、違いは「Scope」「File name filter」だけです。⁠Scope」は検索範囲、⁠File name filter」は検索対象とするファイルの拡張子を指定します*?のワイルドカードが使え、カンマ,で複数の拡張子を指定できます⁠⁠。

どちらも良くあるテキストエディタに備わっている検索・置換でおなじみの機能なので使い方に悩むことは無いと思います。

ちょっとした引っかけなのですが「Scope」「Directory」で選ぶディレクトリは、プロジェクト内に限定する必要はありません(そんな制限もありません⁠⁠。望めば普通の検索ツールとしても使えます。

図13 "Scope / Directroy"で指定する場所はプロジェクトの外でも良い
図13

検索を実行して検索結果を表示するのが「Findツールウィンドウ」です。このツールウィンドウはリファクタリングでも登場するので、大まかな使い方を覚えておいたほうが良いです。

図14 ⁠Findツールウィンドウ」
図14

「Findツールウィンドウ」の左端には2列のツールバーが表示してあります。そのうち左側の列は主に「Findツールウィンドウ」の結果に対する機能が集まっています。

図15 ⁠Findツールウィンドウ」のツールバー(左側)
図15

左側のツールバーで覚えておいた方がよいアイコンは次の3つです。

Settingsアイコン
「Find in Path」「Replace in Path」ダイアログを再表示します。
後述する「使用箇所の検索」結果も「Findツールウィンドウ」に表示されます。どのような場合でも、Settingsアイコンを押せば設定ダイアログが表示されるワケでは無さそうです。検索した方法によってはSettingsアイコンを押しても何も起きません。
Rerunアイコン
現在の条件で再度検索を実行します(検索結果の更新⁠⁠。
Export to Text Fileアイコン
検索結果をテキストファイルに書き出します。
いったん図16のようなプレビューが表示されるので、ファイルに書き出さずクリップボードにコピーすることもできます(⁠⁠Copy」ボタンを押す⁠⁠。
図16 ⁠Export Preview」ダイアログ
図16

それと以下のように検索結果に移動するアイコンと「Navigate」メニューのコマンドが関連しています。

  • Previous Occurrence:前の出現箇所へ移動
    • 「Navigate → Previous Occurrence」と同等。
  • Next Occurrence:次の出現箇所へ移動
    • 「Navigate → Next Occurrence」と同等。

このコマンドは「Navigate」メニューにも属しているため、エディタにフォーカスが移っていてもショートカットキーが有効です。

右側のツールバーには主に検索結果の表示方法に関する機能が集まっています。アイコンはトグルになっており、どれも押してみれば効果が分かりますので、各自お好みの表示設定を探してみると良いです(筆者はすべて有効にしています⁠⁠。

図17 ⁠Findツールウィンドウ」のツールバー(右側)
図17

「Hierarchyツールウィンドウ」と同様に「Findツールウィンドウ」でも"Quick Definition"や"Quick Documentation"が使えますが、⁠Preview Usages」アイコンをONにしてプレビューを使ったほうが便利です(それらのQuick系コマンドはプレビュー内でも利用できます⁠⁠。

図18 プレビュー内でも"Quick Documentation"が利用できる
図18

置換コマンドなのですが、ダイアログのボタンには置換なのに「Find」と書かれているし、迂闊に実行したら一括置換されてしまうのではないか?と身構えてしまうかも知れません。実行すると図19のように確認ダイアログが表示されますので、ご安心ください。

図19 "Replace in Path"実行後にでてくる置換確認ダイアログ
図19
 検索結果が1つでも必ず確認ダイアログが表示されます。

使用箇所の検索

無理矢理Eclipseの機能に当てはめると「検索 → 参照、宣言、実装、読み取りアクセス、読み込みアクセス」に相当します。

図20 ⁠使用箇所の検索」系メニュー
図20

通常の検索と異なり、Java言語の文脈を意識して検索を行います。たとえばfooという検索キーワードを単なるテキストとして扱わず、ローカル変数なのかメソッドなのかを意識して、その使用箇所を検索します。この使用箇所の検索は、大変便利なのですが、いつものように似たようなコマンドがたくさんあるため使いこなすまで慣れが必要です。

メニューバーの順序とは異なりますが、筆者が便利だと思っている順にコマンドの説明を行います。どのコマンドにも共通していますが「使用箇所の検索」では、カーソルが当たっているテキストが検索対象になります。

「Edit → Find → Highlight Usages in File」
カーソル下にあるキーワードの出現箇所をハイライト表示します。今、編集しているファイルだけが検索対象です。Eclipseの「検索 → ファイル内での出現箇所」に相当します。
検索対象が予約語やコメント内のテキスト、文字列リテラルの場合、"Find Word at Caret"と同じ扱いとなります。ハイライト間の移動は"Find Next"、"Find Previous"で行い、ESCキーでハイライト表示をキャンセルします。
便利な機能ですが、普通に使っているだけでもカーソル下にあるキーワードの使用箇所が自動的にハイライト表示されるので、画面内に収まる程度のコード量のであれば見ただけで使用箇所を把握することができます(ただし、使用箇所へジャンプすることはできません⁠⁠。
図21 "Highlight Usage in File"と通常のハイライト表示
図21
このコードの自動ハイライト表示は「Preferences / Editor」「Highlight usages of element at caret」でON/OFFを設定できます。
「Edit → Find → Show Usages」
カーソル下にあるキーワードの使用箇所をポップアップ表示します。プロジェクト全体が検索対象になります(正しくは後述する"Find Usages Settings..."の設定に依存します⁠⁠。
図22 "Show Usages"の例
図22
このポップアップのツールバーにある「Open Find Usages Toolwindow」から次に紹介する"Find Usages"に移行することができるため、ショートカットキーを覚えるなら断然こちらをオススメします。
なお、このポップアップ中でも "Quick Definition" や "Quick Documentation" が利用できます。
「Edit → Find → Find Usages」
カーソル下にあるキーワードの出現箇所を検索し、その結果を「Findツールウィンドウ」に表示します。検索対象は先ほど説明した"Show Usages"と同じです。
検索結果が「Findツールウィンドウ」に表示されているため、出現箇所の移動は"Find Next"、"Find Previous"ではなく、"Next Occurrence"と"Previous Occurrence"になる点に注意して下さい。
"Find Usages"で検索した場合、⁠Findツールウィンドウ」のツールウィンドウ右列のアイコンが若干増えます。増えた分のアイコンの意味は表2の通りです("Show Usages"のポップアップウィンドウに出ているアイコンも同様です⁠⁠。
図23 "Find Usage"で増えたツールバーアイコン
図23
表2 "Find Usage"で増えたツールバーアイコンの意味
No.意味
(1)検索結果の種別に応じてカテゴリ分けします。カテゴリは英語表記ですが、検索結果を把握しやすいので、ONにすることをオススメします。
(2)検索対象が読み出しアクセスしている箇所を表示します。
(3)検索対象が書き込みアクセスしている箇所を表示します。
(4)検索対象がimport文で宣言されている箇所を表示します。
「Edit → Find → Find Usages in File」
"Find Usages"を現在編集中のファイルに限定したコマンドです。"Highlight Usages in File"があるため、このコマンドの存在意義はほとんど無いと言って良いでしょう("Highlight ~"が登場するまでは意義がありましたよ⁠⁠。
⁠元になったIntelliJでは)昔からあったコマンドのため比較的覚えやすいショートカットキーが割り当てられています。正直もったいないので、そのショートカットキーを奪い取って"Highlight Usages in File"あたりに割り当て直した方が幸せになれます。

「機能は似てるけど、振る舞いがちょっと違うコマンドをたくさん用意する」というのは、Android Studioの親切心で行っているようです。その辺りのポリシーが分かってくると、数多くのコマンドもすんなり腑に落ちるのですが、多くの場合は初心者を混乱させるだけな気もしています……。

"Show Usages"と"Find Usages"の検索範囲は「Edit → Find → Find Usages Settings...」で設定します。

このコマンド、正しくは「オプション付きで "Find Usages" を実行する」なので、カーソル下にあるキーワードが検索可能なテキストであること、かつそのテキストの文脈(クラスなのかメソッドなのか、など)によってダイアログのオプションが多少増減します。"Show Usages"からSettingsアイコンを押した場合も同様です。

図24 ⁠Find Usages」ダイアログ
図24

このコマンドの利点に、カーソル下にあるキーワードがどの文脈(コンテキスト)として評価されるかがダイアログに表示されます。馴れない内は、自分が指定したカーソル位置のキーワードがどう評価されるか把握するのに使ってみるのも良い練習になるかと思います。

「Find Usagesダイアログ」「Find」オプションは、コンテキストによって変動します。

パッケージで検索
package文やimport文などパッケージを示しているコンテキスト上でコマンドを実行します。検索するパッケージによっては、多量の結果が出力されます。
Usages⁠:そのパッケージの使用箇所を検索します。大抵はそのパッケージのimport文しかヒットしません。
*「Usages of classes and interfaces⁠:そのパッケージに含まれているクラスやインターフェイスの使用箇所を検索します。
クラスやインターフェイスで検索
宣言している箇所、使用している箇所などクラスやインターフェイスを示しているコンテキスト上でコマンドを実行します。
Usages⁠:そのクラスやインターフェイスの使用箇所を検索します。どうも、このオプションが他の「Usages ?」系のオプションのすべてを兼ねるワケではないようです。
Usages of methods⁠:そのクラスやインターフェイスのメソッドの使用箇所を検索します。
Usages of fields⁠:そのクラスのフィールドの使用箇所を検索します。
Implementiong classes⁠:そのクラスやインターフェイスの実装箇所を検索します。
Derived classesDerived interfaces⁠:そのクラスやインターフェイスの派生クラスを検索します。
メソッドで検索
Usages⁠:そのメソッドの使用箇所を検索します。
Overriding methods⁠:そのメソッドをオーバーライドした箇所を検索します。
Implementing methods⁠:そのメソッドを実装した箇所を検索します。
フィールド、メンバ変数、引数パラメタ、ローカル変数で検索
このタイプの検索では「Find」オプションはありません。
(おまけ)例外のスロー宣言で検索
偶然見つけたのですが、thorws宣言、throw文上でコマンドを実行すると図25のようなダイアログが表示されます。
図25 例外の使用箇所の検索
図25
「Usages」とあるのですが、実行してみても何も検索されませんでした。
例外クラスの使用箇所は、例外クラスに対してクラス検索をかければ済む話なのですが、何か意図があって、このコンテキストを用意したのでしょうか……。

「Options」にある「Search for text occurrences」ですが、ここをONにすると、検索対象をJavaのソースコードだけではなく、プロジェクトが管理しているすべてのファイルに対して検索をかけます。Javaのソースコード以外の場合は、ほぼテキスト検索と同等の扱いとなりますが、極力、検索対象のコンテキストに近い文字列を検索しようと試みます。

それと、この「使用箇所の検索」はJavaに限らず、XMLファイルでも有効です。一応、XMLタグや属性、属性の値などのコンテキストを把握して使用箇所を検索しますが、試した限りでは、それほど使い道がある感じはしませんでした。

次回の予告

ナビゲーションの話がもう少しだけ続きます。

おすすめ記事

記事・ニュース一覧