大家好,今天主要是实现仿大众点评引导页和主页面以及城市定位的实现,主要使用ViewPager+Fragment+SharedPreferences,实现了第一次打开程序出现引导页,再次打开跳过引导页,这也是一般应用常用的应用基本架构方式。下面首先来看最终实现效果如下图:
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)packagecom.sunny.dianping_client;
importjava.util.Timer;
importjava.util.TimerTask;
importcom.sunny.dianping_client.utils.SharedUtils;
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Message;
publicclassWelcomeStartActivityextendsActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome);
//使用Handler实现延时跳转
//newHandler(newHandler.Callback(){
//
//@Override
//publicbooleanhandleMessage(Messagemsg){
页面跳转
//startActivity(newIntent(getApplicationContext(),MainActivity.class));
//returnfalse;
//}
//}).sendEmptyMessageDelayed(0,3000);//表示任务延时三秒执行
//使用Java定时器实现延时跳转
Timertimer=newTimer();
timer.schedule(newTask(),3000);//定时器延时执行任务的方法
}
classTaskextendsTimerTask{
@Override
publicvoidrun(){
//实现页面的跳转
//不是第一次启动
if(SharedUtils.getWelcomeFlag(getBaseContext())){
startActivity(newIntent(getBaseContext(),MainActivity.class));
}else{
startActivity(newIntent(WelcomeStartActivity.this,WelcomeGuideActivity.class));
//保存访问记录
SharedUtils.putWelcomeFlag(getBaseContext(),true);
}
finish();
}
}
}
2) 引导页Activity(WelcomeGuideActivity)packagecom.sunny.dianping_client;
importjava.util.ArrayList;
importjava.util.List;
importcom.lidroid.xutils.ViewUtils;
importcom.lidroid.xutils.view.annotation.ViewInject;
importcom.lidroid.xutils.view.annotation.event.OnClick;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.support.v4.view.PagerAdapter;
importandroid.support.v4.view.ViewPager;
importandroid.support.v4.view.ViewPager.OnPageChangeListener;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.Button;
importandroid.widget.ImageView;
publicclassWelcomeGuideActivityextendsActivity{
@ViewInject(R.id.btn_welcome_guide)
privateButtonmComeIn;
@ViewInject(R.id.id_welcome_pager)
privateViewPagermViewPager;
privateListlist;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome_guide);
ViewUtils.inject(this);
initViewPager();
}
@OnClick(R.id.btn_welcome_guide)
publicvoidclick(Viewview){
//实现页面的跳转
startActivity(newIntent(getBaseContext(),MainActivity.class));
finish();
}
//初始化ViewPager
publicvoidinitViewPager(){
list=newArrayList();
ImageViewiv=newImageView(this);
iv.setImageResource(R.drawable.guide_01);
list.add(iv);
ImageViewiv1=newImageView(this);
iv1.setImageResource(R.drawable.guide_02);
list.add(iv1);
ImageViewiv2=newImageView(this);
iv2.setImageResource(R.drawable.guide_03);
list.add(iv2);
mViewPager.setAdapter(newMyPagerAdapter());
//监听ViewPager滑动效果
mViewPager.setOnPageChangeListener(newOnPageChangeListener(){
//页卡被选中的效果
@Override
publicvoidonPageSelected(intarg0){
if(arg0==2){
mComeIn.setVisibility(View.VISIBLE);
}else{
mComeIn.setVisibility(View.GONE);
}
}
@Override
publicvoidonPageScrolled(intarg0,floatarg1,intarg2){
}
@Override
publicvoidonPageScrollStateChanged(intarg0){
}
});
}
//定义ViewPager的适配器
classMyPagerAdapterextendsPagerAdapter{
//计算需要多少Items显示
@Override
publicintgetCount(){
returnlist.size();
}
@Override
publicbooleanisViewFromObject(Viewarg0,Objectarg1){
returnarg0==arg1;
}
//初始化Item实例的方法
@Override
publicObjectinstantiateItem(ViewGroupcontainer,intposition){
container.addView(list.get(position));
returnlist.get(position);
}
//Item销毁的方法
@Override
publicvoiddestroyItem(ViewGroupcontainer,intposition,Objectobject){
/**
*销毁Item的方法不使用系统定义销毁Item的方法,而是使用我们自己定义的形式,将一个View对象从ViewPager中移除
*/
//super.destroyItem(container,position,object);
container.removeView(list.get(position));
}
}
}
3) 主页面Activity(MainActivity)packagecom.sunny.dianping_client;
importcom.lidroid.xutils.ViewUtils;
importcom.lidroid.xutils.view.annotation.ViewInject;
importcom.lidroid.xutils.view.annotation.event.OnClick;
importcom.sunny.dianping_client.fragment.FragmentHome;
importcom.sunny.dianping_client.fragment.FragmentMy;
importcom.sunny.dianping_client.fragment.FragmentSearch;
importcom.sunny.dianping_client.fragment.FragmentTuan;
importandroid.os.Bundle;
importandroid.app.Activity;
importandroid.support.v4.app.Fragment;
importandroid.support.v4.app.FragmentActivity;
importandroid.support.v4.app.FragmentManager;
importandroid.support.v4.app.FragmentTransaction;
importandroid.view.Menu;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.view.Window;
importandroid.widget.Button;
importandroid.widget.RadioButton;
importandroid.widget.RadioGroup;
importandroid.widget.RadioGroup.OnCheckedChangeListener;
importandroid.widget.Toast;
publicclassMainActivityextendsFragmentActivityimplementsOnCheckedChangeListener{
@ViewInject(R.id.main_bottom_tabs)
privateRadioGroupmGroup;
@ViewInject(R.id.main_home)
privateRadioButtonmain_home;
privateFragmentManagerfragmentManager;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
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(newFragmentHome(),false);
}
@Override
publicvoidonCheckedChanged(RadioGroupgroup,intcheckedId){
//选中不同的Fragment
switch(checkedId){
caseR.id.main_home://首页
changeFragment(newFragmentHome(),true);
break;
caseR.id.main_tuan://团购
changeFragment(newFragmentTuan(),true);
break;
caseR.id.main_search://发现
changeFragment(newFragmentSearch(),true);
break;
caseR.id.main_my://我的
changeFragment(newFragmentMy(),true);
break;
default:
break;
}
}
//切换不同的Fragment
publicvoidchangeFragment(Fragmentfragment,booleanisInit){
//开启事物
FragmentTransactionbeginTransaction=fragmentManager.beginTransaction();
beginTransaction.replace(R.id.main_content,fragment);
if(!isInit){
//加上该段代码Fragment就不会出现重影的效果
beginTransaction.addToBackStack(null);
}
mit();
}
}
3.主界面Fragment的实现
1)首页Fragment(FragmentHome)packagecom.sunny.dianping_client.fragment;
importjava.util.List;
importcom.lidroid.xutils.ViewUtils;
importcom.lidroid.xutils.view.annotation.ViewInject;
importcom.sunny.dianping_client.R;
importcom.sunny.dianping_client.utils.SharedUtils;
importandroid.support.v4.app.Fragment;
importandroid.content.Context;
importandroid.content.Intent;
importandroid.location.Address;
importandroid.location.Geocoder;
importandroid.location.Location;
importandroid.location.LocationListener;
importandroid.location.LocationManager;
importandroid.provider.Settings;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.util.Log;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.TextView;
publicclassFragmentHomeextendsFragmentimplementsLocationListener{
@ViewInject(R.id.main_top_city)
privateTextViewmTopcity;
privateStringcityName;
privateLocationManagerlocationManager;
@Override
publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,
BundlesavedInstanceState){
Viewview=inflater.inflate(R.layout.main_home,container,false);
ViewUtils.inject(this,view);
//获取数据并显示
mTopcity.setText(SharedUtils.getCityName(getActivity()));
returnview;
}
@Override
publicvoidonStart(){
super.onStart();
//检查GPS是否打开
checkGPSisOpen();
}
//检查Gps是否打开
privatevoidcheckGPSisOpen(){
//获取当前LocationManager对象
locationManager=(LocationManager)getActivity().getSystemService(Context.LOCATION_SERVICE);
booleanisOpen=locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if(!isOpen){
Intentintent=newIntent();
intent.setAction(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivityForResult(intent,0);
}
//开始定位
startLocation();
}
//使用GPS定位的方法
privatevoidstartLocation(){
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,2000,10,this);
}
//接收并处理消息
privateHandlerhandler=newHandler(newHandler.Callback(){
@Override
publicbooleanhandleMessage(Messagemsg){
if(msg.what==1){
mTopcity.setText(cityName);
}
returnfalse;
}
});
//获取对应位置的经纬度并且定位城市
privatevoidupdateWithNewLocation(Locationlocation){
doublelat=0.0,lng=0.0;
if(location!=null){
lat=location.getLatitude();
lng=location.getLongitude();
Log.i("TAG","经度是"+lat+"纬度是"+lng);
}else{
cityName="无法获取城市信息";
}
//通过经纬度获取地址
List
list=null;
Geocodergeocoder=newGeocoder(getActivity());
try{
list=geocoder.getFromLocation(lat,lng,2);
}catch(Exceptione){
//TODO:handleexception
e.printStackTrace();
}
if(list!=null&&list.size()>0){
for(inti=0;i
Addressaddress=list.get(i);
cityName=address.getLocality();//获取城市
}
}
//发送空消息
handler.sendEmptyMessage(1);
}
//位置信息更改执行方法
@Override
publicvoidonLocationChanged(Locationlocation){
//更新当前的位置信息
updateWithNewLocation(location);
}
//状态信息改变
@Override
publicvoidonStatusChanged(Stringprovider,intstatus,Bundleextras){
}
@Override
publicvoidonProviderEnabled(Stringprovider){
}
@Override
publicvoidonProviderDisabled(Stringprovider){
}
@Override
publicvoidonDestroy(){
super.onDestroy();
//保存城市
SharedUtils.putCityName(getActivity(),cityName);
//停止定位
stopLocation();
}
//停止定位
privatevoidstopLocation(){
locationManager.removeUpdates(this);
}
}
2)团购页Fragment(FragmentTuan)packagecom.sunny.dianping_client.fragment;
importcom.sunny.dianping_client.R;
importandroid.support.v4.app.Fragment;
importandroid.os.Bundle;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
publicclassFragmentTuanextendsFragment{
@Override
publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,
BundlesavedInstanceState){
returninflater.inflate(R.layout.main_tuan,container,false);
}
}
3)发现页Fragment(FragmentSearch)packagecom.sunny.dianping_client.fragment;
importcom.sunny.dianping_client.R;
importandroid.support.v4.app.Fragment;
importandroid.os.Bundle;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
publicclassFragmentSearchextendsFragment{
@Override
publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,
BundlesavedInstanceState){
returninflater.inflate(R.layout.main_search,container,false);
}
}
4)我的页Fragment(FragmentMy)packagecom.sunny.dianping_client.fragment;
importcom.sunny.dianping_client.R;
importandroid.os.Bundle;
importandroid.support.v4.app.Fragment;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
publicclassFragmentMyextendsFragment{
@Override
publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,
BundlesavedInstanceState){
returninflater.inflate(R.layout.main_my,container,false);
}
}
4.使用SharedPreferences实现标记的写入与读取packagecom.sunny.dianping_client.utils;
importandroid.R.bool;
importandroid.content.Context;
importandroid.content.SharedPreferences.Editor;
importandroid.widget.EditText;
/**
*实现标记的写入读取
*@authorsunnyhack
*/
publicclassSharedUtils{
privatestaticfinalStringFILE_NAME="dianping";
privatestaticfinalStringMODE_NAME="welcome";
//获取flag标记值
publicstaticbooleangetWelcomeFlag(Contextcontext){
returncontext.getSharedPreferences(FILE_NAME,context.MODE_PRIVATE)
.getBoolean(MODE_NAME,false);
}
//写入flag标记值
publicstaticvoidputWelcomeFlag(Contextcontext,booleanisFirst){
Editoreditor=context.getSharedPreferences(FILE_NAME,
context.MODE_APPEND).edit();
editor.putBoolean(MODE_NAME,isFirst);
mit();
}
//写入一个String类型的数据
publicstaticvoidputCityName(Contextcontext,StringcityName){
Editoreditor=context.getSharedPreferences(FILE_NAME,
Context.MODE_APPEND).edit();
editor.putString("cityName",cityName);
mit();
}
//获取String类型的值
publicstaticStringgetCityName(Contextcontext){
returncontext.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
以上就是引导页和主界面的实现,记录下来给大家分享,一起交流学习~~