转 android 侧滑实现

本篇博客给大家分享一个效果比较好的侧滑菜单的Demo,实现点击左边菜单切换Fragment。

效果如下:

主Activity代码:

  1. package com.infzm.slidingmenu.demo;  
  2.   
  3. import android.os.Bundle;  
  4. import android.support.v4.app.Fragment;  
  5. import android.view.View;  
  6. import android.view.View.OnClickListener;  
  7. import android.view.Window;  
  8. import android.widget.ImageView;  
  9. import android.widget.TextView;  
  10.   
  11. import com.infzm.slidingmenu.demo.fragment.LeftFragment;  
  12. import com.infzm.slidingmenu.demo.fragment.TodayFragment;  
  13. import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;  
  14. import com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity;  
  15.   
  16. /** 
  17.  * @date 2014/11/14 
  18.  * @author wuwenjie 
  19.  * @description 主界面 
  20.  */  
  21. public class MainActivity extends SlidingFragmentActivity implements  
  22.         OnClickListener {  
  23.   
  24.     private ImageView topButton;  
  25.     private Fragment mContent;  
  26.     private TextView topTextView;  
  27.   
  28.     @Override  
  29.     public void onCreate(Bundle savedInstanceState) {  
  30.         requestWindowFeature(Window.FEATURE_NO_TITLE); // 无标题  
  31.         super.onCreate(savedInstanceState);  
  32.         setContentView(R.layout.activity_main);  
  33.         initSlidingMenu(savedInstanceState);  
  34.   
  35.         topButton = (ImageView) findViewById(R.id.topButton);  
  36.         topButton.setOnClickListener(this);  
  37.         topTextView = (TextView) findViewById(R.id.topTv);  
  38.     }  
  39.   
  40.     /** 
  41.      * 初始化侧边栏 
  42.      */  
  43.     private void initSlidingMenu(Bundle savedInstanceState) {  
  44.         // 如果保存的状态不为空则得到之前保存的Fragment,否则实例化MyFragment  
  45.         if (savedInstanceState != null) {  
  46.             mContent = getSupportFragmentManager().getFragment(  
  47.                     savedInstanceState, "mContent");  
  48.         }  
  49.   
  50.         if (mContent == null) {  
  51.             mContent = new TodayFragment();  
  52.         }  
  53.   
  54.         // 设置左侧滑动菜单  
  55.         setBehindContentView(R.layout.menu_frame_left);  
  56.         getSupportFragmentManager().beginTransaction()  
  57.                 .replace(R.id.menu_frame, new LeftFragment()).commit();  
  58.   
  59.         // 实例化滑动菜单对象  
  60.         SlidingMenu sm = getSlidingMenu();  
  61.         // 设置可以左右滑动的菜单  
  62.         sm.setMode(SlidingMenu.LEFT);  
  63.         // 设置滑动阴影的宽度  
  64.         sm.setShadowWidthRes(R.dimen.shadow_width);  
  65.         // 设置滑动菜单阴影的图像资源  
  66.         sm.setShadowDrawable(null);  
  67.         // 设置滑动菜单视图的宽度  
  68.         sm.setBehindOffsetRes(R.dimen.slidingmenu_offset);  
  69.         // 设置渐入渐出效果的值  
  70.         sm.setFadeDegree(0.35f);  
  71.         // 设置触摸屏幕的模式,这里设置为全屏  
  72.         sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);  
  73.         // 设置下方视图的在滚动时的缩放比例  
  74.         sm.setBehindScrollScale(0.0f);  
  75.   
  76.     }  
  77.   
  78.     @Override  
  79.     protected void onSaveInstanceState(Bundle outState) {  
  80.         super.onSaveInstanceState(outState);  
  81.         getSupportFragmentManager().putFragment(outState, "mContent", mContent);  
  82.     }  
  83.   
  84.     /** 
  85.      * 切换Fragment 
  86.      *  
  87.      * @param fragment 
  88.      */  
  89.     public void switchConent(Fragment fragment, String title) {  
  90.         mContent = fragment;  
  91.         getSupportFragmentManager().beginTransaction()  
  92.                 .replace(R.id.content_frame, fragment).commit();  
  93.         getSlidingMenu().showContent();  
  94.         topTextView.setText(title);  
  95.     }  
  96.   
  97.     @Override  
  98.     public void onClick(View v) {  
  99.         switch (v.getId()) {  
  100.         case R.id.topButton:  
  101.             toggle();  
  102.             break;  
  103.         default:  
  104.             break;  
  105.         }  
  106.     }  
  107.   
  108. }  
package com.infzm.slidingmenu.demo;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.ImageView;
import android.widget.TextView;

import com.infzm.slidingmenu.demo.fragment.LeftFragment;
import com.infzm.slidingmenu.demo.fragment.TodayFragment;
import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu;
import com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity;

/**
 * @date 2014/11/14
 * @author wuwenjie
 * @description 主界面
 */
