在介绍SlidingMenu的应用步骤之前,先简单说一下SlidingMenu的含义和重要性,SlidingMenu是一个侧滑菜单,在很多APP上都可以看到它的体现,对用户的体验也有很好的效果,所以作为安卓工程师来说能够熟练应用它也是很必要的。可是在SlidingMenu的应用中,对应初学者来说有一个难以接受,也是容易忘记的事,我们是直接根据Google的一个工程师开发好的工具来拿过来使用,在这个过程中,前提是要关联一个SlidingMenu的库,为什么要关联这个库呢?因为我们所要开发的新项目是依赖这个库中的,如果不关联的话就会出现编译错误。
(4)进行java逻辑的编辑
下面写一个简单的demo,向左侧滑的
先描述一下情景:先是有一个main布局:main布局是一个空白的充满屏幕的帧布局
然后向左侧滑出现一个menu布局:menu布局其实就是一个空白的宽度为offsetres_width即180dp,高度与屏幕高度一致的在滑动过程中具有了阴影效果的矩形
其次就是用一个ListView去替换menu布局,所以就出现了5个呈垂直的fragment文字作为listview的条目
,在ListView的条目的点击事件中每点击一个条目就会有相应的Fragment去替换main布局,替换的每一个Fragment中其实就是一个显示简单类名的文本
实现的步骤如下:
(3)MenuFragment的逻辑
还有五个Fragment的类,里面没有做任何处理。
SlidingMenu的应用步骤:
(1)先导入SlidingMenu的库(Library)(在导库之前还应导入ActionBarSherlock,使库与之关联)
在GitHub中下载的地址:https://github.com/JakeWharton/ActionBarSherlock
https://github.com/jfeinstein10/SlidingMenu
(导入库的步骤:右击eclipse左侧空白处选择Import,后面的步骤与导入项目的步骤一致)
(2)新建一个项目,在项目属性中添加入SlidingMenu的Library,库和文件必须在同一个工作区间
(添加库的步骤:选中项目右击,选中Properties——>Add——>选中哭ming,点击OK即可)
(4)进行java逻辑的编辑
下面写一个简单的demo,向左侧滑的
先描述一下情景:先是有一个main布局:main布局是一个空白的充满屏幕的帧布局
然后向左侧滑出现一个menu布局:menu布局其实就是一个空白的宽度为offsetres_width即180dp,高度与屏幕高度一致的在滑动过程中具有了阴影效果的矩形
其次就是用一个ListView去替换menu布局,所以就出现了5个呈垂直的fragment文字作为listview的条目
,在ListView的条目的点击事件中每点击一个条目就会有相应的Fragment去替换main布局,替换的每一个Fragment中其实就是一个显示简单类名的文本
实现的步骤如下:
(1)项目结构图如下:
(2)在MainActivity中编写逻辑,这里对SlidingMenu的属性做了详细的注释,所以不再赘述
<span style="font-family:SimSun;font-size:18px;">public class MainActivity extends SlidingFragmentActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
initSlidingMenu();
}
private void initSlidingMenu() {
//加载向左侧滑的布局,其实就是一个帧布局
setBehindContentView(R.layout.activity_menu);
SlidingMenu slidingMenu = getSlidingMenu();
//设置侧滑的方式,一个有三种方式可选:Left,Right,Left_Right
slidingMenu.setMode(SlidingMenu.LEFT);
//设置SlidingMenu离屏幕的偏移量,即slidingMenu的宽度
slidingMenu.setBehindOffsetRes(R.dimen.offsetres_width);
//根据资源文件ID来设置滑动菜单 的阴影效果
slidingMenu.setShadowDrawable(R.drawable.shadow);
//根据dimension资源文件的ID设置分割线的宽度,这里的宽度是一个具体的长度值
slidingMenu.setShadowWidthRes(R.dimen.shadow_width);
//设置触摸屏幕的方式,有三种方式:TOUCHMODE_FULLSCREEN,TOUCHMODE_MARGIN,TOUCHMODE_NONE
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
//加载二级菜单的布局
slidingMenu.setSecondaryMenu(R.layout.menu_right);
//设置二级菜单的阴影效果
slidingMenu.setSecondaryShadowDrawable(R.drawable.shadow);
//新建一个fragment替换
MenuFragment menuFragment = new MenuFragment();
// ListView 替换这个布局
getSupportFragmentManager().beginTransaction()
.replace(R.id.menu, menuFragment, "MENU").commit();
}
//一个自定义的切换fragment的方法
public void switchFragment(Fragment fragment) {
if (fragment != null) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.main, fragment, "HOME").commit();
}
}
}
</span>
(3)MenuFragment的逻辑
<span style="font-family:SimSun;font-size:18px;">public class MenuFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = View.inflate(getActivity(), R.layout.activity_listview,
null);
ListView listview = (ListView) view.findViewById(R.id.listview);
listview.setAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, android.R.id.text1,
initData()));
//listview条目的监听事件:点击对应的条目不同的fragment替换main布局,fragment中只有一个显示简单类名的文本
listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
BaseFragment baseFragment = null;
switch (position) {
case 0:
baseFragment = new Fragment01();
break;
case 1:
baseFragment = new Fragment02();
break;
case 2:
baseFragment = new Fragment03();
break;
case 3:
baseFragment = new Fragment04();
break;
case 4:
baseFragment = new Fragment05();
break;
}
//baseFragment替换了main布局
getActivity().getSupportFragmentManager().beginTransaction()
.replace(R.id.main, baseFragment, "HOME").commit();
switchFragment(baseFragment);
}
//这个是因为有错误隐患存在,所以判断这个方法是否在MainActivity中,如果不在MainActivity中,如果还有一个activity中也有这个方法,会有冲突
private void switchFragment(BaseFragment baseFragment) {
if (getActivity() instanceof MainActivity) {
((MainActivity) getActivity()).switchFragment(baseFragment);
}
}
});
return view;
}
private List<String> initData() {
List<String> arrayList = new ArrayList<String>();
arrayList.add("fragment0");
arrayList.add("fragment1");
arrayList.add("fragment2");
arrayList.add("fragment3");
arrayList.add("fragment4");
return arrayList;
}
}
</span>
(4)BaseFragment中的逻辑很简单就是一个TextView
<span style="font-family:SimSun;font-size:18px;">public class BaseFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
TextView text = new TextView(getActivity());
//简单的类名,如果是getName()方法会包含全包名
text.setText(this.getClass().getSimpleName());
return text;
}
}</span>
还有五个Fragment的类,里面没有做任何处理。
最后我还想多说两句关于SlidingMenu的设置,首先要先加载slidingMenu的布局,这里加载slidingMenu使用的是
<span style="font-family:SimSun;font-size:18px;"> setBehindContentView(R.layout.activity_menu);</span>
还有,要想实现侧滑就要先加载侧滑的布局,然后再对属性进行设置