Android----メニューの使用
下一篇《Android菜单(一)----关于菜单》http://blog.csdn.net/ljheee/article/details/52334997メニュー関連の基本を解説しています.この記事では、Androidの各種メニューの使用について説明します.
Android3.0からエンティティのメニューボタンがキャンセルされ、アクションバーが導入されます.
Android5.0操作バーをアプリケーションバー(App Bar)に変更します.現在、以下の4つの形式のメニューがあります.
•オプションメニュー(Optionsmenu)
•コンテキストメニュー(Contextmenu)
•コンテキスト操作バー(ContextualActionBar)
•ポップアップメニュー(Popupmenu)
一、オプションメニュー(Options menu)
1、オプションメニュー(Options menu)の効果図は以下の通りです.
2、オプションメニュー---クラスの説明
クラス#クラス#
ツールバーの
説明
Menu
menu
メニュー(メニュー項目を追加し、メニュー項目を取得)
MenuItem
item
メニュー項目(実際にクリックしたコントロール)
SubMenu
menu
サブメニュー(レベル1のみ)
なし
group
メニュー項目はグループ化可能で、id識別を設定して、統一管理に使用します:ラジオ、マルチ選択、表示するかどうか、および使用可能
MenuInflater
なし
res/menuのファイルをメニューオブジェクトとしてインスタンス化
3、オプションメニュー---関連方法
public boolean onCreateOptionsMenu(Menu menu):このメソッドを使用してOptionsMenuを呼び出します.
public boolean onOptionsItemSelected(MenuItemitem):メニュー項目を選択した後に発生するアクション.
public void onOptionsMenuClosed(メニューを閉じると発生する動作).
public boolean onPrepareOptionsMenu(Menu menu):オプションメニューが表示される前にonPrepareOptionsMenuメソッドが呼び出され、そのときの状況に応じてメニューを調整できます.
public boolean onMenuOpened(int featureId,Menumenu):シングルオープン後に発生する動作.
4、この例ではXMLファイルを定義し、レイアウトをロードすることによって、プレゼンテーションオプションメニュー(Options menu)の使用を示します.
(1)メニューレイアウトファイルの定義
res/menuディレクトリのXMLファイルでメニュー項目レイアウトを定義します.各属性の意味は以下の図です.
オプションメニューレイアウトファイル名main_opt_menu.xmlは、「メインアクティブオプションメニュー」レイアウトファイルを意味します.コードは次のとおりです.
(2)メニューレイアウトファイルのロード、メニューの作成
(3)メニュー前処理方法
(4)メニュー項目イベント処理
二、コンテキストメニュー(Context menu)
1、コンテキストメニュー(Context menu)の効果図は以下の通りです.
AndroidのコンテキストメニューはPCの右クリックメニューに似ています.1つのビューにコンテキストメニューを登録すると、(2秒程度)このビューオブジェクトを長押しすると、フローティングメニュー、すなわちコンテキストメニューがポップアップされます.どのビューでもコンテキストメニューを登録できますが、最も一般的なのはリストビューListView用のitemです.注意:Androidのコンテキストメニューではアイコンやショートカットはサポートされておらず、長押しでしかポップアップできません.コンテキストメニューは、ListViewを組み合わせて使用することが多い.
2、コンテキストメニューを作成する-手順
(2)ActivityのonCreateContenxtMenu()メソッドを書き換え,Menuのaddメソッドを呼び出してメニュー項目(MenuItem)を追加する.
(3)ActivityのonContextItemSelected()メソッドを書き換え,コンテキストメニュー項目の選択イベントに応答する.
3、ソースコード
package com.ljheee.menu.androidmenu;import android.app.Activity;import android.os.Bundle;import android.view.ContextMenu;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.AdapterView.AdapterContextMenuInfo;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.Toast;import java.util.ArrayList;import java.util.List;/** *Activityアクティビティクラス*実装---コンテキストメニュー*/public class ContextActivity extends Activity{//ビューprivate ListView listView;//データprivate List data=new ArrayList<>()//アダプタprivate ArrayAdapter adapter;private int position;@Override protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_context);for(int i=0;i<30;i+){data.add("データ項目"+i); } listView = (ListView) findViewById(R.id.listView_cm); adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, data); listView.setAdapter(adapter);//コンテキストメニューを登録し、onCreateContextMenu registerForContextMenu(listView)を呼び出す.//コンテキストメニュー//unregisterForContextMenu(listView);}/***コンテキストメニューの作成**@param menuメニュー*@param vコンテキストメニューの登録ビュー*@param menuInfoメニュー情報*/@Override public void onCreateContextMenu(ContextMenu menu,Viewv,ContextMenu.C ontextMenuInfomenuInfo){//メニューファイルgetMenuInflater().inflate(R.menu.menu_context,menu)のロード;//メニュータイトルアイコン、タイトル文字menuを設定する.setHeaderIcon(android.R.drawable.ic_menu_edit); menu.setHeaderTitle(「アクション」);//メニュー情報:targetView、position、id AdapterContextMenuInfoinfo=(AdapterContextMenuInfo)menuInfo;//リスト内で長押しイベント(ポップアップメニュー)をトリガーする位置position=info.position; }/***選択メニュー項目**@param item選択メニュー項目*@returnイベントが処理済みかどうか*/@Override public boolean onContextItemSelected(MenuItem item){switch(item.getItemId(){ case R.id.action_edit: doEdit(); break; case R.id.action_copy: doCopy(); break; case R.id.action_remove: doRemove(); break; } return true; } @Override public void onContextMenuClosed(Menu menu) { super.onContextMenuClosed(menu); }private void doRemove(){showToast(「削除」+data.get(position));}private void doCopy(){showToast(「コピー」+data.get(position));}private void doEdit(){showToast(「編集」+data.get(position)); } private void showToast(String text) { Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); } }
RelativeLayout>
三、コンテキスト操作欄(Contextual ActionBar)
1、コンテキスト操作欄(Contextual ActionBar)の効果図は以下の通りである.
Android3.0からエンティティのメニューボタンがキャンセルされ、アクションバーが導入されます.
Android5.0操作バーをアプリケーションバー(App Bar)に変更します.現在、以下の4つの形式のメニューがあります.
•オプションメニュー(Optionsmenu)
•コンテキストメニュー(Contextmenu)
•コンテキスト操作バー(ContextualActionBar)
•ポップアップメニュー(Popupmenu)
一、オプションメニュー(Options menu)
1、オプションメニュー(Options menu)の効果図は以下の通りです.
2、オプションメニュー---クラスの説明
クラス#クラス#
ツールバーの
説明
Menu
menu
メニュー(メニュー項目を追加し、メニュー項目を取得)
MenuItem
item
メニュー項目(実際にクリックしたコントロール)
SubMenu
menu
サブメニュー(レベル1のみ)
なし
group
メニュー項目はグループ化可能で、id識別を設定して、統一管理に使用します:ラジオ、マルチ選択、表示するかどうか、および使用可能
MenuInflater
なし
res/menuのファイルをメニューオブジェクトとしてインスタンス化
3、オプションメニュー---関連方法
public boolean onCreateOptionsMenu(Menu menu):このメソッドを使用してOptionsMenuを呼び出します.
public boolean onOptionsItemSelected(MenuItemitem):メニュー項目を選択した後に発生するアクション.
public void onOptionsMenuClosed(メニューを閉じると発生する動作).
public boolean onPrepareOptionsMenu(Menu menu):オプションメニューが表示される前にonPrepareOptionsMenuメソッドが呼び出され、そのときの状況に応じてメニューを調整できます.
public boolean onMenuOpened(int featureId,Menumenu):シングルオープン後に発生する動作.
4、この例ではXMLファイルを定義し、レイアウトをロードすることによって、プレゼンテーションオプションメニュー(Options menu)の使用を示します.
(1)メニューレイアウトファイルの定義
res/menuディレクトリのXMLファイルでメニュー項目レイアウトを定義します.各属性の意味は以下の図です.
オプションメニューレイアウトファイル名main_opt_menu.xmlは、「メインアクティブオプションメニュー」レイアウトファイルを意味します.コードは次のとおりです.
xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/action_about"
android:title="About"
app:showAsAction="always"/>
<item android:id="@+id/action_setting"
android:title="Setting"
android:icon="@drawable/ic_setting_24dp"
app:showAsAction="ifRoom"/>
<item android:id="@+id/action_sort"
android:title="Sort"
android:icon="@drawable/ic_sort"
app:showAsAction="always">
<menu>
<group
android:id="@+id/group_sort"
android:checkableBehavior="single">
<item android:id="@+id/action_sort_size"
android:title="Size_sort"/>
<item android:id="@+id/action_sort_time"
android:title="Time_sort"/>
<item android:id="@+id/action_sort_type"
android:title="Type_sort" />
group>
menu>
item>
menu>
, About 、Setting 、Sort ; Sort 3 , , android:checkableBehavior="single", , , 。Item showAsAction:ifRoom( ) always( )。
(2)メニューレイアウトファイルのロード、メニューの作成
MainActivity , onCreateOptionsMenu(Menu menu) 。
/**
*
* @param menu
* @return
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// [ ]
getMenuInflater().inflate(R.menu.main_opt_menu, menu);
return true;
}
getMenuInflater().inflate(R.menu.main_opt_menu, menu); main_opt_menu.xml, [ ]。
(3)メニュー前処理方法
boolean isShowSort = true;
/**
*
* : ,
* @param menu
* @return
*/
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// menu.findItem(R.id.action_about).setVisible(false);
menu.findItem(R.id.action_about).setVisible(isShowSort);
return super.onPrepareOptionsMenu(menu);
}
onPrepareOptionsMenu(Menu menu): , 。
(4)メニュー項目イベント処理
/**
* ( )
* @param item
* @return
*/
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getGroupId() == R.id.group_sort){
// --
item.setChecked(true);
}
switch (item.getItemId()){
case R.id.action_add:
Toast.makeText(MainActivity.this,"Add",Toast.LENGTH_SHORT).show();//
break;
case R.id.action_search:
break;
default:break;
}
return true;
}
onOptionsItemSelected(MenuItem item) MainActivity , 。
二、コンテキストメニュー(Context menu)
1、コンテキストメニュー(Context menu)の効果図は以下の通りです.
AndroidのコンテキストメニューはPCの右クリックメニューに似ています.1つのビューにコンテキストメニューを登録すると、(2秒程度)このビューオブジェクトを長押しすると、フローティングメニュー、すなわちコンテキストメニューがポップアップされます.どのビューでもコンテキストメニューを登録できますが、最も一般的なのはリストビューListView用のitemです.注意:Androidのコンテキストメニューではアイコンやショートカットはサポートされておらず、長押しでしかポップアップできません.コンテキストメニューは、ListViewを組み合わせて使用することが多い.
2、コンテキストメニューを作成する-手順
(1) Activity (onCreate() ), registerForContextMenu() , 。
(2)ActivityのonCreateContenxtMenu()メソッドを書き換え,Menuのaddメソッドを呼び出してメニュー項目(MenuItem)を追加する.
(3)ActivityのonContextItemSelected()メソッドを書き換え,コンテキストメニュー項目の選択イベントに応答する.
3、ソースコード
(1)Activity (ContextActivity.java)
package com.ljheee.menu.androidmenu;import android.app.Activity;import android.os.Bundle;import android.view.ContextMenu;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.AdapterView.AdapterContextMenuInfo;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.Toast;import java.util.ArrayList;import java.util.List;/** *Activityアクティビティクラス*実装---コンテキストメニュー*/public class ContextActivity extends Activity{//ビューprivate ListView listView;//データprivate List data=new ArrayList<>()//アダプタprivate ArrayAdapter adapter;private int position;@Override protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_context);for(int i=0;i<30;i+){data.add("データ項目"+i); } listView = (ListView) findViewById(R.id.listView_cm); adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, data); listView.setAdapter(adapter);//コンテキストメニューを登録し、onCreateContextMenu registerForContextMenu(listView)を呼び出す.//コンテキストメニュー//unregisterForContextMenu(listView);}/***コンテキストメニューの作成**@param menuメニュー*@param vコンテキストメニューの登録ビュー*@param menuInfoメニュー情報*/@Override public void onCreateContextMenu(ContextMenu menu,Viewv,ContextMenu.C ontextMenuInfomenuInfo){//メニューファイルgetMenuInflater().inflate(R.menu.menu_context,menu)のロード;//メニュータイトルアイコン、タイトル文字menuを設定する.setHeaderIcon(android.R.drawable.ic_menu_edit); menu.setHeaderTitle(「アクション」);//メニュー情報:targetView、position、id AdapterContextMenuInfoinfo=(AdapterContextMenuInfo)menuInfo;//リスト内で長押しイベント(ポップアップメニュー)をトリガーする位置position=info.position; }/***選択メニュー項目**@param item選択メニュー項目*@returnイベントが処理済みかどうか*/@Override public boolean onContextItemSelected(MenuItem item){switch(item.getItemId(){ case R.id.action_edit: doEdit(); break; case R.id.action_copy: doCopy(); break; case R.id.action_remove: doRemove(); break; } return true; } @Override public void onContextMenuClosed(Menu menu) { super.onContextMenuClosed(menu); }private void doRemove(){showToast(「削除」+data.get(position));}private void doCopy(){showToast(「コピー」+data.get(position));}private void doEdit(){showToast(「編集」+data.get(position)); } private void showToast(String text) { Toast.makeText(this, text, Toast.LENGTH_SHORT).show(); } }
(2) activity_context.xml
三、コンテキスト操作欄(Contextual ActionBar)
1、コンテキスト操作欄(Contextual ActionBar)の効果図は以下の通りである.
, , , , 。 , , 。 , onCreateActionMode() , 。 , , 。
2、関連方法onCreateActionMode: 。
onDestroyActionMode: 。
onPrepareActionMode: , 。
onItemCheckedStateChanged : , 。
onActionItemClicked: 。
, Activity 。
3、 : ListView GridView ( , ), 、 , 。
4、ソースコード(1) CabActivity.java
package com.ljheee.menu.androidmenu; import android.app.Activity; import android.os.Bundle; import android.util.SparseBooleanArray; import android.view.ActionMode; import android.view.Menu; import android.view.MenuItem; import android.widget.AbsListView; import android.widget.ArrayAdapter; import android.widget.ListView; import java.util.ArrayList; /** * * --- (Contextual Action Bar) */ public class CabActivity extends Activity implements AbsListView.MultiChoiceModeListener { // private ListView listView; // private ArrayList
data = new ArrayList (); // private ArrayAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_cab); listView = (ListView) findViewById(R.id.listView_cab); initData();// // (activated) adapter = new ArrayAdapter (this, android.R.layout.simple_list_item_activated_1, data); listView.setAdapter(adapter); // listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); // listView.setMultiChoiceModeListener(this); } private void initData() { for (int i = 0; i < 30; i++) { data.add(" " + i); } } @Override public void onItemCheckedStateChanged( ActionMode mode, int position, long id, boolean checked) { // int count = listView.getCheckedItemCount(); // mode.setTitle(String.valueOf(count)); // mode.setSubtitle(); } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { // getMenuInflater().inflate(R.menu.menu_cab, menu); return true; } @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.action_cab_copy: // 【 】 SparseBooleanArray array = listView.getCheckedItemPositions(); // ID // long[] ids = listView.getCheckedItemIds(); break; case R.id.action_cab_remove: break; } // CAB , onDestroyActionMode mode.finish(); return true; } @Override public void onDestroyActionMode(ActionMode mode) { } } (2) activity_cab.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.newer.menu.CabActivity"> <ListView android:id="@+id/listView_cab" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentTop="true" /> RelativeLayout>
四、ポップアップメニュー(Popup menu)
1、ポップアップメニュー---効果図, , , Button, , , , 。
2、作成手順• PopupMenu
•
•
•
3、ソースコード(1) PopupActivity.java
package com.ljheee.menu.androidmenu; import android.app.Activity; import android.os.Bundle; import android.view.MenuItem; import android.view.View; import android.widget.PopupMenu; /** * * -- */ public class PopupActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_popup); } public void onClick(View v) { // // : // : PopupMenu menu = new PopupMenu(this, v); // menu.inflate(R.menu.menu_popup); // menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { return true; } }); // 【 , 】 menu.setOnDismissListener(new PopupMenu.OnDismissListener() { @Override public void onDismiss(PopupMenu menu) { } }); // menu.show(); } }
(2) menu_popup.xml( res/menu , res Menu)