public class MainActivity extends SlidingFragmentActivity implements
		OnClickListener {

	private ImageView topButton;
	private Fragment mContent;
	private TextView topTextView;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		requestWindowFeature(Window.FEATURE_NO_TITLE); // 无标题
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initSlidingMenu(savedInstanceState);

		topButton = (ImageView) findViewById(R.id.topButton);
		topButton.setOnClickListener(this);
		topTextView = (TextView) findViewById(R.id.topTv);
	}

	/**
	 * 初始化侧边栏
	 */
	private void initSlidingMenu(Bundle savedInstanceState) {
		// 如果保存的状态不为空则得到之前保存的Fragment,否则实例化MyFragment
		if (savedInstanceState != null) {
			mContent = getSupportFragmentManager().getFragment(
					savedInstanceState, "mContent");
		}

		if (mContent == null) {
			mContent = new TodayFragment();
		}

		// 设置左侧滑动菜单
		setBehindContentView(R.layout.menu_frame_left);
		getSupportFragmentManager().beginTransaction()
				.replace(R.id.menu_frame, new LeftFragment()).commit();

		// 实例化滑动菜单对象
		SlidingMenu sm = getSlidingMenu();
		// 设置可以左右滑动的菜单
		sm.setMode(SlidingMenu.LEFT);
		// 设置滑动阴影的宽度
		sm.setShadowWidthRes(R.dimen.shadow_width);
		// 设置滑动菜单阴影的图像资源
		sm.setShadowDrawable(null);
		// 设置滑动菜单视图的宽度
		sm.setBehindOffsetRes(R.dimen.slidingmenu_offset);
		// 设置渐入渐出效果的值
		sm.setFadeDegree(0.35f);
		// 设置触摸屏幕的模式,这里设置为全屏
		sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
		// 设置下方视图的在滚动时的缩放比例
		sm.setBehindScrollScale(0.0f);

	}

	@Override
	protected void onSaveInstanceState(Bundle outState) {
		super.onSaveInstanceState(outState);
		getSupportFragmentManager().putFragment(outState, "mContent", mContent);
	}

	/**
	 * 切换Fragment
	 * 
	 * @param fragment
	 */
	public void switchConent(Fragment fragment, String title) {
		mContent = fragment;
		getSupportFragmentManager().beginTransaction()
				.replace(R.id.content_frame, fragment).commit();
		getSlidingMenu().showContent();
		topTextView.setText(title);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.topButton:
			toggle();
			break;
		default:
			break;
		}
	}

}



侧边栏菜单Fragment

  1. package com.infzm.slidingmenu.demo.fragment;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.support.v4.app.Fragment;  
  6. import android.view.LayoutInflater;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.view.ViewGroup;  
  10.   
  11. import com.infzm.slidingmenu.demo.MainActivity;  
  12. import com.infzm.slidingmenu.demo.R;  
  13. /** 
  14.  * @date 2014/11/14 
  15.  * @author wuwenjie 
  16.  * @description 侧边栏菜单 
  17.  */  
  18. public class LeftFragment extends Fragment implements OnClickListener{  
  19.     private View todayView;  
  20.     private View lastListView;  
  21.     private View discussView;  
  22.     private View favoritesView;  
  23.     private View commentsView;  
  24.     private View settingsView;  
  25.       
  26.       
  27.     @Override  
  28.     public void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.     }  
  31.       
  32.     @Override  
  33.     public void onAttach(Activity activity) {  
  34.         super.onAttach(activity);  
  35.     }  
  36.       
  37.     @Override  
  38.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  39.             Bundle savedInstanceState) {  
  40.         View view = inflater.inflate(R.layout.layout_menu, null);  
  41.         findViews(view);  
  42.           
  43.         return view;  
  44.     }  
  45.       
  46.       
  47.     public void findViews(View view) {  
  48.         todayView = view.findViewById(R.id.tvToday);  
  49.         lastListView = view.findViewById(R.id.tvLastlist);  
  50.         discussView = view.findViewById(R.id.tvDiscussMeeting);  
  51.         favoritesView = view.findViewById(R.id.tvMyFavorites);  
  52.         commentsView = view.findViewById(R.id.tvMyComments);  
  53.         settingsView = view.findViewById(R.id.tvMySettings);  
  54.           
  55.         todayView.setOnClickListener(this);  
  56.         lastListView.setOnClickListener(this);  
  57.         discussView.setOnClickListener(this);  
  58.         favoritesView.setOnClickListener(this);  
  59.         commentsView.setOnClickListener(this);  
  60.         settingsView.setOnClickListener(this);  
  61.     }  
  62.       
  63.     @Override  
  64.     public void onDestroyView() {  
  65.         super.onDestroyView();  
  66.     }  
  67.       
  68.     @Override  
  69.     public void onDestroy() {  
  70.         super.onDestroy();  
  71.     }  
  72.   
  73.     @Override  
  74.     public void onClick(View v) {  
  75.         Fragment newContent = null;  
  76.         String title = null;  
  77.         switch (v.getId()) {  
  78.         case R.id.tvToday: // 今日  
  79.             newContent = new TodayFragment();  
  80.             title = getString(R.string.today);  
  81.             break;  
  82.         case R.id.tvLastlist:// 往期列表  
  83.             newContent = new LastListFragment();  
  84.             title = getString(R.string.lastList);  
  85.             break;  
  86.         case R.id.tvDiscussMeeting: // 讨论集会  
  87.             newContent = new DiscussFragment();  
  88.             title = getString(R.string.discussMeetting);  
  89.             break;  
  90.         case R.id.tvMyFavorites: // 我的收藏  
  91.             newContent = new MyFavoritesFragment();  
  92.             title = getString(R.string.myFavorities);  
  93.             break;  
  94.         case R.id.tvMyComments: // 我的评论  
  95.             newContent = new MyCommentsFragment();  
  96.             title = getString(R.string.myComments);  
  97.             break;  
  98.         case R.id.tvMySettings: // 设置  
  99.             newContent = new MySettingsFragment();  
  100.             title = getString(R.string.settings);  
  101.             break;  
  102.         default:  
  103.             break;  
  104.         }  
  105.         if (newContent != null) {  
  106.             switchFragment(newContent, title);  
  107.         }  
  108.     }  
  109.       
  110.     /** 
  111.      * 切换fragment 
  112.      * @param fragment 
  113.      */  
  114.     private void switchFragment(Fragment fragment, String title) {  
  115.         if (getActivity() == null) {  
  116.             return;  
  117.         }  
  118.         if (getActivity() instanceof MainActivity) {  
  119.             MainActivity fca = (MainActivity) getActivity();  
  120.             fca.switchConent(fragment, title);  
  121.         }  
  122.     }  
  123.       
  124. }  
