源码简介
Android上的菜单展示风格各异,其中用得最多且体验***的莫过于左右滑动来显示隐藏的菜单,android-menudrawer 是一个滑动 式菜单实现,允许用户在应用当中实现无缝导航。该项目具有多种菜单展示效果,其中最常见的就是通过屏幕边缘拖动或点击动作栏的“向上”按钮显示。
源码运行截图
源码片段
- package net.simonvt.menudrawer.samples;
- import net.simonvt.menudrawer.MenuDrawer;
- import net.simonvt.menudrawer.Position;
- import android.os.Build;
- import android.os.Bundle;
- import android.support.v4.app.Fragment;
- import android.support.v4.app.FragmentManager;
- import android.support.v4.app.FragmentTransaction;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.TextView;
- public class FragmentSample extends BaseListSample {
- private static final String STATE_CURRENT_FRAGMENT = "net.simonvt.menudrawer.samples.FragmentSample";
- private FragmentManager mFragmentManager;
- private FragmentTransaction mFragmentTransaction;
- private String mCurrentFragmentTag;
- @Override
- protected void onCreate(Bundle inState) {
- super.onCreate(inState);
- mFragmentManager = getSupportFragmentManager();
- if (inState != null) {
- mCurrentFragmentTag = inState.getString(STATE_CURRENT_FRAGMENT);
- } else {
- mCurrentFragmentTag = ((Item) mAdapter.getItem(0)).mTitle;
- attachFragment(mMenuDrawer.getContentContainer().getId(), getFragment(mCurrentFragmentTag),
- mCurrentFragmentTag);
- commitTransactions();
- }
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
- getActionBar().setDisplayHomeAsUpEnabled(true);
- }
- mMenuDrawer.setOnDrawerStateChangeListener(new MenuDrawer.OnDrawerStateChangeListener() {
- @Override
- public void onDrawerStateChange(int oldState, int newState) {
- if (newState == MenuDrawer.STATE_CLOSED) {
- commitTransactions();
- }
- }
- @Override
- public void onDrawerSlide(float openRatio, int offsetPixels) {
- // Do nothing
- }
- });
- }
- @Override
- protected void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putString(STATE_CURRENT_FRAGMENT, mCurrentFragmentTag);
- }
- @Override
- protected void onMenuItemClicked(int position, Item item) {
- if (mCurrentFragmentTag != null) detachFragment(getFragment(mCurrentFragmentTag));
- attachFragment(mMenuDrawer.getContentContainer().getId(), getFragment(item.mTitle), item.mTitle);
- mCurrentFragmentTag = item.mTitle;
- mMenuDrawer.closeMenu();
- }
- @Override
- protected int getDragMode() {
- return MenuDrawer.MENU_DRAG_WINDOW;
- }
- @Override
- protected Position getDrawerPosition() {
- return Position.LEFT;
- }
- protected FragmentTransaction ensureTransaction() {
- if (mFragmentTransaction == null) {
- mFragmentTransaction = mFragmentManager.beginTransaction();
- mFragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
- }
- return mFragmentTransaction;
- }
- private Fragment getFragment(String tag) {
- Fragment f = mFragmentManager.findFragmentByTag(tag);
- if (f == null) {
- f = SampleFragment.newInstance(tag);
- }
- return f;
- }
- protected void attachFragment(int layout, Fragment f, String tag) {
- if (f != null) {
- if (f.isDetached()) {
- ensureTransaction();
- mFragmentTransaction.attach(f);
- } else if (!f.isAdded()) {
- ensureTransaction();
- mFragmentTransaction.add(layout, f, tag);
- }
- }
- }
- protected void detachFragment(Fragment f) {
- if (f != null && !f.isDetached()) {
- ensureTransaction();
- mFragmentTransaction.detach(f);
- }
- }
- protected void commitTransactions() {
- if (mFragmentTransaction != null && !mFragmentTransaction.isEmpty()) {
- mFragmentTransaction.commit();
- mFragmentTransaction = null;
- }
- }
- public static class SampleFragment extends Fragment {
- private static final String ARG_TEXT = "net.simonvt.menudrawer.samples.SampleFragment.text";
- public static SampleFragment newInstance(String text) {
- SampleFragment f = new SampleFragment();
- Bundle args = new Bundle();
- args.putString(ARG_TEXT, text);
- f.setArguments(args);
- return f;
- }
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- View v = inflater.inflate(R.layout.fragment_sample, container, false);
- ((TextView) v.findViewById(R.id.text)).setText(getArguments().getString(ARG_TEXT));
- return v;
- }
- }
- }