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)の効果図は以下の通りです.
Android----菜单的使用_第1张图片
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ファイルでメニュー項目レイアウトを定義します.各属性の意味は以下の図です.
Android----菜单的使用_第2张图片
オプションメニューレイアウトファイル名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----菜单的使用_第3张图片
AndroidのコンテキストメニューはPCの右クリックメニューに似ています.1つのビューにコンテキストメニューを登録すると、(2秒程度)このビューオブジェクトを長押しすると、フローティングメニュー、すなわちコンテキストメニューがポップアップされます.どのビューでもコンテキストメニューを登録できますが、最も一般的なのはリストビューListView用のitemです.注意:Androidのコンテキストメニューではアイコンやショートカットはサポートされておらず、長押しでしかポップアップできません.コンテキストメニューは、ListViewを組み合わせて使用することが多い.
2、コンテキストメニューを作成する-手順
(1) Activity      (onCreate()   ),   registerForContextMenu()   ,          。

(2)ActivityのonCreateContenxtMenu()メソッドを書き換え,Menuのaddメソッドを呼び出してメニュー項目(MenuItem)を追加する.
(3)ActivityのonContextItemSelected()メソッドを書き換え,コンテキストメニュー項目の選択イベントに応答する.
Android----菜单的使用_第4张图片
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

    RelativeLayout>
三、コンテキスト操作欄(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)

    menu>
     :https://github.com/ljheee/AndroidMenu