package com.infzm.slidingmenu.demo.fragment;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;

import com.infzm.slidingmenu.demo.MainActivity;
import com.infzm.slidingmenu.demo.R;
/**
 * @date 2014/11/14
 * @author wuwenjie
 * @description 侧边栏菜单
 */
public class LeftFragment extends Fragment implements OnClickListener{
	private View todayView;
	private View lastListView;
	private View discussView;
	private View favoritesView;
	private View commentsView;
	private View settingsView;
	
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
	}
	
	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
	}
	
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.layout_menu, null);
		findViews(view);
		
		return view;
	}
	
	
	public void findViews(View view) {
		todayView = view.findViewById(R.id.tvToday);
		lastListView = view.findViewById(R.id.tvLastlist);
		discussView = view.findViewById(R.id.tvDiscussMeeting);
		favoritesView = view.findViewById(R.id.tvMyFavorites);
		commentsView = view.findViewById(R.id.tvMyComments);
		settingsView = view.findViewById(R.id.tvMySettings);
		
		todayView.setOnClickListener(this);
		lastListView.setOnClickListener(this);
		discussView.setOnClickListener(this);
		favoritesView.setOnClickListener(this);
		commentsView.setOnClickListener(this);
		settingsView.setOnClickListener(this);
	}
	
	@Override
	public void onDestroyView() {
		super.onDestroyView();
	}
	
	@Override
	public void onDestroy() {
		super.onDestroy();
	}

	@Override
	public void onClick(View v) {
		Fragment newContent = null;
		String title = null;
		switch (v.getId()) {
		case R.id.tvToday: // 今日
			newContent = new TodayFragment();
			title = getString(R.string.today);
			break;
		case R.id.tvLastlist:// 往期列表
			newContent = new LastListFragment();
			title = getString(R.string.lastList);
			break;
		case R.id.tvDiscussMeeting: // 讨论集会
			newContent = new DiscussFragment();
			title = getString(R.string.discussMeetting);
			break;
		case R.id.tvMyFavorites: // 我的收藏
			newContent = new MyFavoritesFragment();
			title = getString(R.string.myFavorities);
			break;
		case R.id.tvMyComments: // 我的评论
			newContent = new MyCommentsFragment();
			title = getString(R.string.myComments);
			break;
		case R.id.tvMySettings: // 设置
			newContent = new MySettingsFragment();
			title = getString(R.string.settings);
			break;
		default:
			break;
		}
		if (newContent != null) {
			switchFragment(newContent, title);
		}
	}
	
	/**
	 * 切换fragment
	 * @param fragment
	 */
	private void switchFragment(Fragment fragment, String title) {
		if (getActivity() == null) {
			return;
		}
		if (getActivity() instanceof MainActivity) {
			MainActivity fca = (MainActivity) getActivity();
			fca.switchConent(fragment, title);
		}
	}
	
}


上面是核心代码,引入SlidingMenu开源库。

Demo下载地址:http://download.csdn.net/download/wwj_748/8184889

原文地址:https://www.cnblogs.com/jokerjason/p/5683243.html