Android仿大衆點評引導頁(ViewPage)+主頁面(Fragment)的實現

    大家好,今天主要是實現仿大衆點評引導頁和主頁面以及城市定位的實現,主要使用ViewPager+Fragment+SharedPreferences,實現了第一次打開程序出現引導頁,再次打開跳過引導頁,這也是一般應用常用的應用基本架構方式。下面首先來看最終實現效果如下圖:

wKioL1V72CbxovjVAAHh5OLjy3g970.gif

1.佈局文件說明

1)歡迎頁佈局文件welcome.xml

2) 引導頁佈局文件welcome_guide.xml

3)首頁佈局文件main_home.xml

4)團購佈局文件main_tuan.xml

5) 發現佈局文件main_search.xml

6) 我的佈局文件main_my.xml

佈局文件內容較多,佈局代碼就不一一貼出來了,請看附件詳細源碼。

2.Activity說明

1)歡迎頁Activity(WelcomeStartActivity)

package com.sunny.dianping_client;

import java.util.Timer;
import java.util.TimerTask;

import com.sunny.dianping_client.utils.SharedUtils;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;

public class WelcomeStartActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.welcome);
		
		//使用Handler實現延時跳轉
//		new Handler(new Handler.Callback() {
//			
//			@Override
//			public boolean handleMessage(Message msg) {
//				// 頁面跳轉
//				startActivity(new Intent(getApplicationContext(), MainActivity.class));
//				return false;
//			}
//		}).sendEmptyMessageDelayed(0, 3000);//表示任務延時三秒執行
		//使用Java定時器實現延時跳轉
		Timer timer = new Timer();
		timer.schedule(new Task(), 3000);//定時器延時執行任務的方法
	}
	class Task extends TimerTask{

		@Override
		public void run() {
			// 實現頁面的跳轉
			//不是第一次啓動
			if (SharedUtils.getWelcomeFlag(getBaseContext())) {
				startActivity(new Intent(getBaseContext(),MainActivity.class));
			}else {
			    startActivity(new Intent(WelcomeStartActivity.this, WelcomeGuideActivity.class));
			    //保存訪問記錄
			    SharedUtils.putWelcomeFlag(getBaseContext(), true);
			}
			finish();
		}
	}
}

2) 引導頁Activity(WelcomeGuideActivity)

package com.sunny.dianping_client;

import java.util.ArrayList;
import java.util.List;

import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;
import com.lidroid.xutils.view.annotation.event.OnClick;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;

public class WelcomeGuideActivity extends Activity {

	@ViewInject(R.id.btn_welcome_guide)
	private Button mComeIn;
	@ViewInject(R.id.id_welcome_pager)
	private ViewPager mViewPager;
	private List<View> list;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO 自動生成的方法存根
		super.onCreate(savedInstanceState);
		setContentView(R.layout.welcome_guide);
		ViewUtils.inject(this);
		initViewPager();
	}

    @OnClick(R.id.btn_welcome_guide)
	public void click(View view){
    	// 實現頁面的跳轉
    	startActivity(new Intent(getBaseContext(), MainActivity.class));
    	finish();
	}
    //初始化ViewPager
    public void initViewPager(){
    	list = new ArrayList<View>();
    	ImageView iv = new ImageView(this);
    	iv.setImageResource(R.drawable.guide_01);
    	list.add(iv);
    	ImageView iv1 = new ImageView(this);
    	iv1.setImageResource(R.drawable.guide_02);
    	list.add(iv1);
    	ImageView iv2 = new ImageView(this);
    	iv2.setImageResource(R.drawable.guide_03);
    	list.add(iv2);
    	mViewPager.setAdapter(new MyPagerAdapter());
    	//監聽ViewPager滑動效果
    	mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
			//頁卡被選中的效果
			@Override
			public void onPageSelected(int arg0) {
				if (arg0==2) {
					mComeIn.setVisibility(View.VISIBLE);
				}else {
					mComeIn.setVisibility(View.GONE);
				}
			}
			
			@Override
			public void onPageScrolled(int arg0, float arg1, int arg2) {
			}
			
			@Override
			public void onPageScrollStateChanged(int arg0) {
			}
		});
    }
    //定義ViewPager的適配器
    class MyPagerAdapter extends PagerAdapter{

    	//計算需要多少Items顯示
		@Override
		public int getCount() {
			return list.size();
		}

		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			return arg0==arg1;
		}
		//初始化Item實例的方法
		@Override
		public Object instantiateItem(ViewGroup container, int position) {
			container.addView(list.get(position));
			return list.get(position);
		}
		//Item銷燬的方法
		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {
			/**
			 * 銷燬Item的方法不使用系統定義銷燬Item的方法,而是使用我們自己定義的形式,將一個View對象從ViewPager中移除
			 */
			//super.destroyItem(container, position, object);
			container.removeView(list.get(position));
		}
    	
    }
}

