目录

  • (一)简介
  • (二)开始工程
    • (1)在github上创建你的代码库
    • (2)编写布局文件
      • 2.1 MainActivity
      • 2.2 TraceAcvitity
      • 2.3 ToolBar 的使用
      • 2.4 依赖的引入
    • (3)项目的代码实现
      • 3.1 代码的整体理解
      • 3.2 MainActivity的代码实现
        • 3.2.1.onCreate
        • 3.2.2.按钮的onCLick事件
        • 3.2.3 加载Toolbar 以及 TooBar 的点击事件
      • 3.3 TraceActivity的代码实现
        • 3.3.1 有哪些免费的快递api?怎样使用api?
        • 3.3.2 Json数据的解析 以及onCreate方法的实现
        • 3.3.3 在主线程中更新数据
        • 3.3.4 RecycleView 的使用
  • (三)将代码push到github上
  • 尾巴:

(一)简介

  • 本文将带你手把手的实现一个简单的 android 查快递小程序 让你更了解
  • android 项目的创建
  • github的使用
  • JSON数据的解析
    以下是程序的截图(大神勿喷呀)


(二)开始工程

(1)在github上创建你的代码库

第一步:创建工程

输入项目名字 选择 类型 和 license

在AndroidStudio中创建同名工程

在bit bash 中 进入创建的工程目录 输入:
git clone (在github上你的新创建项目的地址)
例如 git clone https://github.com/LQF-dev/DaydayExpress.git

最后push到 github

 git add .git commit -m "你的commit"git push origin master

(2)编写布局文件

注意:布局代码有点繁琐,并且本人做的也不够好,若不按照此布局文件,可选择直接跳过,查看代码的实现板块

2.1 MainActivity

在主活动中我们会放置两个 EditText 以及一个按钮 并且会引入ToolBar 来代替原来的ActionBar

  • 以下是activity_main的代码
<?xml version="1.0" encoding="utf-8"?><androidx.drawerlayout.widget.DrawerLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/drawer_layout"android:layout_width="match_parent"android:layout_height="match_parent"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><androidx.appcompat.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:background="?attr/colorPrimary"android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> ><EditTextandroid:id="@+id/edit_expNu"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:hint="请输入快递单号"/><EditTextandroid:id="@+id/edit_expCode"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:layout_below="@+id/edit_expNu"android:hint="请输入快递公司名称"/><Buttonandroid:id="@+id/submit"android:layout_below="@+id/edit_expCode"android:layout_centerInParent="true"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="查询"/></RelativeLayout><com.google.android.material.navigation.NavigationViewandroid:id="@+id/nav_view"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="start"app:menu="@menu/nav_menu"app:headerLayout="@layout/nav_header"></com.google.android.material.navigation.NavigationView></androidx.drawerlayout.widget.DrawerLayout>

2.2 TraceAcvitity

  • 在此活动中存在
    toolbar 显示标题栏
    RelativeLayout 来容纳图片和运送信息
    LinearLayout 容纳辅助信息
    RecycleView 来显示快递追踪信息
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><androidx.appcompat.widget.Toolbarandroid:id="@+id/toolbar_trace"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:background="?attr/colorPrimary"android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/> ><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="20dp"android:padding="20dp"><ImageViewandroid:id="@+id/iv_companyImage"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_alignParentTop="true"android:src="@drawable/ic_express_64" /><TextViewandroid:id="@+id/text_state"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:layout_marginLeft="44dp"android:layout_marginTop="12dp"android:layout_toRightOf="@+id/iv_companyImage"android:text="正在运送" /><TextViewandroid:id="@+id/text_showNumber"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/text_state"android:layout_marginLeft="44dp"android:layout_toRightOf="@+id/iv_companyImage"android:text="快递单号" /></RelativeLayout><LinearLayoutandroid:orientation="horizontal"android:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:text="快速详情"android:layout_gravity="center"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"android:padding="10dp"/><TextViewandroid:id="@+id/tv_time_total"android:layout_gravity="center"android:text="耗时:"android:padding="10dp"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1"/></LinearLayout><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recycle_view_trace"android:layout_width="match_parent"android:layout_height="wrap_content"></androidx.recyclerview.widget.RecyclerView></LinearLayout>

2.3 ToolBar 的使用

android项目中默认显示的是ActionBar,故先要在 style.xml 文件中修改项目的主题才能使用Toobar

<resources><!-- Base application theme. --><style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"></style></resources>

以下是 toobar 的简单使用 我仅仅在 Toolbar 中增加了一个 扫一扫 的 item,小伙伴可按照你的需求增加不同的功能

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><itemandroid:id="@+id/scan"android:title="扫一扫"app:showAsAction="never"/>
</menu>

2.4 依赖的引入

(3)项目的代码实现

3.1 代码的整体理解

当前程序的思路非常简单

1. 本地调用查询快递 api,发送查询请求
   2. 接受解析得到的 json 数据,利用GSON或者其他的方式,将有效数据提取出来,
   3. 最后在主线程(UITHread)将数据显示出来即可

3.2 MainActivity的代码实现

  • 整体框架

3.2.1.onCreate

    @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//实例化各种控件Button submit = (Button)findViewById(R.id.submit);submit.setOnClickListener(this);expCode = (EditText)findViewById(R.id.edit_expCode);expNu =  (EditText)findViewById(R.id.edit_expNu);androidx.appcompat.widget.Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);setSupportActionBar(toolbar);mdrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout) ;//展示ActionBarActionBar actionBar = getSupportActionBar();if(actionBar != null){actionBar.setDisplayHomeAsUpEnabled(true);//Todo change icon lateractionBar.setHomeAsUpIndicator(R.drawable.ic_menu);}}

3.2.2.按钮的onCLick事件

  • 通过SharedPreferences 来储存输入的数据并且传递到 TraceActivity
  @Overridepublic void onClick(View v){switch (v.getId()){case R.id.submit:final String code = expCode.getText().toString();final String num = expNu.getText().toString();Log.d(TAG, "code = "+ code);Log.d(TAG, "num = " + num);if(!(code.equals("STO") || code.equals("YTO")|| code.equals("ZTO")) ){Toast.makeText(this, "仅支持 申通 圆通 中通", Toast.LENGTH_SHORT).show();}else{Toast.makeText(this, "查询成功", Toast.LENGTH_SHORT).show();}// 打开另一个activitySharedPreferences.Editor editor =  getSharedPreferences("data",MODE_PRIVATE).edit();editor.putString("code",code);editor.putString("number",num);editor.apply();Intent intent = new Intent(this,TraceActivity.class);startActivity(intent);}}

3.2.3 加载Toolbar 以及 TooBar 的点击事件

  • 我仅仅 只加入了 一个扫一扫的菜单
  public boolean onCreateOptionsMenu(Menu menu){getMenuInflater().inflate(R.menu.toolbar,menu);return true;}public boolean onOptionsItemSelected(MenuItem item){switch (item.getItemId()){case R.id.scan:Toast.makeText(this, "你点击了扫一扫按钮", Toast.LENGTH_SHORT).show();break;case android.R.id.home:Log.d(TAG, "onOptionsItemSelected: open_drawer");mdrawerLayout.openDrawer(GravityCompat.START);break;default:break;}return true;}

3.3 TraceActivity的代码实现

  • 整体框架

3.3.1 有哪些免费的快递api?怎样使用api?

可以使用快递100 快递鸟的api。 这里我使用的是快递鸟的免费版(快递鸟直接注册即可,快递100还需要审核)但是。。。快递鸟免费版本仅仅支持中通 圆通 申通三家的快递查询,具体情况可登录快递鸟的网站查询。
    当你得到你的id apikey就可以使用快递鸟的api了,但是如何使用呢?不用着急,我会给您介绍清楚的!

如下图所示,打开快递鸟提供的demo

   并将下载好的.java文件复制到你的项目下面 即可 如图:

   此接口KdniaoTrackQueryAPI 较为复杂,你不需要了解其中的具体实现,只需要知道存在一个getOrderByJson的方法,该方法需要你传进去两个参数(公司编号)(快递单号)即可返回 JSON 数据

3.3.2 Json数据的解析 以及onCreate方法的实现

  • 此为得到的 json 数据

由于我仅仅需要解析出来的物流轨迹,这里就不使用GSON 的解析方法了,而是直接转化为JSONObject 直接解析

 new Thread(new Runnable() {@Overridepublic void run() {try {//Log.d(TAG, "run: 进入run");//这里的 respond 就是 待解析的Json数据String respond = new KdniaoTrackQueryAPI().getOrderTracesByJson(code,num);// Log.d(TAG, "respond:  " + respond);JSONObject jsonObject = new JSONObject(respond);JSONArray array = jsonObject.getJSONArray("Traces");for (int i = 0; i < array.length(); i++) {JSONObject object = array.getJSONObject(i);String AcceptStation = object.getString("AcceptStation");stations.add(AcceptStation);String AcceptTime = object.getString("AcceptTime");times.add(AcceptTime);// Log.d(TAG, "AcceptStation:" + stations.get(i));// Log.d(TAG, "AcceptTime : " + times.get(i));//Log.d(TAG, "AcceptTime size: " + times.size());} try {Reason = jsonObject.getString("Reason");Log.d(TAG, "Reason: " + Reason);} catch (Exception e) {e.printStackTrace();//Log.d(TAG, "Reason: 正常查询无Reason 现在Reason:" + Reason);}catch (Exception e) {e.printStackTrace();}

数据已经得到,并且已经存在 两个list中,下一步就是更新数据了

3.3.3 在主线程中更新数据

 if(   Reason==null  ){runOnUiThread(new Runnable() {@Overridepublic void run() {//查询正确显示showInfo();}});}else {runOnUiThread(new Runnable() {@Overridepublic void run() {//查询不正确显示默认数据showDefaultInfo();}});}}}).start();//runable

showInfo() 以及 showDefaultInfo()的逻辑请看下面

  /*** 初始化 list 给recycleView的Adapter提供数据*/public void initLoadTrace(){for(int i =0;i < times.size();i++){LoadTrace loadTraceItem = new LoadTrace(stations.get(i),times.get(i));loadTraces.add(loadTraceItem);}}/*** 展示物流轨迹信息*/public void showTraceInfo(){initLoadTrace();RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);LoadTraceAdapter adapter = new LoadTraceAdapter(loadTraces);recyclerView.setLayoutManager(layoutManager);recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));recyclerView.setAdapter(adapter);}/***展示界面以及物流轨迹信息*/public void showInfo(){showTraceInfo();tv_showNumber.setText(LogisticCode);}/*** 展示默认信息*/public void showDefaultInfo(){tv_showNumber.setText("暂无");Toast.makeText(this, "请输入正确信息", Toast.LENGTH_SHORT).show();}

-此时整体逻辑基本结束。

3.3.4 RecycleView 的使用

这一节我就简要跳过,不懂的小伙伴请百度下RecycleView的使用

public class LoadTrace {private String traceInfo;private String time;public LoadTrace(String traceInfo,String time){this.traceInfo = traceInfo;this.time = time;}public String getTraceInfo() {return traceInfo;}public String getTime() {return time;}
}
public class LoadTraceAdapter extends RecyclerView.Adapter<LoadTraceAdapter.ViewHolder> {private List<LoadTrace>mLoadTraces;static class ViewHolder extends RecyclerView.ViewHolder{TextView traceInfo;TextView time;public ViewHolder(View view){super(view);traceInfo = (TextView)view.findViewById(R.id.tv_traceInfo);time = (TextView)view.findViewById(R.id.tv_time_item);}}public LoadTraceAdapter(List<LoadTrace>loadTraceList){mLoadTraces = loadTraceList;}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent , int viewType){View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.loadtrace_item,parent,false);ViewHolder holder = new ViewHolder(view);return holder;}//滚动到这里加载@Overridepublic void onBindViewHolder(ViewHolder holder,int position){LoadTrace loadTrace = mLoadTraces.get(position);holder.traceInfo.setText(loadTrace.getTraceInfo());holder.time.setText(loadTrace.getTime());}@Overridepublic  int  getItemCount(){return mLoadTraces.size();}}

(三)将代码push到github上

项目终于完成了! 这时候可以将我们的项目上传到 github 上管理。

尾巴:

谢谢能看到这里的小伙伴,本人也是第一次写这么长的博客,希望你能有所收获,也希望我们能一起努力,学好技术!
    要是有小伙伴不知道最终效果是什么,可以在github中download我的代码下面是我的源代码:
https://github.com/LQF-dev/DaydayExpress

点这里可直接跳转

手把手带你完成第一个 android 小程序(快递App)相关推荐

  1. 手把手教你调试构建一个Vue/小程序商城项目源码

    下面将详细的介绍weiphp5.0商城项目的调试打包上线的流程: 安装NodeJs/NPM 安装CNPM(可忽略) 运行项目 打包上线项目 1. 安装NodeJs 推荐到NodeJS的官网下载安装包 ...

  2. android 程序闪退 log,写了一个android小程序,测试的时候闪退,然鹅log并没有报错...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 layout是这样写的: xmlns:app="http://schemas.android.com/apk/res-auto" xm ...

  3. 利用css transition属性实现一个带动画显隐的微信小程序部件

    我们先来看效果图 像这样的一个带过渡效果的小部件在我们实际开发中的应用几率还是比较大的,但是在开发微信小程序的过程中可能有的小伙伴发现transition这个属性它不好使(下面说明)所以我们这个时候会 ...

  4. Android入门-新手如何成功创建一个Android小应用

    原文链接:http://android.eoe.cn/topic/overview 第一课程:Building Your First App [本课内容简介]欢迎加入到安卓应用的开发大潮中!这门课程会 ...

  5. nodejs android 推送,利用Nodejs怎么实现一个微信小程序消息推送功能

    利用Nodejs怎么实现一个微信小程序消息推送功能 发布时间:2021-01-20 13:55:29 来源:亿速云 阅读:92 作者:Leah 今天就跟大家聊聊有关利用Nodejs怎么实现一个微信小程 ...

  6. 手把手教你写一个微信小程序日历组件

    今天我们一起写一个微信小程序日历组件 微信小程序日历组件 github.com/749264345/w- 好,我们先看一下要实现的模样,如下图 由以上截图我们可以看到 1.日历可以通过按钮[切换展示效 ...

  7. java 获取文件所在的文件夹_带你0基础编写一个Java小程序,领略Java程序从编写到编译再到运行的全流程...

    在学习Java之前我们需要先认识下什么是计算机语言?计算机语言又有哪些分类?在了解这些后对我们理解学习帮助是很大的. 要知道计算机语言是人与计算机之间进行信息交流沟通的一种特殊语言,又分为机械语言.汇 ...

  8. 微信小程序是什么?如何快速搭建一个微信小程序?

    目录 一.微信小程序是什么 二.安全管理 三.微信小程序的功能 四.快速开发一个微信小程序APP 1.集成即构实时音视频SDK 2.初始化SDK引擎 3.创建房间与登录房间 4.房主创建房间 5.推流 ...

  9. 【微信小程序控制硬件15 】 开源一个微信小程序,支持蓝牙快速配网+WiFi双控制ESP32-C3应用示范;(附带Demo)

    文章目录 一.前言 二. Blufi乐鑫自研的蓝牙配网协议 ESP32 配网流程 流程图 三.相关代码 3.1 蓝牙快速配网 3.2 蓝牙本地控制 2.3 外设驱动 3.1 蓝牙搜索 3.2 蓝牙服务 ...

最新文章

  1. 生成多个互不重叠的不同半径圆
  2. Java的知识点25——IO、 数据源
  3. 减少模型方差的方法借鉴
  4. 关于通配泛型类型有几种_5.7 泛型通配符和类型参数的范围
  5. php 错误提示开启,php开启与关闭错误提示,php开启错误提示_PHP教程
  6. HIPS 自定义框架
  7. Android 系统(253)----如何修改google libphonenumber的meta data (号码归属地,紧急号码列表,号码格式)
  8. linux 虚拟内存分配,是否可以在linux中分配大量虚拟内存?
  9. 数据库sql 四种语言DDL DML DCL DQL 基本语法
  10. 360奇云的架构演进之路
  11. (转)Notepad++删除空白行
  12. Mac Elasticsearch 7.9.3 安装指南
  13. 一、ECMAScript 6/7/8简介
  14. 【比特熊故事汇】4月MVP英雄故事 —— 微软X英特尔春日漫话
  15. EPSON LS3-401S机器人学习笔记 5 - 坐标系
  16. 浮点运算量FLOPs与算力单位FLOPS
  17. 怎么迅速计算WPS文档中字数
  18. 快速应用计算机制作pop,【爆炸贴图片手绘字体】爆炸贴手绘技巧
  19. 水果做键盘控制跑跑卡丁车
  20. 《深度强化学习》面试题汇总

热门文章

  1. python 进行抓包嗅探
  2. 快速理解各类软件开发过程模型(瀑布模型、螺旋模型、喷泉模型等)
  3. 于飞SEO:seo优化如何正确的布局关键词?
  4. 独立产品灵感周刊 DecoHack #048 - 优秀独立开发产品推荐
  5. 论文笔记:Neural Message Passing for Quantum Chemistry
  6. 计算机动漫专业术语写情诗,理科男用专业术语比赛写情诗 普通女生看不懂
  7. 2012搜狗校园招聘笔试题(2)
  8. 杭电ACM 改革春风吹满地
  9. 西门子S7-300如何接入Intouch?
  10. 日常疑问——outlook回复邮件正文如何插入图片