文档章节

SlidingPaneLayout+ActionBarDrawerToggle组合开发

IamOkay
 IamOkay
发布于 2015/04/29 16:45
字数 735
阅读 189
收藏 1

类库appcompat-support-v7库项目  (注意:请使用Android 19以下版本最佳,因为设计概念的变化,Android L版本支持不佳)

android-support-v4.jar

效果预览


主布局文件slinding_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SlidingPaneLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/sliding_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:id="@+id/sliding_list"
        android:layout_width="150dp"
        android:layout_height="match_parent"
        android:background="#111"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp" />

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="300dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />

</android.support.v4.widget.SlidingPaneLayout>

Activity逻辑文件

public class SlidingPaneLayoutActivity extends ActionBarActivity {
    private SlidingPaneLayout mSlidingPaneLayout;
    private ListView mSliderList;
    private ActionBarDrawerToggle mActionBarToggle;

    private CharSequence mDrawerTitle;
    private CharSequence mTitle;
    private String[] mPlanetTitles;

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

        //获取标题
        mTitle = mDrawerTitle = getTitle();
        //获取菜单列表
        mPlanetTitles = getResources().getStringArray(R.array.planets_array);
        //获取SlidingPaneLayout
        mSlidingPaneLayout = (SlidingPaneLayout) findViewById(R.id.sliding_layout);
        mSliderList = (ListView) findViewById(R.id.sliding_list);
        //设置背景
        mSlidingPaneLayout.setShadowDrawable(new ColorDrawable(0x99000000));
        mSliderList.setAdapter(new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, mPlanetTitles));
        mSliderList.setOnItemClickListener(new DrawerItemClickListener());
        getSupportActionBar().setHomeButtonEnabled(true);
       
        mActionBarToggle = new ActionBarDrawerToggle(
                this,                  /* host Activity */
                new DrawerLayout(this),         /* 注意,这里必须有个 DrawerLayout*/
                R.drawable.ic_toggler_home,
                R.string.slider_open,  /* "open drawer" description for accessibility */
                R.string.slider_close  /* "close drawer" description for accessibility */
                ) {
        	
        	 @Override
        	public void onDrawerClosed(View drawerView) {
        			super.onDrawerClosed(drawerView);
        			 getSupportActionBar().setTitle(mTitle);
        			 postInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        		}
        	
        	@Override
        	public boolean onOptionsItemSelected(MenuItem item) {
        		//---------------这里需要特别注意---不能再这里调用super.onOptionsItemSelected(item);
        		if(item.getItemId()==android.R.id.home)
        		{
        			if(!mSlidingPaneLayout.isOpen())
        			{
        				mSlidingPaneLayout.openPane();
        			}else{
        				
        				mSlidingPaneLayout.closePane();
        			}
        		}
        		return true;
        	}
        	
        	@Override
        	public void onDrawerOpened(View drawerView) {
        			super.onDrawerOpened(drawerView);
        		getSupportActionBar().setTitle(mDrawerTitle);
        		postInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        	}
        	
        
        };
        mSlidingPaneLayout.setPanelSlideListener(new SlidingPaneLayout.SimplePanelSlideListener(){
        	@Override
        	public void onPanelClosed(View panel) {
        		super.onPanelClosed(panel);
        		//模拟调用
        		mActionBarToggle.onDrawerClosed(panel);
        	}
        	
        	@Override
        	public void onPanelOpened(View panel) {
        		// TODO Auto-generated method stub
        		super.onPanelOpened(panel);
        		//模拟调用
        		mActionBarToggle.onDrawerOpened(panel);
        	}
        	
        	@Override
        	public void onPanelSlide(View panel, float slideOffset) {
        		super.onPanelSlide(panel, slideOffset);
        		
        		mActionBarToggle.onDrawerSlide(panel, slideOffset);
        	}
        });

        if (savedInstanceState == null) {
            selectItem(0);
        }
    }

   
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
    	getMenuInflater().inflate(R.menu.main, menu);
    	return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
    	
    	  boolean drawerOpen = mSlidingPaneLayout.isOpen();
          menu.findItem(R.id.action_search).setVisible(!drawerOpen);
      	return super.onPrepareOptionsMenu(menu);
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    	 
    	if (mActionBarToggle.onOptionsItemSelected(item))
    	 {
             return true;
         }
    	  switch(item.getItemId()) {
          case R.id.action_search:
              Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
              intent.putExtra(SearchManager.QUERY, getSupportActionBar().getTitle());
              if (intent.resolveActivity(getPackageManager()) != null) {
                  startActivity(intent);
              } else {
                  Toast.makeText(this, R.string.app_name, Toast.LENGTH_LONG).show();
              }
              return true;
          default:
              return super.onOptionsItemSelected(item);
          }
    	  
    }

    private class DrawerItemClickListener implements ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            selectItem(position);
        }
    }

    private void selectItem(int position) {
        Fragment fragment = new PlanetFragment();
        Bundle args = new Bundle();
        args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position);
        fragment.setArguments(args);
        
        getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, fragment).commit();

        mSliderList.setItemChecked(position, true);
        setTitle(mPlanetTitles[position]);
        mSlidingPaneLayout.closePane();
    }

    @Override
    public void setTitle(CharSequence title) {
        mTitle = title;
        getSupportActionBar().setTitle(mTitle);
    }


    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        mActionBarToggle.syncState();
        getSupportActionBar().setDisplayHomeAsUpEnabled(mActionBarToggle.isDrawerIndicatorEnabled());
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mActionBarToggle.onConfigurationChanged(newConfig);
        getSupportActionBar().setDisplayHomeAsUpEnabled(mActionBarToggle.isDrawerIndicatorEnabled());
    }
    
    @Override
    public void onBackPressed() {
    	if(mSlidingPaneLayout.isSlideable() && mSlidingPaneLayout.isOpen()){
    		mSlidingPaneLayout.closePane();
    	}
    	else{
    		super.onBackPressed();
    	}
    }
    
    private void postInvalidateOptionsMenu()
	{
		try {
			Method method = this.getClass().getMethod("invalidateOptionsMenu", new Class<?>[]{});
			if(method!=null)
			{
	            if (Modifier.isPublic(method.getModifiers()) &&
	                    Modifier.isPublic(method.getDeclaringClass().getModifiers())) {
	            	method.invoke(this, new Object[]{});
	            }
	            else if(!method.isAccessible())
            	{
            		method.setAccessible(true);
            		method.invoke(this, new Object[]{});
            	}
			}
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
	}
	

    /**
     * Fragment that appears in the "content_frame", shows a planet
     */
    public static class PlanetFragment extends Fragment {
        public static final String ARG_PLANET_NUMBER = "planet_number";

        public PlanetFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            int i = getArguments().getInt(ARG_PLANET_NUMBER);
            String planet = getResources().getStringArray(R.array.planets_array)[i];

            int imageId = getResources().getIdentifier("audio_identify_start_default",
                            "drawable", getActivity().getPackageName());
            ((ImageView) rootView.findViewById(R.id.section_image)).setImageResource(imageId);
            getActivity().setTitle(planet);
            return rootView;
        }
    }