3) 主頁面Activity(MainActivity)

package com.sunny.dianping_client;

import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;
import com.lidroid.xutils.view.annotation.event.OnClick;
import com.sunny.dianping_client.fragment.FragmentHome;
import com.sunny.dianping_client.fragment.FragmentMy;
import com.sunny.dianping_client.fragment.FragmentSearch;
import com.sunny.dianping_client.fragment.FragmentTuan;

import android.os.Bundle;
import android.app.Activity;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.Toast;

public class MainActivity extends FragmentActivity implements OnCheckedChangeListener{

	@ViewInject(R.id.main_bottom_tabs)
	private RadioGroup mGroup;
	@ViewInject(R.id.main_home)
	private RadioButton main_home;
	private FragmentManager fragmentManager;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_main);
		ViewUtils.inject(this);
		//初始化FragmentManager
		fragmentManager = getSupportFragmentManager();
		//設置默認選中
		main_home.setChecked(true);
		mGroup.setOnCheckedChangeListener(this);
		changeFragment(new FragmentHome(), false);
		
	}
	@Override
	public void onCheckedChanged(RadioGroup group, int checkedId) {
		// 選中不同的Fragment
		switch (checkedId) {
		case R.id.main_home://首頁
			changeFragment(new FragmentHome(), true);
			break;
		case R.id.main_tuan://團購
			changeFragment(new FragmentTuan(), true);
			break;
		case R.id.main_search://發現
			changeFragment(new FragmentSearch(), true);
			break;
		case R.id.main_my://我的
			changeFragment(new FragmentMy(), true);
			break;
		default:
			break;
		}
		
	}
	//切換不同的Fragment
	public void changeFragment(Fragment fragment,boolean isInit){
		//開啓事物
		FragmentTransaction beginTransaction = fragmentManager.beginTransaction();
		beginTransaction.replace(R.id.main_content, fragment);
		if (!isInit) {
		        //加上該段代碼Fragment就不會出現重影的效果
			beginTransaction.addToBackStack(null);
		}
		beginTransaction.commit();
	}
}

3.主界面Fragment的實現

1)首頁Fragment(FragmentHome)

package com.sunny.dianping_client.fragment;

import java.util.List;

import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;
import com.sunny.dianping_client.R;
import com.sunny.dianping_client.utils.SharedUtils;

