高仿淘宝送货地址暴走漫画系列(附demo)
演讲: 我是个程序员,一天我坐在路边一边喝水一边苦苦检查bug。
这时一个乞丐在我边上坐下了,開始要饭,我认为可怜。就给了他1块钱。 然后接着调试程序。他可能生意不好,就无聊的看看我在干什么。然后过了一会。他缓缓地指着我的屏幕说,这里少了个分号…
谁说咱们程序员不能写出既幽默又能懂的博客呢,本人想推出一系列博文,能够给刚接触Android开发的做一个參考,也能够与接触Android已久的各路大神比較一下,本人喜欢交流,假设有写得不好的地方,欢迎大家指出.假设有更好的效果或者功能,希望大家多多指点,互相学习能够共同进步.
说了这么多,如今进入今天的猪蹄,推出<<暴走漫画系列--高仿淘宝收货地址>>,有网购经验的同学应该对这个非常熟悉,在淘宝的Androidclient里面,有一个功能是设置收货地址,不清楚的同学能够自己下载个淘宝client,自己加入一下看看.
本人一向喜欢贴图,这样有图有真相,才干说服每一个人,废话不多说先上自己程序启动画面,然后执行界面,最后一张是淘宝client对比图.
图片震楼
启动界面
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ2hpbGxheF9saQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="180" height="300" alt="" style="font-size:24px">执行界面
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ2hpbGxheF9saQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="180" height="300" alt="" style="font-size:24px">淘宝界面
淘宝client无法录屏所以这里仅仅能上静态的,大家能够自己打开淘宝client看看.
以下进行具体的代码解说:
(一)本人在程序启动的时候开了一条后台服务landDivideServeice,目的是为了将全国的省市县总共4,189条数据插入到手机数据库里面去,原本的数据是保存在7个txt里面的,因为放在txt里面,读取操作非常不方便,所以我把它放到数据库,在后面的地区筛选非常快就出来,这个比淘宝还快哦,不信你们能够试一下.
这里要注意的一点是landDivideServeice是继承IntentService的,不是直接继承Service的.
IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统Service一样,同一时候,当任务运行完后,IntentService会自己主动停止,而不须要我们去手动控制。
简单的说IntentService类似于一条后台线程,但操作完毕时,我们不用手动去关闭Serveice,他会自己主动关闭.MyIntentService继承IntentService,之后必须实现一个无參数的构造方法MyIntentService(),然后还要重写onHandleIntent(Intent
intent);此后全部的后台操作就可以在onHandleIntent(Intent intent)运行;
public class MyIntentService extends IntentService {
//必须实现的
public MyIntentService() {
super("MyIntentService");
// TODO Auto-generated constructor stub
}
@Override
protected void onHandleIntent(Intent arg0) {
// TODO Auto-generated method stub
//详细的操作
}
}
so
ga...
IntentService具体解析:
http://blog.csdn.net/ryantang03/article/details/8146154
http://blog.csdn.net/flowingflying/article/details/7616333
(二)在程序启动的第一个activity里,我弄了一条倒计时线程,时间总共是20秒,目的是想为数据写入数据库争取多一些时间,假设你进入地址筛选界面,看到数据不全或者报错,是由于数据还没有写完.
实现倒计时功能主要是继承CountDownTimer类,重写onTick和onFinsh这两个方法,onFinish()中的代码是计时器结束的时候要做的事情;onTick(Long m)中的代码是你倒计时開始时要做的事情,构造方法TimeCount()中的两个參数中,前者是倒计的时间数,后者是倒计每秒中间
的间隔时间,都是以毫秒为单位.比如要倒计时30秒,每秒中间间隔时间是1秒,两个參数能够这样写TimeCount(20000,1000).
TimeCount time = new TimeCount(20000, 1000);
time.start();
/* 定义一个倒计时的内部类 */
class TimeCount extends CountDownTimer {
public TimeCount(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
} @Override
public void onFinish() { //倒计时运行结束时操作
next = 0;
} @Override
public void onTick(long millisUntilFinished) { //倒计运行时操作
}
}
(三)剩下的主要是一些界面的切换跟数据的读取,仅仅要思路正确是不会被搞混的.
landDivideDB = LandDivideDB.getInstance(getBaseContext());
List<LandDivide> landDivide = landDivideDB.queryAddress("superior=?", new String[]{"1"});
Iterator<LandDivide> iterator = null;
if(landDivide!=null){
iterator = landDivide.iterator(); while(iterator.hasNext()){
LandDivide l = iterator.next();
sheng.add(l.getName());
}
}else{
return;
}
mListView1.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
// TODO Auto-generated method stub
mLinearLayout1.setVisibility(View.GONE);
mLinearLayout2.setVisibility(View.VISIBLE);
mLinearLayout3.setVisibility(View.GONE);
shi.clear();
String name = sheng.get(position);
String code = null;
shengStr = name;
shengTxt2.setText(name);
List<LandDivide> landDivide = landDivideDB.queryAddress("name=?", new String[]{name});
Iterator<LandDivide> iterator= landDivide.iterator();
while(iterator.hasNext()){
LandDivide l = iterator.next();
code = l.getCode();
break;
}
List<LandDivide> landDivide_2 = landDivideDB.queryAddress("superior=?", new String[]{code});
Iterator<LandDivide> iterator_2= landDivide_2.iterator();
while(iterator_2.hasNext()){
LandDivide l = iterator_2.next();
shi.add(l.getName());
}
shiAdapter.notifyDataSetChanged();
quAdapter.clear();
quAdapter.notifyDataSetChanged();
}
});
mListView2.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?
> arg0, View arg1, int position,
long arg3) {
// TODO Auto-generated method stub
qu.clear();
String name = shi.get(position);
String code = null;
shiStr = name;
shengTxt3.setText(shengStr);
shiTxt3.setText(name);
List<LandDivide> landDivide = landDivideDB.queryAddress("name=?", new String[]{name});
Iterator<LandDivide> iterator= landDivide.iterator();
while(iterator.hasNext()){
LandDivide l = iterator.next();
code = l.getCode();
break;
}
List<LandDivide> landDivide_2 = landDivideDB.queryAddress("superior=?
", new String[]{code});
if(landDivide_2!=null){
Iterator<LandDivide> iterator_2= landDivide_2.iterator();
while(iterator_2.hasNext()){
LandDivide l = iterator_2.next();
qu.add(l.getName());
}
}
quAdapter.notifyDataSetChanged();
if(qu.size()<1){
mLinearLayout1.setVisibility(View.GONE);
mLinearLayout2.setVisibility(View.VISIBLE);
mLinearLayout3.setVisibility(View.GONE);
Intent i = new Intent(AddressChoose.this,BuyAddress.class);
i.putExtra("address", shengStr+","+shiStr);
startActivity(i);
finish();
}else{
mLinearLayout1.setVisibility(View.GONE);
mLinearLayout2.setVisibility(View.GONE);
mLinearLayout3.setVisibility(View.VISIBLE);
mListView3.setVisibility(View.VISIBLE);
topView3.setText("请选择 县区/其它...");
}
}
});
mListView3.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
// TODO Auto-generated method stub
String name = qu.get(position);
quStr = name;
Intent i2 = new Intent(AddressChoose.this,BuyAddress.class);
i2.putExtra("address", shengStr+" "+shiStr+" "+quStr);
startActivity(i2);
finish();
}
});
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ2hpbGxheF9saQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="196" height="392" alt="">
(四)这个是选择好地址之后的界面,主要还是界面的转换跟焦点的获取
有时候setFocusable(true)跟setFocusableInTouchMode(true)并不能使控件获得焦点,要再之前加上一句requestFocus(),这样控件就能够获得焦点.
OnFocusChangeListener focusChanger = new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
// TODO Auto-generated method stub
myAddress.setStreet(jiequText.getText().toString());
myAddress.setName(nameText.getText().toString());
myAddress.setPhone(phoneText.getText().toString());
switch (v.getId()) {
case R.id.my_set_buyaddress_jiequ:
if (!hasFocus && myAddress.getStreet().length() > 0) {
jiequText.setVisibility(View.GONE);
jiequLinear.setVisibility(View.VISIBLE);
jiequTextView.setText(myAddress.getStreet());
}
if (hasFocus) {
jiequText.setSelectAllOnFocus(true);
}
break;
case R.id.my_set_buyaddress_name:
if (!hasFocus && myAddress.getName().length() > 0) {
nameText.setVisibility(View.GONE);
nameLinear.setVisibility(View.VISIBLE);
nameTextView.setText(myAddress.getName());
}
if (hasFocus) {
nameText.setSelectAllOnFocus(true);
}
break;
case R.id.my_set_buyaddress_phone:
if (!hasFocus && myAddress.getPhone().length() > 0) {
phoneText.setVisibility(View.GONE);
phoneLinear.setVisibility(View.VISIBLE);
phoneTextView.setText(myAddress.getPhone());
}
if (hasFocus) {
phoneText.setSelectAllOnFocus(true);
}
break;
default:
break;
}
}
};
OnClickListener click = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.my_set_buyaddress_sheng_linear:
Intent i = new Intent(BuyAddress.this, AddressChoose.class);
i.putExtra("Boolean", "aaa");
startActivity(i);
break;
case R.id.my_set_buyaddress_jiequ_linear:
jiequText.setVisibility(View.VISIBLE);
jiequLinear.setVisibility(View.GONE);
jiequText.setFocusable(true);
jiequText.setFocusableInTouchMode(true);
jiequText.requestFocus();
break;
case R.id.my_set_buyaddress_name_linear:
nameText.setVisibility(View.VISIBLE);
nameLinear.setVisibility(View.GONE);
nameText.setFocusable(true);
nameText.setFocusableInTouchMode(true);
nameText.requestFocus();
break;
case R.id.my_set_buyaddress_phone_linear:
phoneText.setVisibility(View.VISIBLE);
phoneLinear.setVisibility(View.GONE);
phoneText.setFocusable(true);
phoneText.setFocusableInTouchMode(true);
phoneText.requestFocus();
break;
case R.id.my_set_buyaddress_address_btn:
myAddress.setStreet(jiequText.getText().toString());
myAddress.setName(nameText.getText().toString());
myAddress.setPhone(phoneText.getText().toString());
if (myAddress.getPhone().length() > 0) {
phoneText.setVisibility(View.GONE);
phoneLinear.setVisibility(View.VISIBLE);
phoneTextView.setText(myAddress.getPhone());
}
postBtn.requestFocus();
postBtn.setFocusable(true);
postBtn.setFocusableInTouchMode(true);
if (myAddress.getProvinces().length() < 1 || myAddress.getStreet().length() < 1
|| myAddress.getName().length() < 1 || myAddress.getPhone().length() < 1) {
Toast.makeText(getBaseContext(), "请完整填写收货人资料", 0).show();
return;
}
myAddress.setStatus(checkBox.isChecked());
AddressDB addressDB = AddressDB.getInstance(getBaseContext());
if(checkBox.isChecked()){
List<AddressInfo> list = addressDB.queryAddress();
if(list!=null){
Iterator<AddressInfo> iterator = list.iterator();
while(iterator.hasNext()){
AddressInfo a = iterator.next();
a.setStatus(false);
addressDB.updeteAddress(a);
}
}
}
if (addressinfo != null) {
if(addressDB.updeteAddress(myAddress)){
Toast.makeText(getBaseContext(), "改动收货地址成功", Toast.LENGTH_LONG).show();
}else{
Toast.makeText(getBaseContext(), "改动收货地址失败", Toast.LENGTH_LONG).show();
}
} else {
SimpleDateFormat format = new SimpleDateFormat(
"yyyyMMddHHmmss");
Date date = new Date();
String id = format.format(date);
myAddress.setId(id);
if(addressDB.insertAddress(myAddress)){
Toast.makeText(getBaseContext(), "加入收货地址成功", Toast.LENGTH_LONG).show();
}else{
Toast.makeText(getBaseContext(), "加入收货地址失败", Toast.LENGTH_LONG).show();
}
}
Intent intent = new Intent(BuyAddress.this, PersonAddress.class);
startActivity(intent);
finish();
break;
case R.id.download_layout1:
finish();
break;
default:
break;
}
}
};
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ2hpbGxheF9saQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="195" height="392" alt="">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ2hpbGxheF9saQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="195" height="392" alt="">
源代码地址: http://down.51cto.com/data/1470577 (CSDN的上传了,可是不知道怎么的又没了,仅仅能用51CTO的)
尊重原创,转载请注明出处:http://blog.csdn.net/chillax_li/article/details/32936187
版权声明:本文博客原创文章,博客,未经同意,不得转载。
高仿淘宝送货地址暴走漫画系列(附demo)的更多相关文章
- 高仿淘宝和聚美优品商城详情页实现《IT蓝豹》
高仿淘宝和聚美优品商城详情页实现 android-vertical-slide-view高仿淘宝和聚美优品商城详情页实现,在商品详情页,向上拖动时,可以加载下一页. 使用ViewDragHelper, ...
- android版高仿淘宝客户端源码V2.3
android版高仿淘宝客户端源码V2.3,这个版本我已经更新到2.3了,源码也上传到源码天堂那里了,大家可以看一下吧,该应用实现了我们常用的购物功能了,也就是在手机上进行网购的流程的,如查看产品(浏 ...
- 基于Bootstrap仿淘宝分页控件实现
.header { cursor: pointer } p { margin: 3px 6px } th { background: lightblue; width: 20% } table { t ...
- 一款基于jQuery仿淘宝红色分类导航
今天给大家分享一款基于jQuery仿淘宝红色分类导航.这款分类导航适用浏览器:IE8.360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗.效果图如下: 在线预览 ...
- 淘宝IP地址库采集器c#代码
这篇文章主要介绍了淘宝IP地址库采集器c#代码,有需要的朋友可以参考一下. 最近做一个项目,功能类似于CNZZ站长统计功能,要求显示Ip所在的省份市区/提供商等信息.网上的Ip纯真数据库,下载下来一看 ...
- Android仿淘宝头条滚动广告条
之前我使用TextView+Handler+动画,实现了一个简单的仿淘宝广告条的滚动,https://download.csdn.net/download/qq_35605213/9660825: 无 ...
- 仿淘宝头像上传功能(三)——兼容 IE6 浏览器。
前两篇目录: 仿淘宝头像上传功能(一)——前端篇. 仿淘宝头像上传功能(二)——程序篇. 仿淘宝头像上传功能(三)——兼容 IE6 浏览器 之前的这两篇虽然实现了功能,但不兼容低版本浏览器,而且有些浏 ...
- 淘宝IP地址库采集器c#
个人原创.欢迎转载.转载请注明出处.http://www.cnblogs.com/zetee/articles/3482085.html 采集器概貌,如下: 最近做一个项目,功能类似于CNZZ站长统计 ...
- Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片
Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片 自定义ADPager 自定义水平滚动的ScrollView效仿ViewPager 当遇到要在Vie ...
随机推荐
- DOM中的动态NodeList与静态NodeList
GitHub版本号: https://github.com/cncounter/translation/blob/master/tiemao_2014/NodeList/NodeList.md 副标题 ...
- build setting
A build setting is a variable that contains information about how a particular aspect of a product’s ...
- 【译】ASP.NET MVC 5 教程 - 9:添加新字段
原文:[译]ASP.NET MVC 5 教程 - 9:添加新字段 在本节中,我们将使用Entity Framework Code First 数据迁移功能将模型类的改变应用到数据库中. 默认情况下,当 ...
- Android在如何建立一个WebServer
今天老板交待任务最终完成了,感觉收获颇多,所以写一个关于它的记录,首先,看一下.老板的需求 需求: 希望移动端的用户标识(IMEI)和HTML页面的用户标识(Cookie)连接起来,当中HTML页面可 ...
- Velocity缓存与穿透(转)
原文 http://fantaxy025025.iteye.com/blog/2283904 主题 Java 总评:只是标记一下这种用法hack方法.这种场景下用这种方法还是比较雷人的. Veloc ...
- Javascript 设计模式 辛格尔顿
转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/30490955 我一直很喜欢Js,,,今天写JsSingleton模式来实现,以及 ...
- [Network]Application Layer
1 Principles of Network Applications 1.1 Application Architectures Client-Server Peer-to-Peer Hybird ...
- C++使用函数模板
函数模板: 函数模板是蓝图或处方功能,编译器使用其发电功能系列中的新成员. 第一次使用时,新的功能是创建.从功能模板生成的函数的实例称为模板或模板的实例.函数模板的开始是keywordtemplate ...
- IIS6,IIS7中查看w3wp进程
当我们服务器创建了很多应用程序池,然后某个w3wp.exe进程占用CPU和内存过高,我们怎么查找这个w3wp.exe进程属于哪一个网站呢.其实微软为我们提供了很好的查看工具: 首先打开windows任 ...
- [Windows Phone] 地图控制项的经纬度
原文:[Windows Phone] 地图控制项的经纬度 前言 本文主要示范如何使用地图经纬度以及显示地标和行人街道,并透过卷轴控制地图缩放比例的功能. ? 实作 step1 建立专案. ? step ...