安卓入門-UI Components 之Menu (菜單)

安卓入門



--------------------------------------------------------------------------


UI Components 之Menu (菜單)


--------------------------------------------------------------------------


1.UI Components 是什麼?
1)UI 對象(負責呈現view)
2)它不是view.它通過view呈現數據,實現與用戶交互。



--------------------------------------------------------------------------


2.Menu 是什麼?
1)Android 中的一種菜單對象類型。
2)Android 中的一種呈現view的對象。


3.Menu 對象應用類型?


1)選項菜單(Option Menu)
2)上下文菜單(Context Menu)
3)彈出式菜單(PopuMenu)
4)子菜單(SubMenu 每種菜單都有子菜單)


4.選項菜單構建及應用?
1)構建選項菜單(重寫activity中的onCreateOptionMenu)
2)處理選項菜單監聽(重寫activity中的onOptionItemSelected)




5.上下文菜單的創建及應用(基於view的長按事件)
0)在view上註冊上下文菜單(registerForContextMenu)
1)構建上下文菜單(重寫activity中的onCreateContextMenu)
2)處理上下文菜單監聽(重寫activity中的onContextItemSelected)


案例:listview 長按時彈出上下文菜單(刪除,分享)
public class MainActivity extends Activity {

	private List<String> data=new ArrayList<String>();
	public MainActivity() {
		data.add("A");
		data.add("B");
		data.add("C");
	}
	ArrayAdapter<String> adapter;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	    ListView lsv=(ListView) findViewById(R.id.lsvId);
	    adapter=new ArrayAdapter<String>(this, 
	    	    android.R.layout.simple_list_item_1,
	    	    data);
	    lsv.setAdapter(adapter);
	    
	    //註冊上下文菜單
	    registerForContextMenu(lsv);
	}
	/**長按listview的item時會執行此方法*/
	@Override
	public void onCreateContextMenu(
			ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {
		//getMenuInflater().inflate(menuRes, menu)
		
		//基於java方式創建菜單項
		menu.add(0, 101,//itemId
				201,//orderId (序號)
				"刪除"//title
				);
		menu.add(0, 102,//itemId
				202,//orderId
				"分享"//title
				);
	}
	/**當我們點擊上下文菜單中的選項時自動執行此方法*/
	@Override
	public boolean onContextItemSelected(MenuItem item) {
		
	
		ContextMenuInfo c=item.getMenuInfo();
		
		Log.i("TAG", "c="+c);
		AdapterContextMenuInfo acm=
		(AdapterContextMenuInfo)c;
		//獲得長按的位置
		int pos=acm.position;
		
		if(item.getItemId()==101){
		//刪除數據
		 data.remove(pos);
		 //刷新listview
		 adapter.notifyDataSetChanged();
		}else if(item.getItemId()==102){
		 //分享的action: ACTION_SEND
		 Intent target=new Intent(Intent.ACTION_SEND);
		 //設置稅局類型
		 target.setType("text/*");
		 //設置要分享的數據
		 target.putExtra(Intent.EXTRA_TEXT, data.get(pos));
		 //創建分享目標
		 Intent intent=
		 Intent.createChooser(target, "請選擇");
		 //啓動activity
		 startActivity(intent);	
		}return true;
	}


}



6.彈出式菜單(基於view的點擊事件):瞭解


1)創建菜單(PopuMenu)及菜單項
2)顯示菜單(show)
3)添加監聽(setOnMenuItemClickListener)

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	public void onClick(final View v){
		//構建菜單對象
		PopupMenu pm=
		new PopupMenu(this, v);
		//初始化菜單中的item
		pm.getMenuInflater().
		inflate(R.menu.pop,
		pm.getMenu());
		//pm.getMenu().add(groupId, itemId, order, title)
		//添加監聽
		pm.setOnMenuItemClickListener(
			new OnMenuItemClickListener() {
			@Override
			public boolean onMenuItemClick(MenuItem item) {
				((Button)v).setText(item.getTitle());
				return false;
			}
		});
		//顯示菜單
		pm.show(); 
	}

}




8.子菜單(菜單項中還可以添加菜單)


案例:選項菜單中添加子菜單(xml,java)
public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	private Menu menu;
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		this.menu=menu;
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		
		//通過java方式添加子菜單
		SubMenu sm=
		menu.addSubMenu(0,1000,
		101, "item02");
		
		MenuItem item=menu.findItem(1000);
		item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
	    //添加菜單項
		sm.add(0, 2000, 200, "item0002");
		return true;
	}
	public void onClick(View v){
		menu.setGroupVisible(R.id.group01, true);
	}

}
menu-xml文件如下:
<?xml version="1.0"?>

