事实上,有一种方法可以做到这一点。即使没有实施自己的ActionBar。
看看hierachyviewer吧!(位于工具目录中)
还有的DecorView,并且LinearLayout作为一个孩子。这LinearLayout包含ActionBar其他内容和其他内容。所以,你可以简单地应用一些FrameLayout.LayoutParams,LinearLayout并以这种方式在左侧获得一些空间。然后,您可以使用菜单ListView填充此空间,并使用FrameLayout覆盖其他内容,当单击它时,折叠菜单。所以,这里有一些代码:
首先,折叠/扩展类(SlideMenu.java):package your.cool.app;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.graphics.Rect;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.view.Window;import android.view.animation.TranslateAnimation;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ArrayAdapter;import android.widget.FrameLayout;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.TextView;public class SlideMenu {//just a simple adapterpublic static class SlideMenuAdapter extends ArrayAdapter {
Activity act;
SlideMenu.SlideMenuAdapter.MenuDesc[] items;
class MenuItem {
public TextView label;
public ImageView icon;
}
static class MenuDesc {
public int icon;
public String label;
}
public SlideMenuAdapter(Activity act, SlideMenu.SlideMenuAdapter.MenuDesc[] items) {
super(act, R.id.menu_label, items);
this.act = act;
this.items = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
if (rowView == null) {
LayoutInflater inflater = act.getLayoutInflater();
rowView = inflater.inflate(R.layout.menu_listitem, null);
MenuItem viewHolder = new MenuItem();
viewHolder.label = (TextView) rowView.findViewById(R.id.menu_label);
viewHolder.icon = (ImageView) rowView.findViewById(R.id.menu_icon);
rowView.setTag(viewHolder);
}
MenuItem holder = (MenuItem) rowView.getTag();
String s = items[position].label;
holder.label.setText(s);
holder.icon.setImageResource(items[position].icon);
return rowView;
}}private static boolean menuShown = false;private static View menu;private static LinearLayout content;private static FrameLayout parent;private static int menuSize;private static int statusHeight = 0;private Activity act;SlideMenu(Activity act) {
this.act = act;}//call this in your onCreate() for screen rotationpublic void checkEnabled() {
if(menuShown)
this.show(false);}public void show() {//get the height of the status bar
if(statusHeight == 0) {
Rect rectgle = new Rect();
Window window = act.getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
statusHeight = rectgle.top;
}
this.show(true);}public void show(boolean animate) {
menuSize = Functions.dpToPx(250, act);
content = ((LinearLayout) act.findViewById(android.R.id.content).getParent());
FrameLayout.LayoutParams parm = (FrameLayout.LayoutParams) content.getLayoutParams();
parm.setMargins(menuSize, 0, -menuSize, 0);
content.setLayoutParams(parm);//animation for smooth slide-out
TranslateAnimation ta = new TranslateAnimation(-menuSize, 0, 0, 0);
ta.setDuration(500);
if(animate)
content.startAnimation(ta);
parent = (FrameLayout) content.getParent();
LayoutInflater inflater = (LayoutInflater) act.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
menu = inflater.inflate(R.layout.menu, null);
FrameLayout.LayoutParams lays = new FrameLayout.LayoutParams(-1, -1, 3);
lays.setMargins(0,statusHeight, 0, 0);
menu.setLayoutParams(lays);
parent.addView(menu);
ListView list = (ListView) act.findViewById(R.id.menu_listview);
list.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
//handle your menu-click
}
});
if(animate)
menu.startAnimation(ta);
menu.findViewById(R.id.overlay).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
SlideMenu.this.hide();
}
});
Functions.enableDisableViewGroup((LinearLayout) parent.findViewById(android.R.id.content).getParent(), false);
((ExtendedViewPager) act.findViewById(R.id.viewpager)).setPagingEnabled(false);
((ExtendedPagerTabStrip) act.findViewById(R.id.viewpager_tabs)).setNavEnabled(false);
menuShown = true;
this.fill();}public void fill() {
ListView list = (ListView) act.findViewById(R.id.menu_listview);
SlideMenuAdapter.MenuDesc[] items = new SlideMenuAdapter.MenuDesc[5];
//fill the menu-items here
SlideMenuAdapter adap = new SlideMenuAdapter(act, items);
list.setAdapter(adap);}public void hide() {
TranslateAnimation ta = new TranslateAnimation(0, -menuSize, 0, 0);
ta.setDuration(500);
menu.startAnimation(ta);
parent.removeView(menu);
TranslateAnimation tra = new TranslateAnimation(menuSize, 0, 0, 0);
tra.setDuration(500);
content.startAnimation(tra);
FrameLayout.LayoutParams parm = (FrameLayout.LayoutParams) content.getLayoutParams();
parm.setMargins(0, 0, 0, 0);
content.setLayoutParams(parm);
Functions.enableDisableViewGroup((LinearLayout) parent.findViewById(android.R.id.content).getParent(), true);
((ExtendedViewPager) act.findViewById(R.id.viewpager)).setPagingEnabled(true);
((ExtendedPagerTabStrip) act.findViewById(R.id.viewpager_tabs)).setNavEnabled(true);
menuShown = false;}}
一些帮助方法(对我来说,在静态Functions.java中):public static int dpToPx(int dp, Context ctx) {
Resources r = ctx.getResources();
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.getDisplayMetrics());}//originally: http://stackoverflow.com/questions/5418510/disable-the-touch-events-for-all-the-views//modified for the needs herepublic static void enableDisableViewGroup(ViewGroup viewGroup, boolean enabled) {
int childCount = viewGroup.getChildCount();
for (int i = 0; i
View view = viewGroup.getChildAt(i);
if(view.isFocusable())
view.setEnabled(enabled);
if (view instanceof ViewGroup) {
enableDisableViewGroup((ViewGroup) view, enabled);
} else if (view instanceof ListView) {
if(view.isFocusable())
view.setEnabled(enabled);
ListView listView = (ListView) view;
int listChildCount = listView.getChildCount();
for (int j = 0; j
if(view.isFocusable())
listView.getChildAt(j).setEnabled(false);
}
}
}
}
然后,布局:
菜单布局(res / layout / menu.xml)
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
android:orientation="vertical"
android:layout_height="fill_parent"
android:layout_width="250dip"
android:background="@color/darkblack">
android:id="@+id/menu_listview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:divider="@color/dividerblack"
android:dividerHeight="2dip" />
android:id="@+id/overlay"
android:layout_width="match_parent"
android:layout_height="match_parent" >
listitems的布局(res / layout / menu_listitem.xml):
android:id="@+id/menu_icon"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginRight="5dip"
android:layout_marginLeft="10dip"
android:layout_marginTop="10dip"
android:layout_marginBottom="10dip" />
android:id="@+id/menu_label"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@color/white"
android:textSize="24dp"
android:layout_marginTop="10dip"
android:layout_marginBottom="10dip" />
如何使用它:
在你的onCreate():private SlideMenu slidemenu;@Overridepublic void onCreate(Bundle savedInstanceState) {
//your onCreate code
slidemenu = new SlideMenu(this);
slidemenu.checkEnabled();}
在ActionBar homebutton的处理程序中:slidemenu.show();
而已!
现在,它的一些屏幕截图:
据我所知,它正在发挥作用。如果您遇到任何问题或我的解释不明确,请与我联系!
编辑:ExtendedViewPager&ExtendedPagerStrip:
ExtendedViewPager:package your.cool.app;//source: http://blog.svpino.com/2011/08/disabling-pagingswiping-on-android.htmlimport android.content.Context;import android.support.v4.view.ViewPager;import android.util.AttributeSet;import android.view.MotionEvent;public class ExtendedViewPager extends ViewPager {private boolean enabled;public ExtendedViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
this.enabled = true;}@Overridepublic boolean onTouchEvent(MotionEvent event) {
if (this.enabled) {
return super.onTouchEvent(event);
}
return false;}@Overridepublic boolean onInterceptTouchEvent(MotionEvent event) {
if (this.enabled) {
return super.onInterceptTouchEvent(event);
}
return false;}public void setPagingEnabled(boolean enabled) {
this.enabled = enabled;}}
ExtendedPagerTabStrip:package your.cool.app;//source: http://blog.svpino.com/2011/08/disabling-pagingswiping-on-android.htmlimport android.content.Context;import android.support.v4.view.PagerTabStrip;import android.util.AttributeSet;import android.view.MotionEvent;public class ExtendedPagerTabStrip extends PagerTabStrip {private boolean enabled;public ExtendedPagerTabStrip(Context context, AttributeSet attrs) {
super(context, attrs);
this.enabled = true;}@Overridepublic boolean onTouchEvent(MotionEvent event) {
if (this.enabled) {
return super.onTouchEvent(event);
}
return false;}@Overridepublic boolean onInterceptTouchEvent(MotionEvent event) {
if (this.enabled) {
return super.onInterceptTouchEvent(event);
}
return false;}public void setNavEnabled(boolean enabled) {
this.enabled = enabled;}}
我将它SlideMenu用于一个ViewPager带有PagerTabStripfor,如Talk,Market等标签的Activity 。你不能以一种简单的方式禁用这些视图,所以上面的两个类只是扩展它们以onTouch在禁用时停止事件。