Android开源代码——MenuDrawer(二)
【MenuDrawer——在ListActivity中使用MenuDrawer】
1、在ListActivity中使用MenuDrawer的方法也是非常简单的,需要注意的几个要点步骤是:
①调用MenuDrawer.attach(参数) , 加载MenuDrawer
②调用ListActivity的setListAdapter(参数),为ListActivity加载列表项数据
③调用MenuDrawer对象的setMenuView(参数),加载菜单视图
④最后要特别注意的一点是:当第一步指定的MenuDrawer的加载模式是MenuDrawer.MENU_DRAG_CONTENT的时候,一定记得重写ListActivity的setContentView()方法
⑤由于这是ListActivity,所以我们无需调用MenuDrawer的setContentView()方法,加载内容视图,这也是为什么要添加第④步的原因
这些都非常的简单,一会儿看看实例,就会秒懂
2、此外,为了让用户便于发现在程序界面的左边隐藏着一个菜单视图,我们不仅将ActionBar上的应用程序的图标出的向左的小箭头显示出来了,而且利用Handler来控制这个小箭头的闪烁
3、我们还为MenuDrawer对象绑定了一个监测其状态的监听器,当检测到当前的菜单视图处于打开状态后,就终止MessageQueue中的使小箭头闪烁的Runnable
【用到MenuDrawer中的API】
1、为MenuDrawer注册状态监听器,在处理方法中能够监听到当前MenuDrawer中菜单视图的状态——OPEN、OPENING等等
setOnDrawerStateChangeListener(new MenuDrawer.OnDrawerStateChangeListener() {
@Override
public void onDrawerStateChange(int oldState, int newState) {
}
}
2、在拽出菜单视图的过程中,是否对菜单视图使用动画
setOffsetMenuEnabled(boolean);
3、
【废话说的太多了,直接上代码】
先练看看效果:

这个程序,只有一个主Activity文件,没有用到任何的其他的资源,左边的菜单视图,只是用一个TextView充当,右边的内容视图就是ListActivity
1 package com.penglee.tuicool_listactivity_2; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import android.app.ListActivity; 6 import android.os.Build; 7 import android.os.Bundle; 8 import android.os.Handler; 9 import android.view.Gravity; 10 import android.view.Menu; 11 import android.view.MenuItem; 12 import android.view.View; 13 import android.widget.ArrayAdapter; 14 import android.widget.ListView; 15 import android.widget.TextView; 16 import android.widget.Toast; 17 import net.simonvt.menudrawer.MenuDrawer; 18 19 public class MainActivity extends ListActivity { 20 21 private MenuDrawer menuDrawer ; 22 23 //由于我们只是为了讲明白在ListActivity中使用MenuDrawer的机制, 24 //所以我们将菜单视图简化为一个TextView,将重点放在机制的讲解上 25 private TextView menuTextView ; 26 27 //标志当前ActionBar上的应用图标处的向左的小箭头是否显示 28 private boolean displayUp = true ; 29 30 //用于控制小箭头的闪烁 31 private Handler handler; 32 33 private Runnable runnable ; 34 35 36 @Override 37 protected void onCreate(Bundle savedInstanceState) { 38 super.onCreate(savedInstanceState); 39 40 41 //注意不是menuDrawer.attach() , 而是使用MenuDrawer的静态方法attach()方法 42 menuDrawer = MenuDrawer.attach(MainActivity.this, MenuDrawer.MENU_DRAG_CONTENT) ; 43 44 menuTextView = new TextView(MainActivity.this); 45 /* 46 * 当TextView 中有额外的空间的时候,调用setGravity()方法能够指定TextView中的内容的显示位置, 47 * 参数由Gravity的静态字段指定 48 * 可以是正居中,也可以是水平居中、也可以是垂直居中 49 * **/ 50 menuTextView.setGravity(Gravity.CENTER); 51 menuTextView.setTextColor(0xFFFFFFFF); 52 menuTextView.setText("简易菜单"); 53 54 menuDrawer.setMenuView(menuTextView); 55 56 /* 57 * 《设置当我们在用滑动屏幕将菜单视图拖拽出来的过程中,菜单视图是否使用渐变动画 58 * 就像我们做的那个仿QQ侧滑视图中,当拖拽时,菜单视图的透明度和位置都是渐变的》 59 * 默认情况下是使用渐变动画的 60 * 61 * **/ 62 menuDrawer.setOffsetMenuEnabled(false); 63 64 List<String> activityItems = new ArrayList<String>(); 65 for(int i = 1 ; i < 21 ; i++){ 66 activityItems.add("Item"+i); 67 } 68 69 setListAdapter(new ArrayAdapter<String>(MainActivity.this , android.R.layout.simple_list_item_1, activityItems)); 70 71 // When running on ICS or higher, the "up" button blinks until it is clicked. 72 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 73 74 handler = new Handler() ; 75 getActionBar().setDisplayHomeAsUpEnabled(true); 76 runnable = new Runnable(){ 77 @Override 78 public void run() { 79 displayUp = !displayUp ; 80 getActionBar().setDisplayHomeAsUpEnabled(displayUp); 81 handler.postDelayed(runnable,500); 82 } 83 } ; 84 85 handler.postDelayed(runnable,500); 86 87 menuDrawer.setOnDrawerStateChangeListener(new MenuDrawer.OnDrawerStateChangeListener() { 88 @Override 89 public void onDrawerStateChange(int oldState, int newState) { 90 if (newState == MenuDrawer.STATE_OPEN) { 91 92 //只是将MessageQueue队列中的所有的runnable任务给终止,但是其他的任务不会被终止 93 handler.removeCallbacks(runnable); 94 if (!displayUp) getActionBar().setDisplayHomeAsUpEnabled(true); 95 //这部分代码写的非常值得称赞,当一个监听器不再使用的时候,我们就要将它尽快释放回收 96 menuDrawer.setOnDrawerStateChangeListener(null); 97 } 98 } 99 }); 100 101 } 102 103 } 104 105 /* 106 * 107 * 当MenuDrawer的加载模式是MENU_DRAG_CONTENT的时候,那么必须添加这个重载的方法 108 * 而且必须调用ListActivity的onContentChanged()方法,否则就崩了 109 * 反之,如果加载模式是MENU_DRAG_WINDOW的话, 110 * 那么这个重载的方法连写都不能写,否则也就崩了 111 * 112 * **/ 113 @Override 114 public void setContentView(int layoutResID) { 115 // This override is only needed when using MENU_DRAG_CONTENT. 116 menuDrawer.setContentView(layoutResID); 117 onContentChanged(); //一定要加上 118 } 119 120 @Override 121 protected void onListItemClick(ListView l, View v, int position, long id) { 122 //返回当前的ListActivity对应的Adapter,之后获取对应的字符串 123 String str = (String) getListAdapter().getItem(position); 124 Toast.makeText(MainActivity.this, "Clicked: " + str, Toast.LENGTH_SHORT).show(); 125 } 126 127 @Override 128 public void onBackPressed() { 129 final int drawerState = menuDrawer.getDrawerState(); 130 if (drawerState == MenuDrawer.STATE_OPEN || drawerState == MenuDrawer.STATE_OPENING) { 131 menuDrawer.closeMenu(); 132 return; 133 } 134 super.onBackPressed(); 135 } 136 137 @Override 138 public boolean onCreateOptionsMenu(Menu menu) { 139 // Inflate the menu; this adds items to the action bar if it is present. 140 getMenuInflater().inflate(R.menu.main, menu); 141 return true; 142 } 143 144 @Override 145 public boolean onOptionsItemSelected(MenuItem item) { 146 // Handle action bar item clicks here. The action bar will 147 // automatically handle clicks on the Home/Up button, so long 148 // as you specify a parent activity in AndroidManifest.xml. 149 int id = item.getItemId(); 150 if (id ==android.R.id.home) { 151 menuDrawer.toggleMenu(true); 152 return true; 153 } 154 return super.onOptionsItemSelected(item); 155 } 156 }

浙公网安备 33010602011771号