zoukankan      html  css  js  c++  java
  • 抽屉效果的实现(DrawerLayout和SlidingMenu的对比)

            在做谷歌电子市场的时候用的是DrawerLayout实现的抽屉效果,在新闻客户端的时候用的是开源框架SlidingMenu来实现的,总的来说,各有个的优点,侧滑(开源框架)实现的效果更好,但是DrawerLayout直接写布局文件就好了,不过我还是比较喜欢用开源框架的这个安静。下面分别来说说如何实现:

    1、SlidingMenu

     首先要引入SlidingMenu的库文件的类库,不能直接导入jar包。然后 Activity继承SlidingFragmentActivity。其次,将onCreate方法改为public。

    在主界面中添加如下代码:

    //调用api
    
    			setBehindContentView(R.layout.left_menu);// 设置侧边栏布局
    
    			SlidingMenu slidingMenu = getSlidingMenu();// 获取侧边栏对象
    			slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);// 设置全屏触摸
    	
    			slidingMenu.setSecondaryMenu(R.layout.right_menu);// 设置右侧边栏
    			slidingMenu.setMode(SlidingMenu.LEFT_RIGHT);// 设置展现模式
    	
    			slidingMenu.setBehindOffset(100);// 设置预留屏幕的宽度



    在BasePager.java中添加如下代码。

    /**
    	 * 切换SlidingMenu的状态
    	 * 
    	 * @param b
    	 */
    	protected void toggleSlidingMenu() {
    		MainActivity mainUi = (MainActivity) mActivity;
    		SlidingMenu slidingMenu = mainUi.getSlidingMenu();
    		slidingMenu.toggle();// 切换状态, 显示时隐藏, 隐藏时显示
    	}
    
    	/**
    	 * 初始化数据
    	 */
    	public void initData() {
    
    	}
    
    	/**
    	 * 设置侧边栏开启或关闭
    	 * 
    	 * @param enable
    	 */
    	public void setSlidingMenuEnable(boolean enable) {
    		MainActivity mainUi = (MainActivity) mActivity;
    
    		SlidingMenu slidingMenu = mainUi.getSlidingMenu();
    
    		if (enable) {
    			slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
    		} else {
    			slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
    		}
    	}
    每个子界面都可以用到如下的代码:

    public class SettingPager extends BasePager {
    
    	public SettingPager(Activity activity) {
    		super(activity);
    	}
    
    	@Override
    	public void initData() {
    		//System.out.println("初始化设置数据....");
    		
    		tvTitle.setText("设置");
    		btnMenu.setVisibility(View.GONE);// 隐藏菜单按钮
    		setSlidingMenuEnable(false);// 关闭侧边栏
    
    		TextView text = new TextView(mActivity);
    		text.setText("设置");
    		text.setTextColor(Color.RED);
    		text.setTextSize(25);
    		text.setGravity(Gravity.CENTER);
    
    		// 向FrameLayout中动态添加布局
    		flContent.addView(text);
    	}
    
    }




    二、DrawerLayout

    直接在布局文件中这样写:

    <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    	    xmlns:tools="http://schemas.android.com/tools"
    	    android:layout_width="match_parent"
    	    android:layout_height="match_parent"
    	    tools:context=".MainActivity" 
    	    android:id="@+id/dl">
    	
    	    <LinearLayout
    	        android:layout_width="match_parent"
    	        android:layout_height="match_parent"
    	        android:layout_centerHorizontal="true"
    	        android:layout_centerVertical="true"
    	       />
    	
    	    <FrameLayout android:layout_width="match_parent"
    	        android:layout_height="match_parent"
    	        android:background="@drawable/bg_tab"
    	        android:layout_gravity="left">
    	        
    	    </FrameLayout>
    	</android.support.v4.widget.DrawerLayout>
    然后再主页面中添加:

    控制抽屉的开关, 显示在actionBar 上面 

    public class MainActivity extends BaseActivity implements
    		OnQueryTextListener {
    	private DrawerLayout mDrawerLayout;
    	private ActionBarDrawerToggle drawerToggle;
    	private ViewPager mViewPager;
    	private PagerTabStrip pager_tab_strip;
    	private String[] tab_names;  // 标签的名字
    	@Override
    	protected void initActionBar() {
    		ActionBar actionBar = getSupportActionBar();
    		actionBar.setDisplayHomeAsUpEnabled(true);
    		actionBar.setHomeButtonEnabled(true);
    		/*
    		 *	1)显示Navigation Drawer的 Activity 对象
    			2) DrawerLayout 对象
    			3)一个用来指示Navigation Drawer的 drawable资源
    			4)一个用来描述打开Navigation Drawer的文本 (用于支持可访问性)。
    			5)一个用来描述关闭Navigation Drawer的文本(用于支持可访问性). 
    		 */
    		drawerToggle = new ActionBarDrawerToggle(this,
    				mDrawerLayout, R.drawable.ic_drawer_am, R.string.open_drawer,
    				R.string.close_drawer){
    
    					@Override
    					public void onDrawerClosed(View drawerView) {
    						super.onDrawerClosed(drawerView);
    						Toast.makeText(getApplicationContext(), "抽屉关闭了", 0).show();
    					}
    					@Override
    					public void onDrawerOpened(View drawerView) {
    						super.onDrawerOpened(drawerView);
    						Toast.makeText(getApplicationContext(), "抽屉打开了", 0).show();
    					}
    			
    		};
    		mDrawerLayout.setDrawerListener(drawerToggle);
    		//  让开关和actionbar建立关系 
    		drawerToggle.syncState();
    		
    	}
    }





  • 相关阅读:
    STL源码剖析之_allocate函数
    PAT 1018. Public Bike Management
    PAT 1016. Phone Bills
    PAT 1012. The Best Rank
    PAT 1014. Waiting in Line
    PAT 1026. Table Tennis
    PAT 1017. Queueing at Bank
    STL源码剖析之list的sort函数实现
    吃到鸡蛋好吃,看看是哪只母鸡下的蛋:好用的Sqlite3
    cJSON
  • 原文地址:https://www.cnblogs.com/sdksdk0/p/5585115.html
Copyright © 2011-2022 走看看