1. 程式人生 > >Fragment+ViewPager實現類似ActionBar切換的效果

Fragment+ViewPager實現類似ActionBar切換的效果

使用Fragment+ViewPager實現類似網易新聞客戶端的多頁面左右滑動切換的效果,需要有android.support.v4的支援包,可以相容Android 2.0以上版本,具體程式碼如下:

private TextView mWealthRank_tv;
	private TextView mMostRank_tv;
	private TextView mNewRank_tv;
	private ViewPager mPager;
	private int mCurrentPage = 0;
	private ImageView image;
	private int bmpW;// 滑塊寬度
	private int offset;// 滑塊偏移量
	private ArrayList<Fragment> fragmentList;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.rankcategory);
		mWealthRank_tv = (TextView) findViewById(R.id.wealth_tag);
		mMostRank_tv = (TextView) findViewById(R.id.most_tag);
		mNewRank_tv = (TextView) findViewById(R.id.new_tag);
		mPager = (ViewPager) findViewById(R.id.viewPager);
		mWealthRank_tv.setOnClickListener(this);
		mMostRank_tv.setOnClickListener(this);
		mNewRank_tv.setOnClickListener(this);
		InitImage();
		initViewPager();
	}

	private void initViewPager() {
		fragmentList = new ArrayList<Fragment>();
		Fragment fragment0 = WealthRankFragment.newInstance("1");
		Fragment fragment1 = WealthRankFragment.newInstance("2");
		Fragment fragment2 = WealthRankFragment.newInstance("3");
		fragmentList.add(fragment0);
		fragmentList.add(fragment1);
		fragmentList.add(fragment2);
		mPager.setAdapter(new MyFragmentPagerAdapter(
				getSupportFragmentManager(), fragmentList));
		mPager.setCurrentItem(0);
		mPager.setOnPageChangeListener(new MyOnPageChangeListener());
		mPager.setOffscreenPageLimit(2);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.wealth_tag:
			mPager.setCurrentItem(0);// 預設viewPager首頁
			break;
		case R.id.most_tag:
			mPager.setCurrentItem(1);
			break;
		case R.id.new_tag:
			mPager.setCurrentItem(2);
			break;

		default:
			break;
		}
	}

	class MyOnPageChangeListener implements OnPageChangeListener {
		private int one = offset * 2 + bmpW;

		@Override
		public void onPageScrolled(int arg0, float arg1, int arg2) {
		}

		@Override
		public void onPageScrollStateChanged(int arg0) {
		}

		@Override
		public void onPageSelected(int arg0) {
			Animation animation = new TranslateAnimation(mCurrentPage * one,
					arg0 * one, 0, 0);
			mCurrentPage = arg0;
			mPager.setCurrentItem(mCurrentPage);
			animation.setFillAfter(true);
			animation.setDuration(200);
			image.startAnimation(animation);
		}
	}

	public void InitImage() {
		image = (ImageView) findViewById(R.id.cursor);
		bmpW = BitmapFactory.decodeResource(getResources(), R.drawable.cursor)
				.getWidth();
		DisplayMetrics dm = new DisplayMetrics();
		getWindowManager().getDefaultDisplay().getMetrics(dm);
		int screenW = dm.widthPixels;
		offset = (screenW / 3 - bmpW) / 2;

		Matrix matrix = new Matrix();
		matrix.postTranslate(offset, 0);
		image.setImageMatrix(matrix);
	}

Fragment類:
private static final String TAG = "WealthRankFragment";
	private RankDataAdapter adapter;
	private String query_type = "0";
	private ArrayList<CoinsRank> ranks = new ArrayList<CoinsRank>();
	private Context mContext = null;
	private ListView mListView;

	public static WealthRankFragment newInstance(String type) {
		WealthRankFragment newFragment = new WealthRankFragment();
		Bundle bundle = new Bundle();
		bundle.putString("Type", type);
		newFragment.setArguments(bundle);
		return newFragment;
	}

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mContext = getActivity().getParent();
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		Log.d(TAG, "TestFragment-----onCreateView");
		Bundle args = getArguments();
		query_type = args != null ? args.getString("Type") : "0";
		View view = inflater.inflate(R.layout.ranklist, container, false);
		mListView = (ListView) view.findViewById(R.id.lv);
		String type = "";
		if (query_type.equals("1")) {
			type = "1";
		} else if (query_type.equals("2")) {
			type = "2";
		} else if (query_type.equals("3")) {
			type = "3";
		}
		getRankListAction(type);
		return view;

	}

	@Override
	public void onResume() {
		super.onResume();
	}

	private void getRankListAction(String type) {
		具體資料,可自定義
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
	}

	@Override
	public void onDestroyView() {
		super.onDestroyView();
	}