Android實(shí)現(xiàn)快遞單號(hào)查詢快遞狀態(tài)信息
今天介紹一個(gè)自己做的快遞單號(hào)查詢的簡單APP,供大家參考。由于需要使用http和json,本文在build.gradle(module:app)添加了okhttp3依賴和gson依賴。
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:24.1.1'
testCompile 'junit:junit:4.12'
compile 'com.squareup.okhttp3:okhttp:3.6.0'
compile 'com.google.code.gson:gson:2.2.4'
}
看一下布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context="com.yjp.deliverynoquerydemo.MainActivity"> <Spinner android:id="@+id/delivery_company_spinner" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp" android:entries="@array/delivery_company"/> <EditText android:id="@+id/delivery_no_edit_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp" android:hint="@string/please_enter_delivery_no" android:inputType="number"/> <Button android:id="@+id/query_button" android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="5dp" android:text="@string/query"/> <ListView android:id="@+id/messages_list_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp" android:listSelector="@android:color/transparent"/> </LinearLayout>
ListView使用的item的布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/time_text_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:textStyle="bold" android:textAppearance="?android:textAppearanceMedium" android:typeface="monospace"/> <TextView android:id="@+id/context_text_view" android:layout_width="match_parent" android:layout_height="50dp" android:textAppearance="?android:textAppearanceSmall" android:typeface="monospace"/> </LinearLayout>
資源文件,首先是strings.xml
<resources> <string name="app_name">快遞查詢</string> <string name="please_enter_delivery_no">請輸入快遞單號(hào)</string> <string name="query">查詢</string> <string name="query_url">http://www.kuaidi100.com/query</string> </resources>
這里我們使用了快遞100的接口,然后看看arrays.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="delivery_company"> <item>順豐</item> <item>EMS</item> <item>快捷</item> </string-array> <string-array name="delivery_company_id"> <item>shunfeng</item> <item>ems</item> <item>kuaijiesudi</item> </string-array> </resources>
只做了3個(gè)快遞公司的查詢,還有很多其他的支持,界面如圖所示

