菜单文件
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.actiontabbar.DrawerToggleActivity" > <item android:id="@+id/action_search" android:orderInCategory="100" android:title="@string/action_search" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="ifRoom" /> <item android:id="@+id/action_menus" android:orderInCategory="100" android:icon="@drawable/fm_list_item_program_icon" android:title="@string/action_camera" app:showAsAction="ifRoom"/> <item android:id="@+id/action_camera" android:orderInCategory="100" android:icon="@drawable/ofm_camera_icon" android:title="@string/action_camera" app:showAsAction="never"/> <item android:id="@+id/action_settings" android:orderInCategory="100" android:icon="@drawable/ofm_setting_icon" android:title="@string/action_settings" app:showAsAction="never"/> </menu>
布局文件
<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main_drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/transparent" > <RelativeLayout android:id="@+id/main_content_frame_parent" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/transparent" > <!-- 下层显示的主要内容 --> <Button android:id="@+id/id_left_openBtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginTop="35dp" android:text="Left Menu" /> <Button android:id="@+id/id_right_openBtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/id_left_openBtn" android:layout_marginTop="17dp" android:text="Right Menu" /> </RelativeLayout> <!-- 左侧滑动栏 --> <RelativeLayout android:id="@+id/main_left_drawer_layout" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="#33000000" android:focusable="true" android:focusableInTouchMode="true" android:paddingTop="50dp" > </RelativeLayout> <!-- 右侧滑动栏 --> <RelativeLayout android:id="@+id/main_right_drawer_layout" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="end" android:background="#33000000" android:focusable="true" android:focusableInTouchMode="true" android:paddingTop="50dp" > </RelativeLayout> </android.support.v4.widget.DrawerLayout>
代码文件
public class DoubleDrawLayout extends Activity implements OnClickListener, OnTouchListener { private Button mLeftMenuBtn; private Button mRightMenuBtn; private DrawerLayout mDrawerLayout; private RelativeLayout leftMenulayout; private RelativeLayout rightMessagelayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.double_drawerlayout); mLeftMenuBtn = (Button)findViewById(R.id.id_left_openBtn); mRightMenuBtn = (Button)findViewById(R.id.id_right_openBtn); mDrawerLayout = (DrawerLayout)findViewById(R.id.main_drawer_layout); mDrawerLayout.setScrimColor(0x00000000); initEvent(); initLeftLayout(); initRightLayout(); mLeftMenuBtn.setOnClickListener(this); mRightMenuBtn.setOnClickListener(this); leftMenulayout.setOnTouchListener(this); rightMessagelayout.setOnTouchListener(this); } public void initLeftLayout(){ //设置透明 //左边菜单 leftMenulayout = (RelativeLayout) findViewById(R.id.main_left_drawer_layout); View view2 = getLayoutInflater().inflate(android.R.layout.simple_list_item_1, null); TextView tv = (TextView)view2.findViewById(android.R.id.text1); tv.setText("左边测试菜单"); leftMenulayout.addView(view2); tv.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Toast.makeText(DoubleDrawLayout.this, "Left", Toast.LENGTH_SHORT).show(); } }); } public void initRightLayout(){ //左边菜单 rightMessagelayout = (RelativeLayout) findViewById(R.id.main_right_drawer_layout); View view = getLayoutInflater().inflate(android.R.layout.simple_list_item_1, null); TextView tv = (TextView)view.findViewById(android.R.id.text1); tv.setText("右边测试菜单"); rightMessagelayout.addView(view); tv.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Toast.makeText(DoubleDrawLayout.this, "Right", Toast.LENGTH_SHORT).show(); } }); } private void initEvent() { mDrawerLayout.setDrawerListener(new DrawerListener() { @Override public void onDrawerStateChanged(int arg0) { // TODO Auto-generated method stub } @Override public void onDrawerSlide(View arg0, float arg1) { } @Override public void onDrawerOpened(View arg0) { // TODO Auto-generated method stub } @Override public void onDrawerClosed(View arg0) { // TODO Auto-generated method stub } }); } //左边菜单开关事件 public void openLeftLayout() { if (mDrawerLayout.isDrawerOpen(leftMenulayout)) { mDrawerLayout.closeDrawer(leftMenulayout); } else { mDrawerLayout.openDrawer(leftMenulayout); } } // 右边菜单开关事件 public void openRightLayout() { if (mDrawerLayout.isDrawerOpen(rightMessagelayout)) { mDrawerLayout.closeDrawer(rightMessagelayout); } else { mDrawerLayout.openDrawer(rightMessagelayout); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.id_left_openBtn: openLeftLayout(); break; case R.id.id_right_openBtn: openRightLayout(); break; default: break; } } @Override public boolean onTouch(View arg0, MotionEvent arg1) { // TODO Auto-generated method stub return true;//阻止事件多重分发 } }
-----------------------------------------2015-05-05日更新,实现左右可滑动单面板----------------------------------------------------
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" /> <ListView android:id="@+id/left_drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="left" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" android:background="#111"/> </android.support.v4.widget.DrawerLayout>
public class DrawerActivity extends ActionBarActivity { private DrawerLayout mDrawerLayout; private ListView mDrawerList; private ActionBarDrawerToggle mDrawerToggle; private CharSequence mDrawerTitle; private CharSequence mTitle; private String[] mPlanetTitles; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.line_linearlayout); mTitle = mDrawerTitle = getTitle(); mPlanetTitles = getResources().getStringArray(R.array.planets_array); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); mDrawerList = (ListView) findViewById(R.id.left_drawer);//抽屉里的view // set a custom shadow that overlays the main content when the drawer opens mDrawerLayout.setDrawerShadow(new ColorDrawable(0x99f20000), GravityCompat.START); // set up the drawer's list view with items and click listener mDrawerList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1, mPlanetTitles)); mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); // mDrawerLayout.setScrimColor(0x9901f201); // enable ActionBar app icon to behave as action to toggle nav drawer 需要api level 11 getSupportActionBar().setDisplayHomeAsUpEnabled(true);//给home icon的左边加上一个返回的图标 getSupportActionBar().setHomeButtonEnabled(true); //需要api level 14 使用home-icon 可点击 // ActionBarDrawerToggle ties together the the proper interactions // between the sliding drawer and the action bar app icon mDrawerToggle = new ActionBarDrawerToggle(//v4控件 actionbar上的抽屉开关 this, /* host Activity */ mDrawerLayout, /* DrawerLayout object */ R.drawable.comm_ic_main_top_menu, /* nav drawer image to replace 'Up' caret */ //上一级图标 返回图标 R.string.slider_open, /* "open drawer" description for accessibility */ R.string.slider_close /* "close drawer" description for accessibility */ ) { @SuppressLint("NewApi") public void onDrawerClosed(View view) {//抽屉关闭后 getSupportActionBar().setTitle(mDrawerTitle); invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } @SuppressLint("NewApi") public void onDrawerOpened(View drawerView) {//抽屉打开后 getSupportActionBar().setTitle(mTitle); invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() } @Override public boolean onOptionsItemSelected(MenuItem item) { if ( item.getItemId() == android.R.id.home) {//actionbar上的home icon LayoutParams lp = (LayoutParams) mDrawerList.getLayoutParams(); if(lp.gravity!=GravityCompat.START) { lp.gravity = GravityCompat.START; mDrawerList.setLayoutParams(lp); } if (mDrawerLayout.isDrawerVisible(GravityCompat.START)) { mDrawerLayout.closeDrawer(GravityCompat.START);//关闭抽屉 } else { mDrawerLayout.openDrawer(GravityCompat.START);//打开抽屉 } return true; } else if(item.getItemId()==R.id.action_menus) { //END即gravity.right 从右向左显示 START即left 从左向右弹出显示 LayoutParams lp = (LayoutParams) mDrawerList.getLayoutParams(); if(lp.gravity!=GravityCompat.END) { lp.gravity = GravityCompat.END; mDrawerList.setLayoutParams(lp); } if (mDrawerLayout.isDrawerVisible(GravityCompat.END)) { mDrawerLayout.closeDrawer(GravityCompat.END);//关闭抽屉 } else { mDrawerLayout.openDrawer(GravityCompat.END);//打开抽屉 } return true; } return false; } }; mDrawerLayout.setDrawerListener(mDrawerToggle);//设置抽屉监听 if (savedInstanceState == null) { // selectItem(0); } } @Override public boolean onCreateOptionsMenu(Menu menu) {//加载menu sdk3.0以后menu包含在actionbar中 MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.toggle_menu, menu); return super.onCreateOptionsMenu(menu); } /* Called whenever we call invalidateOptionsMenu() */ @Override public boolean onPrepareOptionsMenu(Menu menu) { // If the nav drawer is open, hide action items related to the content view boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList); menu.findItem(R.id.action_search).setVisible(!drawerOpen);//search的显示与drawer的显示相反 return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { // The action bar home/up action should open or close the drawer. // ActionBarDrawerToggle will take care of this. if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } // Handle action buttons switch(item.getItemId()) { case R.id.action_search: // create intent to perform web search for this planet Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); intent.putExtra(SearchManager.QUERY, getSupportActionBar().getTitle()); // catch event that there's no activity to handle intent if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } else { Toast.makeText(this, "invalide", Toast.LENGTH_LONG).show(); } return true; default: return super.onOptionsItemSelected(item); } } /* The click listner for ListView in the navigation drawer */ private class DrawerItemClickListener implements ListView.OnItemClickListener { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { selectItem(position); } } //内容区显示PlanetFragment private void selectItem(int position) { // update the main content by replacing fragments Fragment fragment = new PlanetFragment(); Bundle args = new Bundle(); args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position); fragment.setArguments(args); FragmentManager fragmentManager = getSupportFragmentManager(); fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit(); // update selected item and title, then close the drawer // mDrawerList.setItemChecked(position, true); // setTitle(mPlanetTitles[position]); mDrawerLayout.closeDrawer(mDrawerList); } @Override public void setTitle(CharSequence title) { mDrawerTitle = title; getSupportActionBar().setTitle(mDrawerTitle); } /** * When using the ActionBarDrawerToggle, you must call it during * onPostCreate() and onConfigurationChanged()... */ @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Sync the toggle state after onRestoreInstanceState has occurred. mDrawerToggle.syncState(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // Pass any configuration change to the drawer toggls mDrawerToggle.onConfigurationChanged(newConfig); } /** * 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() { // Empty constructor required for fragment subclasses } @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]; //查找出 res-drawable资源的id int imageId = getResources().getIdentifier(planet.toLowerCase(Locale.getDefault()), "drawable", getActivity().getPackageName()); ((ImageView) rootView.findViewById(R.id.section_image)).setImageResource(imageId); getActivity().setTitle(planet); return rootView; } } }