編輯:關於android開發
菜單是許多應用中常見的用戶界面組件。
Android3.0版本以前,Android設備會提供一個專用“菜單”按鈕呈現常用的一些用戶操作,
Android3.0版本以後,取而代之的是提供一個操作欄來完成“菜單”的功能
關於菜單的官方介紹:<https://developer.android.com/guide/topics/ui/menus.html>
Android 2.3.X或更低版本 Android3.0及更高版本
Android 2.3.X或更低版本,當用戶按“菜單”按鈕(實體按鈕)時,選項菜單的內容會出現在屏幕底部;
Android3.0及更高版本,則選項菜單中的項目將出現在操作欄中。默認情況下,系統會將所有項目均放入操作溢出菜單中。用戶可以使用操作欄右側的操作溢出菜單圖標(或者,通過按設備“菜單”按鈕(如有))顯
示操作溢出菜單。但是可以通過在tem中android:showAsAction = “ifRoom”將菜單選項直接提升到操作欄中去顯示。
*:並不是所有的app都會有菜單出現在操作欄中的,這取決於app的設計,如果app是需要自己的操作欄,那麼根據自己的需求設計,如果是系統默認的操作欄,那麼就會有菜單。
---通過重寫 onCreateOptionsMenu()創建選項菜單,您可以將菜單資源(使用 XML 定義)擴充到回調中提供的 Menu 中:
Eg:
public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); //add新增菜單 menu.add("新增選項菜單"); //效果一樣,都直接加的一級菜單 menu.addSubMenu("新增選項菜單子菜單"); //查詢修改屬性 menu.findItem(R.id.action_settings).setTitle("設置"); return true; }
---處理點擊事件:用戶從選項菜單中選擇項目(包括操作欄中的操作項目)時,系統將調用 Activity 的 onOptionsItemSelected() 方法。此方法將傳遞所選的 MenuItem。您可以通過調用 getItemId() 方法來
識別項目,該方法將返回菜單項的唯一 ID,您可以將此 ID 與已知的菜單項匹配,以執行適當的操作。
Eg:
public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.new_game: newGame(); return true; case R.id.help: showHelp(); return true; default: return super.onOptionsItemSelected(item); } }
上下文菜單提供了許多操作,這些操作影響 UI 中的特定項目或上下文框架。您可以為任何視圖提供上下文菜單,但這些菜單通常用於 ListView、GridView 或用戶可直接操作每個項目的其他視圖集合中的項目。
Android系統提供上下文操作的方法有2種:
用戶長按(按住)一個聲明支持上下文菜單的視圖時,菜單顯示為菜單項的浮動列表(類似於對話框)。 用戶一次可對一個項目執行上下文操作。比如:
創建浮動上下文菜單步驟:
1、通過調用 registerForContextMenu(),綁定菜單給具體的view。如果view是listview或者gridview,那麼菜單將綁定給所有item。
2、在 Activity 中實現 onCreateContextMenu() 方法。
當注冊後的視圖收到長按事件時,系統將調用您的 onCreateContextMenu() 方法。在此方法中,您通常可通過擴充菜單資源來定義菜單項。比如:
3、實現 onContextItemSelected()。用戶選擇菜單項時,系統將調用此方法,以便您能夠執行適當的操作。 例如:
public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.context_menu_1: Toast.makeText(getApplicationContext(), "選擇菜單1,你要做什麼,自己做...", 0).show(); return true; default: return super.onContextItemSelected(item); } }
將在屏幕頂部顯示上下文操作欄,其中包括影響所選項的操作項目。當此模式處於活動狀態時,用戶可以同時對多項執行操作(如果應用允許)。比如:
創建上下文操作模式菜單步驟:
A:為單個視圖啟用上下文操作模式
1:實現ActionMode.Callback接口。在其回調方法中,您既可以為上下文操作欄指定操作,又可以響應操作項目的點擊事件。
2:當需要顯示操作欄時(例如,用戶長按視圖),調用startActionMode()。比如:
private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() { /** * onCreateActionMode()之後調用,返回false表示什麼也不做。 */ @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; } @Override public void onDestroyActionMode(ActionMode mode) { //方便內存回收 actionMode = null; } /** * 當actionmode被創建,startActionMode()方法被調用,回調此方法 * 在這裡可以為上下文操作模式綁定菜單 */ @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { MenuInflater menuInflater = mode.getMenuInflater(); menuInflater.inflate(R.menu.context_menu, menu); return true; } /** * 當actionMode綁定的上下文菜單被點擊的時候的回調 */ @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.context_menu_1: //選中菜單1,我就把button2的文字改一下好了.. button2.setText(item.getTitle()); //完成菜單的任務之後,最好銷毀一下actionMode對象,不要長期占用內存 actionMode.finish(); return true; default: return false; } } };
B:在 ListView 或 GridView 中有一組項目(或 AbsListView 的其他擴展),且需要允許用戶執行批處理操作。
步驟:
1:使用 setMultiChoiceModeListener()設置AbsListView.MultiChoiceModeListener 接口的實現類對象。
2:使用 setChoiceMode()設置選擇模式為 CHOICE_MODE_MULTIPLE_MODAL;
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
Eg:
lv = (ListView) findViewById(R.id.lv); strings = new ArrayList<String>(); strings.add("item1"); strings.add("item2"); strings.add("item3"); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, strings); lv.setAdapter(adapter); // 設置上下文操作模式 lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); lv.setMultiChoiceModeListener(new MultiChoiceModeListener() { @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { return false; } @Override public void onDestroyActionMode(ActionMode mode) { } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { MenuInflater menuInflater = mode.getMenuInflater(); menuInflater.inflate(R.menu.context_menu, menu); return true; } @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { Log.v("zoubo", "onActionItemClicked.."); switch (item.getItemId()) { case R.id.context_menu_1: // 選中菜單1,新增一個item strings.add("item4"); adapter.notifyDataSetChanged(); // 局部的mode,不需要維護其生命周期 // mode.finish(); return true; default: return false; } } /** * item選中狀態發生改變時調用 */ @Override public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) { Log.v("zoubo", "onItemCheckedStateChanged.."); } });
*:現在,當用戶通過長按選擇項目時,系統即會調用 onCreateActionMode() 方法,並顯示包含指定操作的上下文操作欄。
在某些情況下,如果上下文操作提供常用的操作項目,則您可能需要添加一個復選框或類似的 UI 元素來支持用戶選擇項目,這是因為他們可能沒有發現長按行為。
用戶選中該復選框時,您可以通過使用 setItemChecked() 將相應的列表項設置為選中狀態,以此調用上下文操作模式。
錨定到 View 的模態菜單。如果空間足夠,它將顯示在定位視圖下方,否則顯示在其上方。
一般會在如下場景使用到它:
與特定內容確切相關的操作提供溢出樣式菜單,(例如,Gmail 的電子郵件標頭)
提供命令語句的另一部分(例如,標記為“添加”且使用不同的“添加”選項生成彈出菜單的按鈕)
提供類似於 Spinner 且不保留永久選擇的下拉菜單。
Eg:
ImageView iv1 = (ImageView) findViewById(R.id.iv1); iv1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { PopupMenu popupMenu = new PopupMenu(MainActivity.this, v); MenuInflater menuInflater = popupMenu.getMenuInflater(); menuInflater.inflate(R.menu.popup_menu, popupMenu.getMenu()); popupMenu.show(); popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.popup_menu_1: return true; default: return false; } } }); } });
PopupWindow:
PopupWidow提供實現自定義菜單的原生控件,它可以指定自己繪制的view對象作為彈出菜單錨定出現在view的周圍,並且可以控制它具體出現的位置
Eg:
Button btn3 = (Button) findViewById(R.id.btn3); btn3.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub View contentView = LayoutInflater.from(v.getContext()).inflate( R.layout.popup_menu, null); PopupWindow popupWindow = new PopupWindow(contentView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); // 出現view的下方 // popupWindow.showAsDropDown(v); // 如果不設置PopupWindow的背景,無論是點擊外部區域還是Back鍵都無法dismiss彈框 popupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.q2)); popupWindow.setOutsideTouchable(true); popupWindow.showAtLocation(v, Gravity.TOP, (int) v.getX(),(int) v.getY()); } });
*:代碼中,如果需要點擊外部讓popupwindow消失的話,必須調用這2句代碼:
popupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.q2));
popupWindow.setOutsideTouchable(true);
popupWindow遮罩效果的實現:
布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ll" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#b0000000" android:orientation="vertical"> final PopupWindow popupWindow = new PopupWindow(inflate, RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout .LayoutParams.WRAP_CONTENT); //對於用戶的可視范圍之外的區域點擊,讓窗口消失的處理方式 inflate.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { int height = inflate.findViewById(tv).getTop(); int y = (int) event.getY(); if (event.getAction() == MotionEvent.ACTION_UP) { if (y < height) { popupWindow.dismiss(); } } return true; } });
UI組件之ImageView及其子類(一)ImageView顯示圖片 ImageView家族的繼承關系如圖: ImageView繼承自View組件,它的主要功能室顯示圖
【騰訊Bugly干貨分享】Android Linker 與 SO 加殼技術,buglyandroid本文來自於騰訊bugly開發者社區,非經作者同意,請勿轉載,原文地址:
安卓系統短信源碼依賴庫、可運行的源碼 新項目需要做短信模塊功能,此短信模塊非安卓系統短信模塊,是利用了360張勇主導的開源框架,進行URL攔截,剝離出來的
Android 急速發布項目到 JitPack,androidjitpack 轉載請標明出處: http://www.cnblogs.com/zhaoyanjun/p/