一.完成目标:使用SlidingMenu开源项目实现向左滑出现菜单的效果。
二.具体代码
1.菜单区的布局,只有一个FrameLayout,之后会用LeftFragment替代掉(leftcontent.xml)
<?xml version="1.0"encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/left_content"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
2. 内容区的布局,只有一个FrameLayout,之后会用MainFragment替代掉(maincontent.xml)
<?xml version="1.0"encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/main_content"
>
</FrameLayout>
3.继承SlidingFragmentActivity,将两个布局放到菜单区,内容区,并为SlidingMenu进行一些设置(MainActivity.java)
public class MainActivity extends SlidingFragmentActivity {
private static final String MAIN_MENU_TAG = "MAIN_MENU_TAG";
private static final String LEFT_MENU_TAG = "LEFT_MENU_TAG";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
initView();
initData();
}
private void initData() {
FragmentManager fragmentManager =getSupportFragmentManager();
FragmentTransaction transaction =fragmentManager.beginTransaction();
MainContentFragment mainContentFragment = newMainContentFragment();
transaction.replace(R.id.main_content,mainContentFragment,MAIN_MENU_TAG);
LeftContentFragment leftContentFragment = new LeftContentFragment();
transaction.replace(R.id.left_content,leftContentFragment,LEFT_MENU_TAG);
transaction.commit();
}
privatevoid initView() {
// 设置内容区的布局
setContentView(R.layout.maincontent);
// 设置菜单区的布局
setBehindContentView(R.layout.leftcontent);
SlidingMenu slidingMenu = getSlidingMenu();
// 只显示左侧的菜单
slidingMenu.setMode(SlidingMenu.LEFT);
// 屏幕的任何地方滑动都能划出菜单
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
// 滑出菜单后,留给内容区的部分只有100
slidingMenu.setBehindOffset(100);
}
public MainContentFragment getMainContentFragment(){
FragmentManager fragmentManager = getSupportFragmentManager();
MainContentFragment mainContentFragment =(MainContentFragment) fragmentManager.findFragmentByTag(MAIN_MENU_TAG);
return mainContentFragment;
}
public LeftContentFragment getLeftContentFragment(){
FragmentManager fragmentManager = getSupportFragmentManager();
LeftContentFragment leftContentFragment =(LeftContentFragment) fragmentManager.findFragmentByTag(LEFT_MENU_TAG);
return leftContentFragment;
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
4.
1)创建两个fragment,分别为LeftFragment,MainFragment,这两个有一些共性,所以可以抽出一个父Fragment。(BaseFragment.java)
public abstract class BaseFragment extends Fragment {
private View root;
protected MainActivity mainActivity;
/*
* 在这个方法中做一些初始化的工作
*/
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
// 拿到所在的上下文Context,即MainActivity(Activity类是继承于Context的)
mainActivity = (MainActivity)getActivity();
}
/*
* 在这个方法中加载fragment的布局
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState){
root = initView();
returnroot;
}
/**
* initView设置为抽象方法,则子fragment都必须实现initView方法,并在该方法内实现各自的布局
*/
protected abstract View initView();
/*
* 该方法内可以加载数据,初始化事件
*/
@Override
public void onActivityCreated(Bundle savedInstanceState) {
initData();
initListener();
super.onActivityCreated(savedInstanceState);
}
/**
* 子fragment可以根据需求覆盖
*/
protected void initListener() {
// TODO自动生成的方法存根
}
/**
* 子fragment可以根据需求覆盖
*/
protected void initData() {
// TODO自动生成的方法存根
}
}
2)为了方便管理,可以创建一个fragment包,这几个fragment都放在这个包里面
3)创建LeftFragment (LeftFragment.java)
public class LeftFragment extends BaseFragment {
@Override
protected View initView() {
// TODO自动生成的方法存根
return null;
}
}
4)创建MianFrament (MainFragement.java)
public class MainFragment extends BaseFragment {
@Override
protected View initView() {
// TODO自动生成的方法存根
return null;
}
}
5)前面创建的两个布局,里面的两个FrameLayout分别用LeftFragment,MainFragment来代替
public class MainActivity extends SlidingFragmentActivity {
private static final String MAIN_MENU_TAG = "MAIN_MENU_TAG";
private static final String LEFT_MENU_TAG = "LEFT_MENU_TAG";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
initView();
initData();
}
private void initData() {
// 拿到FragmentManager对象
FragmentManager fragmentManager =getSupportFragmentManager();
// 用FragmentManager拿到FragmentTransaction对象
FragmentTransaction transaction = fragmentManager.beginTransaction();
MainFragment mainContentFragment = new MainFragment();
// 用MainFragment来代替Framelayout,注意:第三个参数MAIN_MENU_TAG是为了findFragmentByTag找到MainFragment
transaction.replace(R.id.main_content,mainContentFragment,MAIN_MENU_TAG);
LeftFragment leftContentFragment = new LeftFragment();
// 用LeftFragment来代替Framelayout,注意:第三个参数LEFT_MENU_TAG是为了findFragmentByTag找到LeftFragment
transaction.replace(R.id.left_content,leftContentFragment,LEFT_MENU_TAG);
// 提交
transaction.commit();
}
private void initView() {
// 设置内容区的布局
setContentView(R.layout.maincontent);
// 设置菜单区的布局
setBehindContentView(R.layout.leftcontent);
SlidingMenu slidingMenu = getSlidingMenu();
// 只显示左侧的菜单
slidingMenu.setMode(SlidingMenu.LEFT);
// 屏幕的任何地方滑动都能划出菜单
slidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
// 滑出菜单后,留给内容区的部分只有100
slidingMenu.setBehindOffset(100);
}
public MainFragment getMainContentFragment(){
FragmentManager fragmentManager = getSupportFragmentManager();
MainFragment mainContentFragment = (MainFragment)fragmentManager.findFragmentByTag(MAIN_MENU_TAG);
return mainContentFragment;
}
public LeftFragment getLeftContentFragment(){
FragmentManager fragmentManager = getSupportFragmentManager();
LeftFragment leftContentFragment = (LeftFragment)fragmentManager.findFragmentByTag(LEFT_MENU_TAG);
return leftContentFragment;
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}