※本記事は2021年7月2日に更新しました。
「アプリバーにもっとボタンを追加したい!」
「オーバーフローメニューって何?」
今回はそんな疑問にお答えします。
まずは下の動画をご覧ください。
画面右上の縦に並んだ『・・・』マークをタップすると、
右からメニューが出てきます。
このメニューのことを『オーバーフローメニュー』と呼びます。
今回はこのオーバーフローメニューの追加の仕方について解説します。
前提として、本記事はAndroid Studio 4.2.1を対象に記載します。
また、筆者のAndroid Studioは日本語化しているため、日本語にて解説します。
本記事の使用言語はJavaとなります。
今回はProgate のJavaのレッスンがすべて理解できている、
という前提の上進めていきます。
では早速参りましょう!
前回の記事はこちら
今回は特に前回の記事と内容重複しますので、ぜひこちらからお読みください。
オーバーフローメニューの追加の仕方
オーバーフローメニューの追加の仕方は以下の通りです。
- メニューXMLファイルを用意する
- アクティビティファイルにて、メニューを実装する
- メニューを押したときの動作を定義する
一つ一つ解説していきます。
メニューXMLファイルを用意する
前回のアクションボタンの追加の仕方と同様、
まずメニューXMLファイルを入れるmenuフォルダを用意します。
menuフォルダの用意の仕方
- resフォルダの上で右クリック⇒新規⇒Androidリソースディレクトリーを選択
- ファイル名を「menu」、リソースタイプを「menu」にしてOKを押す
続いて、XMLファイルの用意の仕方です。
menuフォルダの中にxmlファイルを用意します。
XMLの用意の仕方
- menuフォルダの上で右クリック⇒新規⇒Menuリソース・ファイルを選択
※ 今回はファイル名を『overflow_menu』としてください。
overflow_menu.xmlのソースコードは以下の通りです。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!-- アクションボタンを設定 -->
<!-- showAsActionはneverでオーバーフローメニューにボタンが配置される-->
<item
android:id="@+id/mercury"
android:title="@string/mercury_title"
app:showAsAction="never"/>
<item
android:id="@+id/venus"
android:title="@string/venus_title"
app:showAsAction="never"/>
<item
android:id="@+id/earth"
android:title="@string/earth_title"
app:showAsAction="never"/>
<item
android:id="@+id/mars"
android:title="@string/mars_title"
app:showAsAction="never"/>
<item
android:id="@+id/jupiter"
android:title="@string/jupiter_title"
app:showAsAction="never"/>
<item
android:id="@+id/saturn"
android:title="@string/saturn_title"
app:showAsAction="never"/>
<item
android:id="@+id/uranus"
android:title="@string/uranus_title"
app:showAsAction="never"/>
<item
android:id="@+id/neptune"
android:title="@string/neptune_title"
app:showAsAction="never"/>
</menu>
オーバーフローメニューの実装も、『menu』 で囲み、『item』で要素を追加する形となります。
android:titleはこのアイコンのタイトルです。
app:showAsAcrionはこの要素を、
- スペースがあれば最初から表示する (ifRoom)
- 隠して表示する(never)
どちらにするか、という内容です。
今回はオーバーフローメニューに隠して表示させたいのでneverを記載します。
以上がXMLファイルの用意の仕方となります。
アクティビティファイルにて、メニューを実装する
前回と同内容です。
以下のコードで、メニューを実装することができます。
//アプリバーにメニューを作成するメソッド
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//インフレーターを使ってメニューを表示させる
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.overflow_menu, menu);
return true;
}
メニューを押したときの動作を定義する
メニューを押したときの動作を定義します。
以下の記事の『複数のボタンを使ってみよう』と同様、
押されたメニューのIDを取得し、そのIDによって条件分岐する形で記載します。
実装文は以下の通りです。
//メニューボタンを押したときの反応を定義するメソッド
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//テキストビューに文字を表示する様に定義
//押されたボタンのIDで条件分岐を行う
TextView textView = findViewById(R.id.text_view);
switch(item.getItemId()) {
case R.id.mercury:
textView.setText(R.string.mercury);
return true;
case R.id.venus:
textView.setText(R.string.venus);
return true;
case R.id.earth:
textView.setText(R.string.earth);
return true;
case R.id.mars:
textView.setText(R.string.mars);
return true;
case R.id.jupiter:
textView.setText(R.string.jupiter);
return true;
case R.id.saturn:
textView.setText(R.string.saturn);
return true;
case R.id.uranus:
textView.setText(R.string.uranus);
return true;
case R.id.neptune:
textView.setText(R.string.neptune);
return true;
default:
//オーバーライド元の結果を返すように指示
return super.onOptionsItemSelected(item);
}
}
最後にdefault:としてオーバーライド元のメソッドの結果を返しています。
以上がオーバーフローメニューの設定方法となります。
サンプルコード
最後に今回のサンプルコードを提示します。
今回のアプリはGitHubに公開しています。
下記URLの『SampleOverflowMenu』です。
是非参考にしてください。
文字列リソースファイル string.xml
<resources>
<string name="app_name">SampleOverflowMenu</string>
<string name="text_view">オーバーフローメニューを選択してください</string>
<string name="mercury_title">Mercury</string>
<string name="venus_title">Venus</string>
<string name="earth_title">Earth</string>
<string name="mars_title">Mars</string>
<string name="jupiter_title">Jupiter</string>
<string name="saturn_title">Saturn</string>
<string name="uranus_title">Uranus</string>
<string name="neptune_title">Neptune</string>
<string name="mercury">水星</string>
<string name="venus">金星</string>
<string name="earth">地球</string>
<string name="mars">火星</string>
<string name="jupiter">木星</string>
<string name="saturn">土星</string>
<string name="uranus">天王星</string>
<string name="neptune">海王星</string>
</resources>
レイアウトファイル activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/text_view"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
メニュー用XMLファイル overflow_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!-- アクションボタンを設定 -->
<!-- showAsActionはneverでオーバーフローメニューにボタンが配置される-->
<item
android:id="@+id/mercury"
android:title="@string/mercury_title"
app:showAsAction="never"/>
<item
android:id="@+id/venus"
android:title="@string/venus_title"
app:showAsAction="never"/>
<item
android:id="@+id/earth"
android:title="@string/earth_title"
app:showAsAction="never"/>
<item
android:id="@+id/mars"
android:title="@string/mars_title"
app:showAsAction="never"/>
<item
android:id="@+id/jupiter"
android:title="@string/jupiter_title"
app:showAsAction="never"/>
<item
android:id="@+id/saturn"
android:title="@string/saturn_title"
app:showAsAction="never"/>
<item
android:id="@+id/uranus"
android:title="@string/uranus_title"
app:showAsAction="never"/>
<item
android:id="@+id/neptune"
android:title="@string/neptune_title"
app:showAsAction="never"/>
</menu>
アクティビティファイル MainActivity.java
package com.zerokaraapp.sampleoverflowmenu;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//アプリバーにメニューを作成するメソッド
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//インフレーターを使ってメニューを表示させる
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.overflow_menu, menu);
return true;
}
//メニューボタンを押したときの反応を定義するメソッド
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//テキストビューに文字を表示する様に定義
//押されたボタンのIDで条件分岐を行う
TextView textView = findViewById(R.id.text_view);
switch(item.getItemId()) {
case R.id.mercury:
textView.setText(R.string.mercury);
return true;
case R.id.venus:
textView.setText(R.string.venus);
return true;
case R.id.earth:
textView.setText(R.string.earth);
return true;
case R.id.mars:
textView.setText(R.string.mars);
return true;
case R.id.jupiter:
textView.setText(R.string.jupiter);
return true;
case R.id.saturn:
textView.setText(R.string.saturn);
return true;
case R.id.uranus:
textView.setText(R.string.uranus);
return true;
case R.id.neptune:
textView.setText(R.string.neptune);
return true;
default:
//オーバーライド元の結果を返すように指示
return super.onOptionsItemSelected(item);
}
}
}
※javaファイルについて、1行目packageの部分は人によって異なります。
コピペする場合は2行目以降をコピペしてください。
ここまで出来たら一度アプリを実行してみましょう。
一番上の動画のアプリのように動作すれば成功です。
まとめ
今回はアプリバー上のメニュー、オーバーフローメニューの追加の仕方について解説しました。
レイアウトを崩さずにメニューを追加できるので、
アプリによってはとても使い勝手がいいかと思います。
ぜひ、使ってみてください。
本記事が初心者の方の参考になれば幸いです。
次回の記事はこちら
コメント