android自定义引导页,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)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)的实现相关推荐
- Android高仿大众点评(带服务端)
2019独角兽企业重金招聘Python工程师标准>>> 实例讲解了一个类似大众点评的项目,项目包含服务端和android端源码, 服务端为php代码,如果没有接触过php, 文章中讲 ...
- android 高仿大众点评,高仿大众点评商家列表
原生android,高仿大众点评商家列表; 废话不多说了,上代码,效果图 适配器 class MyAdapter extends BaseAdapter { protected final int m ...
- 【Android重量级】高仿大众点评源码
高仿大众点评源码 下载地址:http://url.cn/Nzj3Lc 源码简介 声明:本源码只用于个人研究使用,不可用于商业用途,由于本源码引起的纠纷皆与作者无关. 本套源码是本人在校的时候 ...
- android 日历翻页动画,Android 仿日历翻页、仿htc时钟翻页、数字翻页切换效果
废话不多说,效果图: 自定义控件找自网络,使用相对简单,具体还没有来得及深入研究,只是先用笨方法大概实现了想要的效果,后续有空会仔细研究再更新文章, 本demo切换方法是用的笨方法,也就是由新数字和旧 ...
- 《仿大众点评仿美团做一个评价网站——Java SSM》项目研发阶段性总结
<仿大众点评仿美团做一个评价网站--Java SSM>项目研发阶段性总结 一.后台功能实现 (一).注册商家 (二).登录商家中心 (三).商家登录后台操作模块 (1).用户管理模块 (1 ...
- android 自定义输入法布局,Android自定义输入法使用方法
Android自定义输入法使用方法 时间:2017-04-21 来源:Android开发学习网 对于Android用户而言,一般都会使用第三方的输入法.可是在输入密码时(尤其是支付相关的密码) ...
- Vue 仿大众点评项目
项目地址 vue-dianping 仿大众点评Vue项目 技术栈: Vue Vuex Vue-Router Vue-Cli Vant Express Sequelize PostgreSql 实现功能 ...
- 仿大众点评——商品的详情页面
我写的仿大众点评中有许多猜你喜欢的商品,但是每个商品详情页面都是用的一个vue组件,这个时候就需要我们使用动态路由,根据动态路径键的变化从未进入不同的商品详情页面 动态路由 export defaul ...
- android 自定义dialog样式,Android 自定义dialog类
首先定制style样式 styles.xml 加入自定义样式 @null true true true @color/transparent @color/transparent true 0.6 在 ...
最新文章
- 解决github很慢的问题
- LeetCode-剑指 Offer 10- I. 斐波那契数列
- Go语言 - 忍不了了!!!已将Go语言各标准包文档.移到自己服务器上
- 树莓派使用STEP6:安装git
- 四阶混合累积量matlab_12m氢燃料电池城市客车电电混合动力系统设计方案
- 不使用自带函数求区域的周长_Excel表格中最强大求和函数______DSUM函数
- MyEclipse6.5安装SVN插件的三种方法
- Linux/Aix日常报错整理
- matlab高等数学实验答案,高等数学实验matlab参考完整答案.doc
- Win10,Office2016及以上图标异常解决方案
- 2018 Multi-University Training Contest 3 hdu多校第三场 Problem A:Ascending Rating(单调队列)
- Java原生图片Base64转码与Base64解码
- 大数据还能火多久?现在学习还来得及吗?
- 微软官方dllcache恢复的批处理
- 漫威超级争霸战辅助脚本,快速刷星币打竞技场副本
- VMware WorKstation虚拟机上	Linux 6最小化安装和基本网络环境配置
- 杭电 2022 海选女主角
- 最简单的P2P加密聊天软件开发准备
- 【职业经验】三年数据沉淀!2020 年度测试行业问卷调查结果火热出炉!
- 【XMind学习笔记02】 你不得不知的5大功能