import android.support.v4.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.provider.Settings;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class FragmentHome extends Fragment implements LocationListener{

	@ViewInject(R.id.main_top_city)
	private TextView mTopcity;
	private String cityName;
	private LocationManager locationManager;
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.main_home, container, false);
		ViewUtils.inject(this, view);
		//獲取數據並顯示
		mTopcity.setText(SharedUtils.getCityName(getActivity()));
		return view;
	}
	@Override
	public void onStart() {
		super.onStart();
		// 檢查GPS是否打開
		checkGPSisOpen();
	}
	//檢查Gps是否打開
	private void checkGPSisOpen() {
		// 獲取當前LocationManager對象
		locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
		boolean isOpen = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
		if (!isOpen) {
			Intent intent = new Intent();
			intent.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
			intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			startActivityForResult(intent, 0);
		}
		//開始定位
		startLocation();
	}
	//使用GPS定位的方法
	private void startLocation() {
		locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10, this);
	}
	//接收並處理消息
	private Handler handler = new Handler(new Handler.Callback() {
		
		@Override
		public boolean handleMessage(Message msg) {
			if (msg.what==1) {
				mTopcity.setText(cityName);
			}
			return false;
		}
	});
	//獲取對應位置的經緯度並且定位城市
	private void updateWithNewLocation(Location location) {
		double lat = 0.0,lng = 0.0;
		if (location!=null) {
			lat = location.getLatitude();
			lng = location.getLongitude();
			Log.i("TAG", "經度是"+lat+"緯度是"+lng);
		}else {
			cityName = "無法獲取城市信息";
			
		}
		//通過經緯度獲取地址
		List<Address> list = null;
		Geocoder geocoder = new Geocoder(getActivity());
		try {
			list = geocoder.getFromLocation(lat, lng, 2);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		if (list!=null&&list.size()>0) {
			for (int i = 0; i < list.size(); i++) {
				Address address = list.get(i);
				cityName = address.getLocality();//獲取城市
			}
		}
		//發送空消息
		handler.sendEmptyMessage(1);
	}
	//位置信息更改執行方法
	@Override
	public void onLocationChanged(Location location) {
		// 更新當前的位置信息
		updateWithNewLocation(location);
		
	}
	//狀態信息改變
	@Override
	public void onStatusChanged(String provider, int status, Bundle extras) {
		
	}
	@Override
	public void onProviderEnabled(String provider) {
		
	}
	@Override
	public void onProviderDisabled(String provider) {
		
	}
	@Override
	public void onDestroy() {
		super.onDestroy();
		//保存城市
		SharedUtils.putCityName(getActivity(), cityName);
		//停止定位
		stopLocation();
	}
	//停止定位
	private  void stopLocation(){
		locationManager.removeUpdates(this);
	}
}

2)團購頁Fragment(FragmentTuan)

package com.sunny.dianping_client.fragment;

import com.sunny.dianping_client.R;

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

public class FragmentTuan extends Fragment {

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		return inflater.inflate(R.layout.main_tuan, container, false);
	}
}

3)發現頁Fragment(FragmentSearch)

package com.sunny.dianping_client.fragment;

import com.sunny.dianping_client.R;

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

public class FragmentSearch extends Fragment {

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		return inflater.inflate(R.layout.main_search, container, false);
	}
}


4)我的頁Fragment(FragmentMy)

package com.sunny.dianping_client.fragment;

import com.sunny.dianping_client.R;

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

public class FragmentMy extends Fragment {

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		return inflater.inflate(R.layout.main_my, container, false);
	}
}

4.使用SharedPreferences實現標記的寫入與讀取

package com.sunny.dianping_client.utils;

import android.R.bool;
import android.content.Context;
import android.content.SharedPreferences.Editor;
import android.widget.EditText;

/**
 * 實現標記的寫入讀取
 * @author sunnyhack
 */
public class SharedUtils {
	private static final String FILE_NAME = "dianping";
	private static final String MODE_NAME = "welcome";

	// 獲取flag標記值
	public static boolean getWelcomeFlag(Context context) {
		return context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE)
				.getBoolean(MODE_NAME, false);
	}

	// 寫入flag標記值
	public static void putWelcomeFlag(Context context, boolean isFirst) {
		Editor editor = context.getSharedPreferences(FILE_NAME,
				context.MODE_APPEND).edit();
		editor.putBoolean(MODE_NAME, isFirst);
		editor.commit();
	}

	// 寫入一個String類型的數據
	public static void putCityName(Context context, String cityName) {

		Editor editor = context.getSharedPreferences(FILE_NAME,
				Context.MODE_APPEND).edit();
		editor.putString("cityName", cityName);
		editor.commit();
	}

	// 獲取String類型的值
	public static String getCityName(Context context) {

		return context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE)
				.getString("cityName", "選擇城市");
	}

}

5.主界面按鈕圖片和文字的變色(主要使用選擇器實現)

1)字體顏色選擇器main_color_selector.xml

2)首頁圖片變色選擇器main_home_selector.xml

2)團購圖片變色選擇器main_tuan_selector.xml

2)發現圖片變色選擇器main_search_selector.xml

2)我的圖片變色選擇器main_my_selector.xml


   以上就是引導頁和主界面的實現,記錄下來給大家分享,一起交流學習~~

   源碼下載地址:http://download.csdn.net/detail/fysl1314/8802707

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章