本实践在于练习使用ActionBarDrawerToggle+DrawerLayout实现双向侧滑栏菜单布局

需要的库文件 android-v7-appcompat

所选要的jar android-support-v4.jar,android.jar

效果图

点击Home菜单 ↓-->searchview被隐藏

点击照相机 ↓-->searchview被隐藏

点击搜索 ↓

点击隐藏菜单 ↓

首先是ActionBar的菜单设计 toggle_menu.xml

    xmlns:app="http://schemas.android.com/apk/res-auto"

    xmlns:tools="http://schemas.android.com/tools"

    tools:context="com.example.actiontabbar.DrawerToggleActivity" >

    

         android:orderInCategory="100"

  android:title="@string/action_search"  

  app:actionViewClass="android.support.v7.widget.SearchView" 

  app:showAsAction="ifRoom"

 />

  

     

        android:id="@+id/action_camera"

        android:orderInCategory="100"

        android:icon="@drawable/ofm_camera_icon"

        android:title="@string/action_camera"

        app:showAsAction="ifRoom"/>

     

        android:id="@+id/action_settings"

        android:orderInCategory="100"

        android:icon="@drawable/ofm_setting_icon"

        android:title="@string/action_settings"

        app:showAsAction="never"/>

布局文件 drawertoggle_layout.xml

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:id="@+id/main_drawer_layout"

    android:orientation="vertical" >

    

    android:id="@+id/main_content"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    />

    

    android:id="@+id/main_left_menu"

    android:layout_width="200dip"

    android:layout_height="match_parent"

    android:orientation="vertical"

    android:layout_gravity="start"

    android:background="#f09001"

    />

    android:id="@+id/main_right_menu"

    android:layout_width="200dip"

    android:layout_height="match_parent"

    android:orientation="vertical"

    android:layout_gravity="end"

    android:background="#f09001"

    />

    

Activity代码

package com.example.actiontabbar;

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.lang.reflect.Modifier;

import android.content.res.Configuration;

import android.graphics.drawable.ColorDrawable;

import android.os.Bundle;

import android.support.v4.app.ActionBarDrawerToggle;

import android.support.v4.view.GravityCompat;

import android.support.v4.widget.DrawerLayout;

import android.support.v7.app.ActionBarActivity;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.view.ViewConfiguration;

import android.view.Window;

import android.widget.LinearLayout;

public class DrawerToggleActivity  extends ActionBarActivity{

private DrawerLayout mDrawerLayout;

private LinearLayout leftMenuPanel;

private LinearLayout rightMenuPanel;

private ActionBarDrawerToggle actionBarDrawerToggle;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

forceShowOverflowMenu();

setContentView(R.layout.drawertoggle_layout);

initDrawerLayout();

}

private void initDrawerLayout()

