android 抽屉菜单

总结下抽屉的使用,记录使用方法,方便以后查看
使用SlidingMenu
SlidingMenu是一个开源的侧滑菜单(https://github.com/jfeinstein10/SlidingMenu)。 为大家的安卓程序提供侧滑菜单,这个功能也非常有用。
下载项目到本地放到项目中,然后添加到项目中进行依赖

 SlidingMenu样式的抽屉,主要使用了MainActivity(1,2,3)这三个类来实现,其中第三个主页为ViewPager,左右抽屉使用FrameLayout进行加载,左抽屉在Fragment中实现点击之后关闭抽屉   

代码如下:

方法一:
MainActivity.class

public class MainActivity extends Activity {

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

        slidingMenu = new SlidingMenu(this);
        slidingMenu.setMode(SlidingMenu.LEFT);
        // 设置侧滑栏完全展开之后,距离另外一边的距离,单位px,设置的越大,侧滑栏的宽度越小
        slidingMenu.setBehindOffsetRes(R.dimen.sliding_menu_offset);
        // 设置触摸模式,可以选择全屏划出,或者是边缘划出,或者是不可划出
        slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
        slidingMenu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
        // 设置阴影的宽度
        slidingMenu.setShadowWidth(0);
        // 设置阴影的颜色
        slidingMenu.setShadowDrawable(R.color.abs__background_holo_dark);
        // 设置侧滑栏完全展开之后,距离另外一边的距离,单位px,设置的越大,侧滑栏的宽度越小
        slidingMenu.setBehindOffset(100);
        // 设置渐变的程度,范围是0-1.0f,设置的越大,则在侧滑栏刚划出的时候,颜色就越暗。1.0f的时候,颜色为全黑
        slidingMenu.setFadeDegree(0f);
        //设置侧滑剩余的位置添加阴影淡入淡出
        slidingMenu.setOffsetFadeDegree(0.5f);
        slidingMenu.setMenu(R.layout.slidingmenu);

    }


    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        Log.d("CARLOZ", "keyCode = " + keyCode);
        switch (keyCode) {
        case KeyEvent.KEYCODE_MENU:
            slidingMenu.toggle(true);
            break;
        default:
            break;
        }
        return super.onKeyDown(keyCode, event);
    }

    private SlidingMenu slidingMenu;
}

方法二:
MainActivity2.class

//将SlidingMenu当作普通控件
public class MainActivity2 extends Activity {

    private SlidingMenu mLeftMenu;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        mLeftMenu = (SlidingMenu) findViewById(R.id.sliding_main2);  
        // configure the SlidingMenu  
        // SlidingMenu menu = new SlidingMenu(this);  
        mLeftMenu.setMode(SlidingMenu.LEFT);  
        // 设置触摸屏幕的模式  
     // 设置阴影的宽度
        mLeftMenu.setShadowWidth(0);
     // 设置侧滑栏完全展开之后,距离另外一边的距离,单位px,设置的越大,侧滑栏的宽度越小
        mLeftMenu.setBehindOffset(100);
            // 设置渐变的程度,范围是0-1.0f,设置的越大,则在侧滑栏刚划出的时候,颜色就越暗。1.0f的时候,颜色为全黑
        mLeftMenu.setFadeDegree(0f);
            //设置侧滑剩余的位置添加阴影淡入淡出
        mLeftMenu.setOffsetFadeDegree(0.5f);
        mLeftMenu.setShadowWidthRes(R.dimen.sliding_menu_offset);  
//        mLeftMenu.setShadowDrawable(R.color.abs__background_holo_dark);  

        mLeftMenu.setMenu(R.layout.slidingmenu);  

        mLeftMenu.setOnClickListener(new OnClickListener()  
        {  
            @Override  
            public void onClick(View v)  
            {  
                if (mLeftMenu.isMenuShowing())  
                    mLeftMenu.toggle();  
            }  
        }); 

    }

}

方法三:

public class MainActivity3 extends SlidingFragmentActivity{

    private ViewPager viewpager;
     private FragmentPagerAdapter mAdapter;
     private List<Fragment> fList;
    private SlidingMenu menu;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);
        viewpager=(ViewPager) findViewById(R.id.viewpager);
        fList=new ArrayList<Fragment>();
        MainFragment1 fragment1=new MainFragment1();
        MainFragment1 fragment2=new MainFragment1();
        MainFragment1 fragment3=new MainFragment1();
        fList.add(fragment1);
        fList.add(fragment2);
        fList.add(fragment3);
        mAdapter=new SligingFragmentAdapter(getSupportFragmentManager(), fList);
        viewpager.setAdapter(mAdapter);

        //重点来了   左边的抽屉哦
        MainFragment2 mFragment1=new MainFragment2();
        setBehindContentView(R.layout.fragment_left);
        getSupportFragmentManager().beginTransaction().replace(R.id.frament_left, mFragment1).commit();

        menu = getSlidingMenu();
        //设置侧滑菜单的位置,可选值LEFT , RIGHT , LEFT_RIGHT (两边都有菜单时设置)
        menu.setMode(SlidingMenu.LEFT_RIGHT);
        // 设置触摸屏幕的模式
        // 设置触摸屏幕的模式,可选只MARGIN , CONTENT  //全屏支持触摸拖拉
        menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_MARGIN);
        menu.setShadowWidthRes(R.dimen.sliding_menu_offset);
        //滑动显示的背景颜色
//      menu.setShadowDrawable(android.R.color.black);
        // 设置滑动菜单视图的宽度
        menu.setBehindOffsetRes(R.dimen.sliding_menu_offset);
        // 设置渐入渐出效果的值
        menu.setFadeDegree(0.35f);
        //设置侧滑剩余的位置添加阴影淡入淡出
        menu.setOffsetFadeDegree(0.5f);
        //设置SlidingMenu与下方视图的移动的速度比,当为1时同时移动,取值0-1
         menu.setBehindScrollScale(1.0f);
        //滑动显示的背景颜色
//      menu.setSecondaryShadowDrawable(android.R.color.black);
        menu.setBehindScrollScale(0f);
        //设置actionBar能否跟随侧滑栏移动,如果没有,则可以去掉
        setSlidingActionBarEnabled(false);
        mFragment1.setMent(menu);//关闭左侧抽屉
        //设置右边(二级)侧滑菜单
        menu.setSecondaryMenu(R.layout.fragment_right);
        Fragment rightMenuFragment = new MainFragment1();
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.frament_right, rightMenuFragment).commit();
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        //重写了Menu监听,实现按下手机Menu键弹出和关闭侧滑菜单
        if(keyCode==KeyEvent.KEYCODE_MENU){
            menu.toggle();
        }
        return super.onKeyDown(keyCode, event);
    }

    public SlidingMenu SlidingMenuType(){
        return menu;
    }

}

SlidingMenu使用完毕,如此简单

使用Google自带的Drawerlayout实现

GoogleDrawerlayoutMain.class

public class GoogleDrawerlayoutMain extends FragmentActivity{

    private FrameLayout frameLayout;
    private DrawerLayout drawer;
    private MainFragment1 frament_left;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.google_drawer);
        drawer= (DrawerLayout) findViewById(R.id.drawer);
        Toast.makeText(this,"什么情况",Toast.LENGTH_SHORT).show();
        frameLayout= (FrameLayout) findViewById(R.id.google_fl);
        Fragment fragment=new MainFragment1();
        getSupportFragmentManager().beginTransaction().replace(R.id.google_fl,fragment).commit();
        //这种写法适用于FrameLayout 以指定Fragment
        frament_left=(MainFragment1)getSupportFragmentManager().findFragmentById(R.id.frament_left);
        frament_left.setDrawer(drawer);//设置关闭抽屉
    }
}

SligingFragmentAdapter.class

public class SligingFragmentAdapter extends FragmentPagerAdapter{

    private List<Fragment> fList;
    public SligingFragmentAdapter(FragmentManager fm,List<Fragment> fList) {
        super(fm);
        this.fList=fList;

    }

    @Override
    public Fragment getItem(int arg0) {
        Bundle bundle = new Bundle();
        bundle.putInt("q",arg0);
        Fragment fragment=new Fragment();
        fragment.setArguments(bundle);

        return fList.get(arg0);
    }

    @Override
    public int getCount() {
        return fList==null?0:fList.size();
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        return super.instantiateItem(container, position);
    }

    @Override
    public int getItemPosition(Object object) {
        //用以返回给定对象的位置,如果该函数不被重载,则会一直返回 POSITION_UNCHANGED,
        // 从而导致 ViewPager.dataSetChanged() 被调用时,
        // 认为不必触发 PagerAdapter.instantiateItem()。很多人因为没有重载该函数,而导致调用
        //PagerAdapter.notifyDataSetChanged() 后,什么都没有发生。
        return POSITION_NONE;
    }
}

MainFragment1.class

public class MainFragment1 extends Fragment{
    private DrawerLayout drawer;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.activity_main, null);
        view.findViewById(R.id.text).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getActivity(),"点击没有啊",Toast.LENGTH_SHORT).show();
                Intent intent=new Intent(getContext(),GoogleDrawerlayoutMain.class);
                startActivity(intent);
                if (drawer!=null){
                    drawer.closeDrawer(Gravity.START);
                }
            }
        });
        return view;
    }
    public void setDrawer(DrawerLayout drawer){
        this.drawer=drawer;
    }

}

MainFragment2.class

public class MainFragment2 extends Fragment{
    SlidingMenu menu;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view=inflater.inflate(R.layout.activity_main, null);
        view.findViewById(R.id.text).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getActivity(),"什么情况点击没有啊",Toast.LENGTH_SHORT).show();
                Intent intent=new Intent(getContext(),GoogleDrawerlayoutMain.class);
                startActivity(intent);

                menu.toggle();
            }
        });
        return view;
    }
    public void setMent(SlidingMenu menu){
        this.menu=menu;

    }

}

好了全部完成

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值