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 }

 敬请关注:http://group.cnblogs.com/27030/

posted @ 2014-12-02 15:33  RoperLee  阅读(444)  评论(0)    收藏  举报