編輯:Android開發實例
前言
本文講解一下菜單Menu的使用。菜單在windows應用中使用十分廣泛,幾乎所有的windows應用都有菜單,Android中也加入了菜單的支持。從官方文檔了解到,從Android3.0(API level 11)開始,Android設備不再要求提供一個專門的菜單按鈕,轉而推薦使用ActionBar。所以現在市面上很多新設備使用三個虛擬按鍵,並不再額外提供菜單按鈕,但是按鈕的使用也是有些地方可以借鑒的。
因為Android版本的發展,對於菜單的支持各個版本有很大的區別,而Android3.0是個分水嶺,大概可以分為下面三類:
在XML中定義一個菜單
Android提供了標准的XML格式的資源文件來定義菜單項,並且對所有菜單類型都支持,推薦使用XML資源文件來定義菜單,之後再把它Inflater到Activity或者Fragment中,而不是在Activity中使用代碼聲明。
而菜單的XML資源文件,需要創建在/res/menu/目錄下,並且包含一下幾個元素:
<item>元素除了常規的id、icon、title屬性的支持,還有一個重要的屬性:android:showAsAction,這個屬性是起兼容性的,描述了在Android的高版本中,菜單項何時以何種方式加入到ActionBar中。
<group>是對菜單進行分組,分組後的菜單顯示效果並沒有區別,唯一的區別在於可以針對菜單組進行操作,這樣對於分類的菜單項,操作起來更方便,提供如下的操作:
如果菜單項需要單選或者多選,可以使用android:checkableBehavior屬性設置,它可以對單個<item>或者<group>設置一個組,這個屬性接受三個參數:single,單選;all,多選,none,沒有Checked的選項,默認。
當創建好一個XML菜單資源文件之後,可以使用MenuInflater.inflate()方法填充菜單資源,使XML資源變成一個可編程的對象。
OptionMenu
OptionMenu,選項菜單,必須設備具有菜單按鈕才可以觸發。因為屏幕的限制,最多只能展示六個菜單項,如果定義的菜單項超出了六個,其他的菜單項將被隱藏,第六個菜單將會顯示“更多”,點擊展開更多的菜單。雖說在Android3.0之後不再推薦使用選項菜單,但是如果使用了,在Android3.0之後的設備上,選項菜單項將被默認轉移到ActionBar中,這個可以通過android:showAsAction屬性控制。
使用OptionMenu需要在Activity或者Fragment中重寫onCreateOptionsMenu(Menu)方法,在這個方法中聲明一個選項菜單。菜單的存在是為了提供操作,所以Activity和Fragment中還提供了一個onOptionsItemSelected(MenuItem)方法,用於響應選項菜單中選中的時候的響應。OptionMenu就是操作一個Menu對象和MenuItem對象。
下面通過兩個Demo來展示一段選項菜單的使用,分別使用代碼聲明菜單和XML資源文件聲明菜單的方式說明。
聲明代碼:
- package com.example.menudemo;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.view.SubMenu;
- import android.widget.Toast;
- public class OptionMenu1Activitty extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_optionmenu1);
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- //直接Add菜單選項到Menu中
- menu.add(1000, 100, 0, "System menu");
- //獲取添加的菜單選項,然後設置其圖標
- MenuItem menuItem2=menu.add(1000, 101, 1, "User menu");
- menuItem2.setIcon(R.drawable.ic_launcher);
- //獲取添加的菜單選項,增加一個Intent,點擊後轉向IntentActivity
- MenuItem menuItem3=menu.add(1000, 102, 2, "Intent menu");
- menuItem3.setIcon(R.drawable.ic_launcher);
- Intent intent=new Intent(OptionMenu1Activitty.this, IntentActivity.class);
- menuItem3.setIntent(intent);
- //添加一個SubMenu,點擊後彈出一個子菜單對話框
- SubMenu submenu=menu.addSubMenu(1000, 103, 3, "Sub menus");
- submenu.add(1000, 104, 4, "Sub ment1");
- submenu.add(1000, 105, 4, "Sub ment2");
- submenu.add(1000, 106, 4, "Sub ment3");
- return true;
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- boolean flag;
- switch (item.getItemId()) {
- case 100:
- Toast.makeText(OptionMenu1Activitty.this, "selected System menu", Toast.LENGTH_SHORT).show();
- flag=true;
- break;
- case 101:
- Toast.makeText(OptionMenu1Activitty.this, "selected User menu", Toast.LENGTH_SHORT).show();
- flag=true;
- break;
- case 104:
- Toast.makeText(OptionMenu1Activitty.this, "selected Sub menu1", Toast.LENGTH_SHORT).show();
- flag=true;
- default:
- flag=super.onOptionsItemSelected(item);
- break;
- }
- return flag;
- }
- }
實現效果,Android2.3:
使用XML資源文件定義選項菜單,XML資源文件:
- <?xml version="1.0" encoding="utf-8"?>
- <menu xmlns:android="http://schemas.android.com/apk/res/android" >
- <item
- android:id="@+id/item1"
- android:showAsAction="never"
- android:title="System menu">
- </item>
- <item
- android:id="@+id/item2"
- android:showAsAction="never"
- android:title="User menu"
- android:icon="@drawable/ic_launcher">
- </item>
- <item
- android:id="@+id/item3"
- android:showAsAction="never"
- android:title="Intent menu"
- android:icon="@drawable/ic_launcher">
- </item>
- <group android:id="@+id/group_file" >
- <item android:id="@+id/menu_save"
- android:title="menu group save" />
- <item android:id="@+id/menu_delete"
- android:title="menu group delete" />
- </group>
- <item android:id="@+id/file"
- android:title="Sub menus" >
- <!-- "file" submenu -->
- <menu>
- <item android:id="@+id/sub_menu1"
- android:title="Sub menu1" />
- <item android:id="@+id/sub_menu21"
- android:title="Sub menu2" />
- <item android:id="@+id/sub_menu3"
- android:title="Sub menu3" />
- </menu>
- </item>
- </menu>
Java代碼:
- package com.example.menudemo;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.widget.TextView;
- import android.widget.Toast;
- public class OptionMenu2Activitty extends Activity {
- private TextView tv;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_optionmenu1);
- tv=(TextView)findViewById(R.id.tvOptionMenu1);
- tv.setText("加載XML資源填充Menu");
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // 使用布局文件加載菜單
- getMenuInflater().inflate(R.menu.optionmenu2, menu);
- return super.onCreateOptionsMenu(menu);
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.item1:
- Toast.makeText(OptionMenu2Activitty.this, "selected System menu", Toast.LENGTH_SHORT).show();
- return true;
- case R.id.item2:
- Toast.makeText(OptionMenu2Activitty.this, "selected User menu", Toast.LENGTH_SHORT).show();
- return true;
- case R.id.item3:
- Intent intent=new Intent(OptionMenu2Activitty.this, IntentActivity.class);
- startActivity(intent);
- return true;
- case R.id.menu_save:
- Toast.makeText(OptionMenu2Activitty.this, "file save", Toast.LENGTH_SHORT).show();
- return true;
- case R.id.sub_menu1:
- Toast.makeText(OptionMenu2Activitty.this, "Selected sub_menu1", Toast.LENGTH_SHORT).show();
- return true;
- default:
- return super.onOptionsItemSelected(item);
- }
- }
- }
效果和使用Java代碼聲明菜單一樣,這裡就不再展示了。
ContextMenu
ContextMenu,上下文菜單提供了注冊在View組件的菜單操作,它以一個浮動的窗口顯示(類似於對話框),當用戶長按某被注冊了上下文菜單的視圖,則觸發上下文菜單顯示。通常都用於ListView或者GridView等視圖集合中。
使用上下文菜單的步驟:
示例,菜單XML資源文件代碼:
- <menu xmlns:android="http://schemas.android.com/apk/res/android" >
- <item
- android:id="@+id/context_copy"
- android:orderInCategory="100"
- android:showAsAction="never"
- android:title="Copy"/>
- <item
- android:id="@+id/context_edit"
- android:orderInCategory="100"
- android:showAsAction="never"
- android:title="Edit"/>
- <item
- android:id="@+id/context_delete"
- android:orderInCategory="100"
- android:showAsAction="never"
- android:title="Delete"/>
- </menu>
Java代碼:
- package com.example.menudemo;
- import java.util.ArrayList;
- import java.util.List;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.ContextMenu;
- import android.view.MenuInflater;
- import android.view.MenuItem;
- import android.view.View;
- import android.view.ContextMenu.ContextMenuInfo;
- import android.widget.AdapterView.AdapterContextMenuInfo;
- import android.widget.ArrayAdapter;
- import android.widget.ListView;
- import android.widget.Toast;
- public class ContextMenu1 extends Activity {
- private ListView listview;
- private List<String> dataList;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_contextmenu1);
- listview=(ListView)findViewById(R.id.listView1);
- dataList=getData();
- ArrayAdapter<String> adapter=new ArrayAdapter<String>(ContextMenu1.this,android.R.layout.simple_list_item_1, dataList);
- listview.setAdapter(adapter);
- //為ListView注冊上下文菜單
- registerForContextMenu(listview);
- }
- @Override
- public void onCreateContextMenu(ContextMenu menu, View v,
- ContextMenuInfo menuInfo) {
- super.onCreateContextMenu(menu, v, menuInfo);
- //填充一個XML菜單文件
- MenuInflater inflater = getMenuInflater();
- inflater.inflate(R.menu.contextmenu, menu);
- }
- @Override
- public boolean onContextItemSelected(MenuItem item) {
- //獲取上下文菜單綁定的AdapterView的額外信息
- AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
- switch (item.getItemId()) {
- case R.id.context_copy:
- Toast.makeText(ContextMenu1.this, "copy "+dataList.get(info.position), Toast.LENGTH_SHORT).show();
- return true;
- case R.id.context_delete:
- Toast.makeText(ContextMenu1.this, "delete "+dataList.get(info.position), Toast.LENGTH_SHORT).show();
- return true;
- case R.id.context_edit:
- Toast.makeText(ContextMenu1.this, "edit " +dataList.get(info.position), Toast.LENGTH_SHORT).show();
- return true;
- default:
- return super.onContextItemSelected(item);
- }
- }
- //ListView數據
- public List<String> getData()
- {
- List<String> data=new ArrayList<String>();
- for(int i=0;i<8;i++)
- {
- data.add("item"+i);
- }
- return data;
- }
- }
效果展示,Android4.0:
ActionMode
ActionMode,是一個系統實現的用戶交互,當用戶使用ActionMode後,選擇一個選項,一個上下文操作欄會出現在屏幕的頂端,呈現出用戶可以對當前選中項目進行的操作選項。進入這種狀態可以通過後退按鈕或者調用finish()退出。ActionMode為Android3.0之後的支持,所以在開發3.0之後的應用,推薦使用ActionMode,而不是ContextMenu。
使用ActionMode的步驟:
ActionMode.Callback是ActionMode定義的一個內部接口,這個接口需要實現下面四個方法:
示例:
- package com.example.menudemo;
- import java.util.ArrayList;
- import java.util.List;
- import android.annotation.SuppressLint;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.ActionMode;
- import android.view.ActionMode.Callback;
- import android.view.Menu;
- import android.view.MenuInflater;
- import android.view.MenuItem;
- import android.view.View;
- import android.widget.AdapterView;
- import android.widget.AdapterView.AdapterContextMenuInfo;
- import android.widget.AdapterView.OnItemLongClickListener;
- import android.widget.ArrayAdapter;
- import android.widget.ListView;
- import android.widget.Toast;
- public class ActionModeMenu1 extends Activity {
- private ListView listview;
- private List<String> dataList;
- private ActionMode mActionMode;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_contextmenu1);
- listview=(ListView)findViewById(R.id.listView1);
- dataList=getData();
- ArrayAdapter<String> adapter=new ArrayAdapter<String>(ActionModeMenu1.this,android.R.layout.simple_list_item_1, dataList);
- listview.setAdapter(adapter);
- listview.setOnItemLongClickListener(new OnItemLongClickListener() {
- @SuppressLint("NewApi")
- @Override
- public boolean onItemLongClick(AdapterView<?> parent, View view,
- int position, long id) {
- if (mActionMode != null) {
- return false;
- }
- //顯示ActionMode
- mActionMode = startActionMode(mActionModeCallback);
- //標記選中項的下表
- mActionMode.setTag(position);
- //標記ListView為可選狀態
- view.setSelected(true);
- return true;
- }
- });
- }
- public List<String> getData()
- {
- List<String> data=new ArrayList<String>();
- for(int i=0;i<8;i++)
- {
- data.add("item"+i);
- }
- return data;
- }
- private ActionMode.Callback mActionModeCallback=new Callback() {
- @Override
- public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
- //刷新菜單列表的時候被調用,但是一般無需刷新
- return false;
- }
- @Override
- public void onDestroyActionMode(ActionMode mode) {
- //銷毀ActionMode
- mActionMode = null;
- }
- @Override
- public boolean onCreateActionMode(ActionMode mode, Menu menu) {
- //創建ActionMode
- //使用資源文件填充
- MenuInflater inflater = mode.getMenuInflater();
- inflater.inflate(R.menu.contextmenu, menu);
- return true;
- }
- @Override
- public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
- //獲取選項中下表
- int position=(Integer)mode.getTag();
- switch (item.getItemId()) {
- case R.id.context_copy:
- Toast.makeText(ActionModeMenu1.this, "copy "+dataList.get(position), Toast.LENGTH_SHORT).show();
- //finish退出ActionMode模式
- mode.finish();
- return true;
- case R.id.context_delete:
- Toast.makeText(ActionModeMenu1.this, "delete "+dataList.get(position), Toast.LENGTH_SHORT).show();
- mode.finish();
- return true;
- case R.id.context_edit:
- Toast.makeText(ActionModeMenu1.this, "edit " +dataList.get(position), Toast.LENGTH_SHORT).show();
- mode.finish();
- return true;
- default:
- return false;
- }
- }
- };
- }
效果展示,Android4.0:
PopupMenu
PopupMenu,彈出菜單,一個模態形式展示的彈出風格的菜單,綁在在某個View上,一般出現在被綁定的View的下方(如果下方有空間)。
使用PopupMenu的步驟:
示例:
- public void showPopup(View v){
- PopupMenu popup=new PopupMenu(MainActivity.this, v);
- popup.setOnMenuItemClickListener(new OnMenuItemClickListener() {
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- switch (item.getItemId()) {
- case R.id.context_copy:
- Toast.makeText(MainActivity.this, "select copy ", Toast.LENGTH_SHORT).show();
- return true;
- case R.id.context_delete:
- Toast.makeText(MainActivity.this, " select delete ", Toast.LENGTH_SHORT).show();
- return true;
- case R.id.context_edit:
- Toast.makeText(MainActivity.this, " select edit ", Toast.LENGTH_SHORT).show();
- return true;
- default :
- return false;
- }
- }
- });
- popup.getMenuInflater().inflate(R.menu.contextmenu,popup.getMenu());
- popup.show();
- }
效果展示,Android4.0:
源碼下載
總結
以上就講解了Android下Menu的使用。因為上面的所有示例均在一個項目中完成的,所以有些低版本的操作,需要更改AndroidManifest.xml文件中的最低支持版本,改到8即可。在現在的實際開發中,最好還是使用對高版本只是的ActionBar、ActionMode、PopupMenu比較好。
Broadcast Receiver簡介 Broadcast Receiver是Android的五大組件之一,使用頻率也很高。 用於異步接收廣播Intent,廣播
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
第一步:代碼混淆(注意引入的第三方jar) 在新版本的ADT創建項目時,混碼的文件不再是proguard.cfg,而是project.properties和pro
本文實例講述了Android編程之OpenGL繪圖技巧。分享給大家供大家參考,具體如下: 很久不用OpenGL ES繪圖,怕自己忘記了,於是重新復習一遍,順便原理