{

mDrawerLayout  = (DrawerLayout)findViewById(R.id.main_drawer_layout);

leftMenuPanel  = (LinearLayout) findViewById(R.id.main_left_menu);

rightMenuPanel = (LinearLayout) findViewById(R.id.main_right_menu);

mDrawerLayout.setScrimColor(0x000000);

mDrawerLayout.setDrawerShadow(R.drawable.goss_whitemask_drawable,GravityCompat.START);

actionBarDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.abc_ic_menu_moreoverflow_normal_holo_dark, R.string.action_toggle,R.string.action_toggle){

@Override

public boolean onOptionsItemSelected(MenuItem item) {

if (item.getItemId() == android.R.id.home) {

//actionbar上的home icon  

                    //END即gravity.right 从右向左显示   START即left  从左向右弹出显示  

mDrawerLayout.closeDrawer(rightMenuPanel);//关闭抽屉  

                    if (mDrawerLayout.isDrawerVisible(leftMenuPanel)) {  

                        mDrawerLayout.closeDrawer(leftMenuPanel);//关闭抽屉  

                    } else {  

                        mDrawerLayout.openDrawer(leftMenuPanel);//打开抽屉  

                    }  

                    return true;  

                }

else if(item.getItemId()==R.id.action_camera)

                {

mDrawerLayout.closeDrawer(leftMenuPanel);//关闭抽屉  

//END即gravity.right 从右向左显示   START即left  从左向右弹出显示  

                    if (mDrawerLayout.isDrawerVisible(rightMenuPanel)) {  

                        mDrawerLayout.closeDrawer(rightMenuPanel);//关闭抽屉  

                    } else {  

                        mDrawerLayout.openDrawer(rightMenuPanel);//打开抽屉  

                    }  

                    return true; 

                }

return super.onOptionsItemSelected(item);

}

@Override

public void onDrawerClosed(View drawerView) {

if(drawerView==leftMenuPanel)

{

super.onDrawerClosed(drawerView);

}

getSupportActionBar().setTitle(R.string.app_name);

postInvalidateOptionsMenu();

}

@Override

public void onDrawerOpened(View drawerView) {

super.onDrawerOpened(drawerView);

if(drawerView==rightMenuPanel)

{

super.onDrawerClosed(drawerView);

}

getSupportActionBar().setTitle(R.string.action_toggle);

postInvalidateOptionsMenu();

}

@Override

public void onDrawerSlide(View drawerView, float slideOffset) {

super.onDrawerSlide(drawerView, slideOffset);

if(drawerView==rightMenuPanel)

{

super.onDrawerClosed(drawerView);

}

}

@Override

public void onDrawerStateChanged(int newState) {

super.onDrawerStateChanged(newState);

}

};

getSupportActionBar().setDisplayHomeAsUpEnabled(true);//给home icon的左边加上一个返回的图标  

getSupportActionBar().setIcon(new ColorDrawable(0x00ffffff));

 

mDrawerLayout.setDrawerListener(actionBarDrawerToggle);

actionBarDrawerToggle.setDrawerIndicatorEnabled(true);

}

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();

}

}

private void forceShowOverflowMenu() {

try {

ViewConfiguration config = ViewConfiguration.get(this);

Field menuKeyField = ViewConfiguration.class

.getDeclaredField("sHasPermanentMenuKey");

if (menuKeyField != null) {

menuKeyField.setAccessible(true);

menuKeyField.setBoolean(config, false);

}

} catch (Exception e) {

e.printStackTrace();

}

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.toggle_menu, menu);

return true;

}

 @Override  

 public boolean onPrepareOptionsMenu(Menu menu) {  

        // If the nav drawer is open, hide action items related to the content view  

        boolean drawerOpen = mDrawerLayout.isDrawerOpen(leftMenuPanel) || mDrawerLayout.isDrawerOpen(rightMenuPanel);  

        menu.findItem(R.id.action_search).setVisible(!drawerOpen);//search的显示与drawer的显示相反  

        return super.onPrepareOptionsMenu(menu);  

  }  

@Override

public boolean onOptionsItemSelected(MenuItem item) {

    if (actionBarDrawerToggle.onOptionsItemSelected(item))

        {

            return true;

        }

return super.onOptionsItemSelected(item);

}

@Override

public boolean onMenuOpened(int featureId, Menu menu) 

{

if (featureId == Window.FEATURE_ACTION_BAR && menu != null) {

if (menu.getClass().getSimpleName().equals("MenuBuilder")) {

try {

Method m = menu.getClass().getDeclaredMethod(

"setOptionalIconsVisible", Boolean.TYPE);

m.setAccessible(true);

m.invoke(menu, true);

} catch (Exception e) {

}

}

}

return super.onMenuOpened(featureId, menu);

}

@Override  

    protected void onPostCreate(Bundle savedInstanceState) {  

        super.onPostCreate(savedInstanceState);  

        actionBarDrawerToggle.syncState();  

    }  

 @Override  

 public void onConfigurationChanged(Configuration newConfig) {  

        super.onConfigurationChanged(newConfig);  

        actionBarDrawerToggle.onConfigurationChanged(newConfig);  

 }  

}

参考文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: