最近项目中用到了SlidingMenu 布局效果,在网上搜索了不少资料才实现了这个布局效果,项目中用到了 github上的一个开源项目 ,项目地址:https://github.com/jfeinstein10/SlidingMenu。兼容android 2.1以上所有版本。
工程项目结构如下图所示
它引用了一个 库项目 SlidingMenu
MainActivity.java
package com.yulore.sdktest;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import com.example.yulore_sdktest.R;
import com.slidingmenu.lib.SlidingMenu;
import com.yulore.sdktest.fragment.ContentFragment;
import com.yulore.sdktest.fragment.ContentFragment.OnMenuClickedListener;
import com.yulore.sdktest.fragment.MenuFragment;
import com.yulore.sdktest.fragment.MenuFragment.OnCityListSelectedListener;
public class MainActivity extends FragmentActivity implements OnCityListSelectedListener,OnMenuClickedListener{
private SlidingMenu menu;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//1、设置全屏可以使用如下代码:
//getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
//2、设置无title bar可以使用如下代码:
// requestWindowFeature(Window.FEATURE_NO_TITLE);
setTitle(R.string.app_name);
// set the content view
setContentView(R.layout.frame_content);
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
MenuFragment menuFragment = new MenuFragment();
fragmentTransaction.replace(R.id.menu, menuFragment);
fragmentTransaction.replace(R.id.content, new ContentFragment());
fragmentTransaction.commit();
menu = new SlidingMenu(this);
menu.setMode(SlidingMenu.RIGHT); //设置菜单 滑动模式,左滑还是右滑
menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
menu.setShadowWidthRes(R.dimen.slidingmenu_shadowWidth);
menu.setShadowDrawable(R.drawable.shadow);
menu.setBehindOffsetRes(R.dimen.slidingmenu_behindOffset);
menu.setFadeDegree(0.35f);
menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
menu.setMenu(R.layout.frame_menu);
}
@Override
public void onCityListSelected(int position) {
ContentFragment contentFrag = (ContentFragment)
getSupportFragmentManager().findFragmentById(R.id.content);
if (contentFrag != null) {
contentFrag.updateContentView(position);
} else {
ContentFragment newFragment = new ContentFragment();
Bundle args = new Bundle();
args.putInt(ContentFragment.CITY_LIST_POSITION, position);
newFragment.setArguments(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack so the user can navigate back
transaction.replace(R.id.content, newFragment);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
}
//显示 主界面
menu.showContent();
}
/**
* 显示或隐藏菜单
*/
@Override
public void onMenuButtonClicked() {
Log.i("MainActivity", "onMenuButtonClicked invoke...");
if(menu.isMenuShowing()){
menu.showContent();
}else{
menu.showMenu();
}
}
}
frame_content.xml布局文件
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent" />
右侧菜单 MenuFragment.java
package com.yulore.sdktest.fragment;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import com.example.yulore_sdktest.R;
public class MenuFragment extends ListFragment {
OnCityListSelectedListener mCallback;
public static String[] CITYLIST = {"北京","上海","广州","深圳","武汉","南京","苏州","杭州","天津","福州","厦门"};
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setListAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, CITYLIST));
}
// Container Activity must implement this interface
public interface OnCityListSelectedListener {
public void onCityListSelected(int position);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
mCallback = (OnCityListSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}
}
@Override
public void onStart() {
super.onStart();
// When in two-pane layout, set the listview to highlight the selected list item
// (We do this during onStart because at the point the listview is available.)
if (getFragmentManager().findFragmentById(R.id.menu) != null) {
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.menu_fragment_layout, container, false);
}
public void onListItemClick(ListView parent, View v, int position, long id) {
// Send the event to the host activity
mCallback.onCityListSelected(position);
// Set the item as checked to be highlighted when in two-pane layout
getListView().setItemChecked(position, true);
Toast.makeText(getActivity(),
"You have selected " + CITYLIST[position], Toast.LENGTH_SHORT).show();
}
}
content_fragment_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/menu_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/bt_menu"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/show_menu"
android:textSize="20sp"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"/>
<TextView
android:id="@+id/tv_result"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:layout_centerInParent="true" />
</RelativeLayout>
内容显示 ContentFragment.java
package com.yulore.sdktest.fragment;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import com.example.yulore_sdktest.R;
public class ContentFragment extends Fragment implements OnClickListener {
public final static String CITY_LIST_POSITION = "position";
int mCurrentPosition = -1;
OnMenuClickedListener mCallback;
// Container Activity must implement this interface
public interface OnMenuClickedListener {
public void onMenuButtonClicked();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// This makes sure that the container activity has implemented
// the callback interface. If not, it throws an exception
try {
mCallback = (OnMenuClickedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnMenuButtonClickedListener");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (savedInstanceState != null) {
mCurrentPosition = savedInstanceState.getInt(CITY_LIST_POSITION);
}
View view = inflater.inflate(R.layout.content_fragment_layout, null);
Button bt_menu = (Button) view.findViewById(R.id.bt_menu);
bt_menu.setOnClickListener(this);
return view;
}
@Override
public void onStart() {
super.onStart();
Bundle args = getArguments();
if (args != null) {
// Set article based on argument passed in
updateContentView(args.getInt(CITY_LIST_POSITION));
} else if (mCurrentPosition != -1) {
updateContentView(mCurrentPosition);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// Save the current article selection in case we need to recreate the
// fragment
outState.putInt(CITY_LIST_POSITION, mCurrentPosition);
}
public void updateContentView(int position) {
TextView article = (TextView) getActivity()
.findViewById(R.id.tv_result);
article.setText(MenuFragment.CITYLIST[position]);
mCurrentPosition = position;
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_menu:
Log.i("ContentFragment", "点击了 菜单");
mCallback.onMenuButtonClicked();
break;
default:
break;
}
}
}
运行效果图
工程下载地址:http://download.csdn.net/detail/fx_sky/5518429