下面看看代碼,我們自定義一個(gè)Application類,主要通過資源,使用表驅(qū)動(dòng)法動(dòng)態(tài)構(gòu)建一個(gè)快遞公司中文名與請求時(shí)候的公司編碼的映射表。
package com.yjp.deliverynoquerydemo.global;
import android.app.Application;
import com.yjp.deliverynoquerydemo.R;
import java.util.HashMap;
import java.util.Map;
public class MyApplication extends Application {
private Map<String, String> mDeliveryCompanyTable = new HashMap<>();
public String getDeliveryCompanyNo(String deliveryCompanyName) throws RuntimeException {
if (mDeliveryCompanyTable.isEmpty()) {
String[] names = getResources().getStringArray(R.array.delivery_company);
String[] ids = getResources().getStringArray(R.array.delivery_company_id);
if (names.length != ids.length) {
throw new RuntimeException();
}
for (int i = 0; i < names.length; i++) {
mDeliveryCompanyTable.put(names[i], ids[i]);
}
}
return mDeliveryCompanyTable.get(deliveryCompanyName);
}
}
然后是模型,用來記錄獲取回來的快遞狀態(tài)信息
package com.yjp.deliverynoquerydemo.modal;
import java.util.List;
public class DeliveryMessages {
//派送單號(hào)
private String nu;
//快遞公司名稱
private String com;
//快遞信息
private List<Message> data;
//消息類
public static class Message {
//時(shí)間,格式為年-月-日 時(shí):分:秒
private String time;
//詳細(xì)信息內(nèi)容
private String context;
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getContext() {
return context;
}
public void setContext(String context) {
this.context = context;
}
}
public String getNu() {
return nu;
}
public void setNu(String nu) {
this.nu = nu;
}
public String getCom() {
return com;
}
public void setCom(String com) {
this.com = com;
}
public List<Message> getData() {
return data;
}
public void setData(List<Message> data) {
this.data = data;
}
}
一個(gè)用來通過http獲取快遞信息的工具類,這里我們使用了okHttp3和gson
package com.yjp.deliverynoquerydemo.tools;
import com.google.gson.Gson;
import com.yjp.deliverynoquerydemo.modal.DeliveryMessages;
import java.io.IOException;
import java.net.SocketTimeoutException;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class DeliveryMessageGetter {
//異步請求監(jiān)聽接口
public interface DeliveryMessageGetterListener {
void onSuccess(DeliveryMessages deliveryMessages);
void onFailure(String errorStr);
}
//okHttp
private OkHttpClient mOkHttpClient = new OkHttpClient.Builder()
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.connectTimeout(10, TimeUnit.SECONDS)
.build();
//異步GET請求
public void getAsync(final String url,
final Map<String, String> params,
final DeliveryMessageGetterListener listener) {
//構(gòu)建請求URL
String requestString = url;
if (!params.isEmpty()) {
requestString += "?";
for (Map.Entry<String, String> entry : params.entrySet()) {
requestString += entry.getKey() + "=" + entry.getValue() + "&";
}
requestString = requestString.substring(0, requestString.length() - 1);
}
//創(chuàng)建一個(gè)Request
final Request request = new Request.Builder()
.url(requestString)
.build();
//請求加入調(diào)度
Call call = mOkHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
if(e.getCause().equals(SocketTimeoutException.class)) {
listener.onFailure("查詢超時(shí)");
} else {
listener.onFailure("查詢失敗");
}
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String messages = response.body().string();
Gson gson = new Gson();
DeliveryMessages deliveryMessages = gson.fromJson(messages, DeliveryMessages.class);
if (deliveryMessages != null) {
listener.onSuccess(deliveryMessages);
} else {
listener.onFailure("查詢失敗");
}
}
});
}
}
最后是我們的MainActivity
package com.yjp.deliverynoquerydemo;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Spinner;
import android.widget.Toast;
import com.yjp.deliverynoquerydemo.global.MyApplication;
import com.yjp.deliverynoquerydemo.modal.DeliveryMessages;
import com.yjp.deliverynoquerydemo.tools.DeliveryMessageGetter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.yjp.deliverynoquerydemo.modal.DeliveryMessages.Message;
public class MainActivity extends AppCompatActivity implements DeliveryMessageGetter.DeliveryMessageGetterListener {
private List<Map<String, String>> mQueryData = new ArrayList<>();
private SimpleAdapter mQueryAdapter;
private Spinner mDeliveryCompanySpinner;
private EditText mDeliveryNoEditText;
private ProgressDialog mQueryWaitDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDeliveryCompanySpinner = (Spinner) findViewById(R.id.delivery_company_spinner);
mDeliveryNoEditText = (EditText) findViewById(R.id.delivery_no_edit_text);
Button queryButton = (Button) findViewById(R.id.query_button);
ListView messagesListView = (ListView) findViewById(R.id.messages_list_view);
queryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//沒有輸入快遞單號(hào)
if (0 == mDeliveryNoEditText.getText().length()) {
Toast.makeText(MainActivity.this, "請輸入快遞單號(hào)", Toast.LENGTH_SHORT).show();
return;
}
//創(chuàng)建ProgressDialog對象
mQueryWaitDialog = new ProgressDialog(MainActivity.this);
mQueryWaitDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mQueryWaitDialog.setMessage("正在查詢...");
mQueryWaitDialog.show();
//準(zhǔn)備請求參數(shù)
int selectedPosition = mDeliveryCompanySpinner.getSelectedItemPosition();
String deliveryCompanyName =
getResources().getStringArray(R.array.delivery_company)[selectedPosition];
Map<String, String> params = new HashMap<>();
params.put("type",
((MyApplication)getApplication()).getDeliveryCompanyNo(deliveryCompanyName));
params.put("postid", mDeliveryNoEditText.getText().toString());
//清空數(shù)據(jù)
mQueryData.clear();
//發(fā)送請求
DeliveryMessageGetter getter = new DeliveryMessageGetter();
getter.getAsync(getResources().getString(R.string.query_url),
params, MainActivity.this);
}
});
mQueryAdapter = new SimpleAdapter(this,
mQueryData,
R.layout.query_list_item_layout,
new String[] {"time", "context"},
new int[] {R.id.time_text_view, R.id.context_text_view});
messagesListView.setAdapter(mQueryAdapter);
}
@Override
public void onSuccess(DeliveryMessages deliveryMessages) {
List<Message> messages = deliveryMessages.getData();
for (Message message : messages) {
Map<String, String> map = new HashMap<>();
map.put("time", message.getTime());
map.put("context", message.getContext());
mQueryData.add(map);
}
queryComplete("查詢完成");
}
@Override
public void onFailure(String errorStr) {
final String hint = errorStr;
queryComplete("查詢失敗");
}
private void queryComplete(final String toast) {
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
mQueryAdapter.notifyDataSetChanged();
mQueryWaitDialog.dismiss();
Toast.makeText(MainActivity.this, toast, Toast.LENGTH_SHORT).show();
}
});
}
}
主要是調(diào)用接口,實(shí)現(xiàn)功能,代碼比較好理解,不再贅述。最后給出Manifest文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yjp.deliverynoquerydemo">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:name=".global.MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:windowSoftInputMode="stateHidden">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
主要是替換了默認(rèn)的Application類,然后讓MainActivity默認(rèn)不彈出軟鍵盤。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android快遞物流信息布局開發(fā)
- Android自定義view仿淘寶快遞物流信息時(shí)間軸
- Android實(shí)現(xiàn)快遞物流時(shí)間軸效果
- android實(shí)現(xiàn)快遞跟蹤進(jìn)度條
- Android實(shí)現(xiàn)仿美團(tuán)、順豐快遞數(shù)據(jù)加載效果
- Android實(shí)現(xiàn)快遞物流跟蹤布局效果
- Android使用http請求手機(jī)號(hào)碼歸屬地查詢代碼分享
- Android編程實(shí)現(xiàn)號(hào)碼歸屬地查詢的方法
- kotlin實(shí)現(xiàn)快遞與號(hào)碼歸屬地查詢案例詳解
相關(guān)文章
Flutter質(zhì)感設(shè)計(jì)之持久底部面板
這篇文章主要為大家詳細(xì)介紹了Flutter質(zhì)感設(shè)計(jì)之持久底部面板,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-08-08
Android 圖片特效如何實(shí)現(xiàn)及總結(jié)
這篇文章主要介紹了Android 圖形特效如何實(shí)現(xiàn)及總結(jié)的相關(guān)資料,這里對Android圖像特效的實(shí)現(xiàn)比如:旋轉(zhuǎn),放大,縮小,傾斜等,需要的朋友可以參考下2016-12-12
如何設(shè)置Android studio 3.0顯示光標(biāo)返回上一次瀏覽位置的箭頭圖標(biāo)
這篇文章主要介紹了如何設(shè)置Android studio 3.0顯示光標(biāo)返回上一次瀏覽位置的箭頭圖標(biāo) 很多朋友反映剛升級了Android studio 3.0,發(fā)現(xiàn)光標(biāo)返回上一次瀏覽位置的箭頭圖標(biāo)沒有了,下文給大家介紹的非常詳細(xì),需要的朋友可以參考下2017-11-11
完美解決Android App啟動(dòng)頁有白屏閃過的問題
這篇文章主要介紹了完美解決Android App啟動(dòng)頁有白屏閃過的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08
Android開發(fā)筆記之:如何屏蔽Button setClickable與setEnabled
本篇文章是對在Android中,如何屏蔽Button setClickable與setEnabled的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
微信小程序動(dòng)態(tài)的顯示或隱藏控件的方法(兩種方法)
在微信小程序開發(fā)時(shí),經(jīng)常要用到一個(gè)控件會(huì)根據(jù)不同的情況和環(huán)境動(dòng)態(tài)顯示與隱藏這種情況,下面就來實(shí)踐一下吧2017-01-01