fragment布局文件fragment_main.xml

<RelativeLayout 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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.actiontabbar.MainActivity$PlaceholderFragment" >

    <ImageView
        android:id="@+id/section_image"
        android:layout_width="200dip"
        android:layout_height="200dip"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="28dp"
        android:src="@drawable/abc_list_selector_background_transition_holo_light" />
    
    <TextView
        android:layout_below="@+id/section_image"
        android:id="@+id/section_label"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />


</RelativeLayout>

© 著作权归作者所有

IamOkay

IamOkay

粉丝 205
博文 483
码字总数 403228
作品 0
海淀
程序员
私信 提问
为什么阿里巴巴建议开发者谨慎使用继承?

很多人都知道,博主最近在更新一个专题——《解读阿里巴巴Java开发手册》,本文是该专题中的另外一篇。 从学习Java的第一天起,我们就知道Java是一种面向对象语言,而学习Java的第二天,我们...

HollisChuang
09/09
61
0
数字资产投资组合系统开发-区块链资产理财管理系统开发

数字资产投资组合系统(开发V信ruiec2723)同这个可能有很多人都没有听说过,但是区块链资产理财管理系统开发就有很多人听说过了。对于理财来说很多人都有发言权,因为在理财领域里面他们是高...

数字资产先生
2018/05/21
0
0
Club Med通过德比提供的产品组合的业务规则

概述 典型的Club Med产品(如B2C官网上销售),需要通过日期、人数、年龄、房型、入住天数这五个要素来确定最终的产品价格。这与传统销售酒店的方式有非常大的差异,也无法与现有的OTA渠道对...

tony2cssc
2017/07/03
0
0
RIA管理系统开发框架--iSmart JS 3.0

舒适的、简化的、友好的、全栈式的Javascript RIA开发框架 iSmartJs提供了一个完整的RIA开发的解决方案,这些解决方案使得您在进行RIA开发的过程中更加关注业务实现,使用iSmartJs可以在极大...

呆瓜
2014/07/06
1K
0
关于python的'版本选取+开发工具+扩展'的问题

我接触了python一段时间,感觉这个语言本身非常规整,但在扩展和开发上太乱了 用老版本的,有些新的特性不能用;用新版本,很多扩展库又不能用。{之前看到了一个推荐时用2.6} 还有就是开发工...

gaocheng
2010/12/18
458
4

没有更多内容

加载失败,请刷新页面

加载更多

JDBC+C3P0+DBCP 基本使用

1.概述 这篇文章主要说了JDBC的基本使用,包括Statement,PreparedStatement,JDBC的连接,Mysql创建用户创建数据表,C3P0的连接与配置,DBCP的连接与配置. 2.mysql的处理 这里的JDBC使用Mysql作为...

Blueeeeeee
23分钟前
3
0
MVC Linux下开发及部署

linux使用的是 Ubuntu 64 位 18.04.2 LTS 首先复制C:\Program Files (x86)\Embarcadero\Studio\20.0\PAServer 下 LinuxPAServer20.0.tar.gz 到 linux 目录下 运行链接编译程序 delphi环境配置......

苏兴迎
今天
9
0
3.控件及其属性

1.文本 2.按钮

横着走的螃蟹
今天
7
0
安装Genymotion模拟器慢的解决方案

第一步点击下载, C:\Users\Administrator\AppData\Local\Genymobile\genymotion.log 中搜索 ova 会发现这个文件 使用迅雷下载即可. 在 虚拟机中导入这个.ova 文件 即可安装...

chenhongjiang
今天
5
0
4. 彤哥说netty系列之Java NIO实现群聊(自己跟自己聊上瘾了)

你好,我是彤哥,本篇是netty系列的第四篇。 欢迎来我的公从号彤哥读源码系统地学习源码&架构的知识。 简介 上一章我们一起学习了Java中的BIO/NIO/AIO的故事,本章将带着大家一起使用纯纯的N...

彤哥读源码
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部