Android仿大众点评引导页(ViewPage)+主页面(Fragment)的实现
大家好,今天主要是实现仿大众点评引导页和主页面以及城市定位的实现,主要使用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{@OverrideprotectedvoidonCreate(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{@Overridepublicvoidrun(){//实现页面的跳转//不是第一次启动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;privateList<View>list;@OverrideprotectedvoidonCreate(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();}//初始化ViewPagerpublicvoidinitViewPager(){list=newArrayList<View>();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(){//页卡被选中的效果@OverridepublicvoidonPageSelected(intarg0){if(arg0==2){mComeIn.setVisibility(View.VISIBLE);}else{mComeIn.setVisibility(View.GONE);}}@OverridepublicvoidonPageScrolled(intarg0,floatarg1,intarg2){}@OverridepublicvoidonPageScrollStateChanged(intarg0){}});}//定义ViewPager的适配器classMyPagerAdapterextendsPagerAdapter{//计算需要多少Items显示@OverridepublicintgetCount(){returnlist.size();}@OverridepublicbooleanisViewFromObject(Viewarg0,Objectarg1){returnarg0==arg1;}//初始化Item实例的方法@OverridepublicObjectinstantiateItem(ViewGroupcontainer,intposition){container.addView(list.get(position));returnlist.get(position);}//Item销毁的方法@OverridepublicvoiddestroyItem(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;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);ViewUtils.inject(this);//初始化FragmentManagerfragmentManager=getSupportFragmentManager();//设置默认选中main_home.setChecked(true);mGroup.setOnCheckedChangeListener(this);changeFragment(newFragmentHome(),false);}@OverridepublicvoidonCheckedChanged(RadioGroupgroup,intcheckedId){//选中不同的Fragmentswitch(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;}}//切换不同的FragmentpublicvoidchangeFragment(Fragmentfragment,booleanisInit){//开启事物FragmentTransactionbeginTransaction=fragmentManager.beginTransaction();beginTransaction.replace(R.id.main_content,fragment);if(!isInit){//加上该段代码Fragment就不会出现重影的效果beginTransaction.addToBackStack(null);}beginTransaction.commit();}}
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;@OverridepublicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState){Viewview=inflater.inflate(R.layout.main_home,container,false);ViewUtils.inject(this,view);//获取数据并显示mTopcity.setText(SharedUtils.getCityName(getActivity()));returnview;}@OverridepublicvoidonStart(){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(){@OverridepublicbooleanhandleMessage(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<Address>list=null;Geocodergeocoder=newGeocoder(getActivity());try{list=geocoder.getFromLocation(lat,lng,2);}catch(Exceptione){//TODO:handleexceptione.printStackTrace();}if(list!=null&&list.size()>0){for(inti=0;i<list.size();i++){Addressaddress=list.get(i);cityName=address.getLocality();//获取城市}}//发送空消息handler.sendEmptyMessage(1);}//位置信息更改执行方法@OverridepublicvoidonLocationChanged(Locationlocation){//更新当前的位置信息updateWithNewLocation(location);}//状态信息改变@OverridepublicvoidonStatusChanged(Stringprovider,intstatus,Bundleextras){}@OverridepublicvoidonProviderEnabled(Stringprovider){}@OverridepublicvoidonProviderDisabled(Stringprovider){}@OverridepublicvoidonDestroy(){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{@OverridepublicViewonCreateView(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{@OverridepublicViewonCreateView(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{@OverridepublicViewonCreateView(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);editor.commit();}//写入一个String类型的数据publicstaticvoidputCityName(Contextcontext,StringcityName){Editoreditor=context.getSharedPreferences(FILE_NAME,Context.MODE_APPEND).edit();editor.putString("cityName",cityName);editor.commit();}//获取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
以上就是引导页和主界面的实现,记录下来给大家分享,一起交流学习~~
×××地址:http://download.csdn.net/detail/fysl1314/8802707
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。