安卓入門
--------------------------------------------------------------------------
UI Components 之Menu (菜單)
--------------------------------------------------------------------------
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;
}
}
}