-<menu xmlns:android="http://schemas.android.com/apk/res/android">


-<group android:visible="false" android:id="@+id/group01">


-<item android:title="item01" android:id="@+id/item01" android:showAsAction="ifRoom" android:orderInCategory="100">


-<menu>

<item android:title="item001" android:id="@+id/item001" android:showAsAction="never" android:orderInCategory="300"/>

<item android:title="item002" android:id="@+id/item002" android:showAsAction="never" android:orderInCategory="301"/>

</menu>

</item>

</group>

</menu>



7.菜單的分組(可以同時顯示或隱藏多個菜單項)


1)創建(xml:group)
2)調用menu對象的相關方法操作分組(例如顯示或隱藏setGroupVisible)


9.側滑菜單(菜單擴展)
1)DrawerLayout 佈局(根元素必須是drawerlayout)
2)DrawerLayout 對象 (findViewByid)
a)初始化listview對象(側滑item對象)
b)初始化framelayout對象

3)DrawerLayout 添加監聽對象

public class MainActivity extends Activity implements OnItemClickListener {

	private List<Item> list=new ArrayList<Item>();
	public MainActivity() {
		list.add(new Item(android.R.drawable.ic_menu_save,"我的收藏"));
		list.add(new Item(android.R.drawable.ic_menu_camera,"我的設置"));
		list.add(new Item(android.R.drawable.ic_menu_delete,"退出"));
	}
	private DrawerLayout drawerLayout;
	private TextView contentTv;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		setDrawerLayout();
		setDrawerListView();
		setContent();
	}

	private void setContent() {
		contentTv=(TextView) findViewById(R.id.textId);
	}

	private void setDrawerListView() {
		ListView lsv=(ListView) findViewById(R.id.lsvId);
	    lsv.setAdapter(new ArrayAdapter<Item>(this,
	    android.R.layout.simple_list_item_1,list){
	    	@Override
	    	public View getView(int position, View convertView, ViewGroup parent) {
	    		TextView v=(TextView)View.inflate(getContext(),  android.R.layout.simple_list_item_1, null);
	    		Item item=getItem(position);
	    		//獲得圖片資源的drawable對象
	    		Drawable left=getResources()
	    		.getDrawable(item.getLogo());
	    		//設定對象的邊界
	    		left.setBounds(0, 0,50, 50);
	    		//將left對象繪製到v的左邊
	    		v.setCompoundDrawables(left,
	    		null, null, null);
	    		
	    		v.setText(item.getName());
	    		return v;
	    	}
	    });
	    lsv.setOnItemClickListener(this);
	}
	private ActionBarDrawerToggle drawerToggle;
	private void setDrawerLayout() {
		 getActionBar().setDisplayHomeAsUpEnabled(true);//顯示圖標
		drawerLayout=(DrawerLayout) findViewById(R.id.drawerLayoutId);
	    drawerToggle=new ActionBarDrawerToggle(this,
	    drawerLayout,
	    R.drawable.top_menu_on, R.string.open_drawer,R.string.close_drawer){
	    	@Override
	    	public void onDrawerOpened(View drawerView) {
	    		super.onDrawerOpened(drawerView);
	    		setTitle("Open");
	    	}
	    	@Override
	    	public void onDrawerClosed(View drawerView) {
	    		super.onDrawerClosed(drawerView);
	    		setTitle("Close");
	    	}
	    };
		drawerLayout.setDrawerListener(drawerToggle);
	}
	
	/**選項菜單創建之前執行,在此方法中同步drawerLayout狀態*/
	@Override
	protected void onPostCreate(Bundle savedInstanceState) {
		super.onPostCreate(savedInstanceState);
		drawerToggle.syncState();
	}
	
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		//打開或收起drawerlayout對象
		if(drawerToggle.onOptionsItemSelected(item)){
			return true;
		}
		return true;
	}
	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
		Item item=(Item)parent.getItemAtPosition(position);
		contentTv.setText(item.getName());
		drawerLayout.closeDrawer(parent);
	}
	class Item{
		private int logo;
		private String name;
		public Item(int logo,String name) {
			this.logo=logo;
			this.name=name;
		}
		public int getLogo() {
			return logo;
		}
		public String getName() {
			return name;
		}
	}
}


--------------------------------------------------------------------------
--------------------------------------------------------------------------
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章