大家好,今天主要是实现仿大众点评引导页和主页面以及城市定位的实现,主要使用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)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 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();

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

 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

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

以上就是引导页和主界面的实现,记录下来给大家分享,一起交流学习~~

android自定义引导页,Android仿大众点评引导页(ViewPage)+主页面(Fragment)的实现相关推荐

  1. Android高仿大众点评(带服务端)

    2019独角兽企业重金招聘Python工程师标准>>> 实例讲解了一个类似大众点评的项目,项目包含服务端和android端源码, 服务端为php代码,如果没有接触过php, 文章中讲 ...

  2. android 高仿大众点评,高仿大众点评商家列表

    原生android,高仿大众点评商家列表; 废话不多说了,上代码,效果图 适配器 class MyAdapter extends BaseAdapter { protected final int m ...

  3. 【Android重量级】高仿大众点评源码

    高仿大众点评源码   下载地址:http://url.cn/Nzj3Lc    源码简介 声明:本源码只用于个人研究使用,不可用于商业用途,由于本源码引起的纠纷皆与作者无关. 本套源码是本人在校的时候 ...

  4. android 日历翻页动画,Android 仿日历翻页、仿htc时钟翻页、数字翻页切换效果

    废话不多说,效果图: 自定义控件找自网络,使用相对简单,具体还没有来得及深入研究,只是先用笨方法大概实现了想要的效果,后续有空会仔细研究再更新文章, 本demo切换方法是用的笨方法,也就是由新数字和旧 ...

  5. 《仿大众点评仿美团做一个评价网站——Java SSM》项目研发阶段性总结

    <仿大众点评仿美团做一个评价网站--Java SSM>项目研发阶段性总结 一.后台功能实现 (一).注册商家 (二).登录商家中心 (三).商家登录后台操作模块 (1).用户管理模块 (1 ...

  6. android 自定义输入法布局,Android自定义输入法使用方法

    Android自定义输入法使用方法 时间:2017-04-21     来源:Android开发学习网 对于Android用户而言,一般都会使用第三方的输入法.可是在输入密码时(尤其是支付相关的密码) ...

  7. Vue 仿大众点评项目

    项目地址 vue-dianping 仿大众点评Vue项目 技术栈: Vue Vuex Vue-Router Vue-Cli Vant Express Sequelize PostgreSql 实现功能 ...

  8. 仿大众点评——商品的详情页面

    我写的仿大众点评中有许多猜你喜欢的商品,但是每个商品详情页面都是用的一个vue组件,这个时候就需要我们使用动态路由,根据动态路径键的变化从未进入不同的商品详情页面 动态路由 export defaul ...

  9. android 自定义dialog样式,Android 自定义dialog类

    首先定制style样式 styles.xml 加入自定义样式 @null true true true @color/transparent @color/transparent true 0.6 在 ...

最新文章

  1. 解决github很慢的问题
  2. LeetCode-剑指 Offer 10- I. 斐波那契数列
  3. Go语言 - 忍不了了!!!已将Go语言各标准包文档.移到自己服务器上
  4. 树莓派使用STEP6:安装git
  5. 四阶混合累积量matlab_12m氢燃料电池城市客车电电混合动力系统设计方案
  6. 不使用自带函数求区域的周长_Excel表格中最强大求和函数______DSUM函数
  7. MyEclipse6.5安装SVN插件的三种方法
  8. Linux/Aix日常报错整理
  9. matlab高等数学实验答案,高等数学实验matlab参考完整答案.doc
  10. Win10,Office2016及以上图标异常解决方案
  11. 2018 Multi-University Training Contest 3 hdu多校第三场 Problem A:Ascending Rating(单调队列)
  12. Java原生图片Base64转码与Base64解码
  13. 大数据还能火多久?现在学习还来得及吗?
  14. 微软官方dllcache恢复的批处理
  15. 漫威超级争霸战辅助脚本,快速刷星币打竞技场副本
  16. VMware WorKstation虚拟机上 Linux 6最小化安装和基本网络环境配置
  17. 杭电 2022 海选女主角
  18. 最简单的P2P加密聊天软件开发准备
  19. 【职业经验】三年数据沉淀!2020 年度测试行业问卷调查结果火热出炉!
  20. 【XMind学习笔记02】 你不得不知的5大功能

热门文章

  1. 纯CSS3实现(无图片)的彩色条纹电子明信片
  2. linux下编写照相机应用程序,Linux下的图片编辑软件
  3. 机器人控制与轨迹规划
  4. 【神经网络与深度学习】第一章 使用神经网络来识别手写数字
  5. 疫情数据分析与可视化
  6. 爬取豆瓣短评制作词云
  7. 代码托管系统php,体验了一下CODE代码托管平台 | 求索阁
  8. [Unity]如何加载Sprite(Multiple)中的Child Sprites
  9. 即时配送:新零售时代的“物流新战场”
  10. 中国足球队输球的原因大总结