質問: ### 疑問 AndroidStudioで出てくるonCreateContextMenu()についての質問です。該当コードの「親クラスの同名メソッドの呼び出し」の部分を見てもらいたいです。 そもそも親クラスのonCreateContextMenu()も戻り値は返さないのではないでしょうか?そうであれば、オーバライド先での親クラスの同名クラスを呼ぶ意味がないと思うのですが。。どうして、親クラスの同名メソッドを呼ぶ必要があるのでしょうか? AndroidStudioやJavaについてまだまだ初心者ですが、回答のほどよろしくお願いいたします。 ### 該当のソースコード ``` @Override public void onCreateContextMenu(ContextMenu menu, View view,ContextMenu.ContextMenuInfo menuInfo){ //親クラスの同名メソッドの呼び出し super.onCreateContextMenu(menu,view,menuInfo); MenuInflater inflater=getMenuInflater(); inflater.inflate(R値,menu); menu.setHeaderTitle(R値); } ``` ### 試したこと super.onCreateContextMenu(menu,view,menuInfo); の行を削除しましたが、正常にエミュレータは動いていました。 ### 補足情報(FW/ツールのバージョンなど) AndroidStudioアプリ開発の教科書やAndroidSDKポケットリファレンスの両方にも親クラスの同名メソッドの呼び出しは書いてありました。
回答: > > そもそも親クラスのonCreateContextMenu()も戻り値は返さないのではないでしょうか?そうであれば、オーバライド先での親クラスの同名クラスを呼ぶ意味がないと思うのですが。。 > > > 戻り値を返さなくても、メソッドを実行することにより副作用が発生する場合、呼び出す意味があります。 例えば、親クラスの`onCreateContextMenu()`で、次の処理を行っている場合、 ``` //親クラスのonCreateContextMenu() public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo){ menu.add("ホームに戻る") } ``` 子クラスの`onCreateContextMenu()`で、次のような記述をしても ``` //子クラスのonCreateContextMenu() @Override public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo menuInfo){ super.onCreateContextMenu(menu, view, menuInfo); menu.add("メニュー1") menu.add("メニュー2") } ``` コンテキストメニューの表示は、「ホームに戻る」「メニュー1」「メニュー2」の3つになります。これは`super.onCreateContextMenu(menu, view, menuInfo)`が呼び出されたことにより、親クラスの`onCreateContextMenu()`が実行されたため、`menu`に「ホームに戻る」が追加されたためです。 > > どうして、親クラスの同名メソッドを呼ぶ必要があるのでしょうか? > > > 親クラスで行われているであろう、コンテキストメニューの初期化処理を行うためです。 質問文中に記載がありませんが、おそらく質問文で示されているメソッドの親クラスは`Activity`か`AppCompatActivity`と思われます。`Activity`と`AppCompatActivity`のいずれも、Android側が用意したクラスです。 このようなクラスは、多くの場合、各メソッドで独自の処理を行っています。そのため、特段の理由がない限り、子クラスのメソッドで親クラスのメソッドを呼び出し、それらの処理を実行した方が無難です。