杜國(guó)祥,劉 洋,楊小龍,王 君
(中國(guó)人民解放軍32382部隊(duì),武漢 430311)
為適應(yīng)當(dāng)今復(fù)雜多變的國(guó)際環(huán)境變化,各類高新技術(shù)在新型裝備研制中得到越來越多的應(yīng)用,在極大提升裝備技戰(zhàn)性能的同時(shí),也導(dǎo)致裝備變得越來越復(fù)雜,傳統(tǒng)的紙質(zhì)隨裝技術(shù)資料存在體積與重量大、編輯與更新不及時(shí)、使用不便、易污染、防火性差等諸多弊端。交互式電子技術(shù)手冊(cè)(IETM,interactive electronic technical manual)采用文字、圖形、表格、音視頻等形式,以人機(jī)交互的方式為用戶提供裝備相關(guān)技術(shù)信息[1],但作為一種新型技術(shù)出版物,局限于與用戶的交互,要求用戶對(duì)裝備有一定的了解,IETM未與裝備產(chǎn)生直接關(guān)聯(lián)。采用射頻識(shí)別技術(shù)(RFID,radio frequency identification)設(shè)計(jì)備件物資保障系統(tǒng)和導(dǎo)彈武器管理系統(tǒng),通過非接觸雙向通信,以完成裝備、備件、物資的目標(biāo)識(shí)別和數(shù)據(jù)交換,可實(shí)現(xiàn)備件物資和裝備技術(shù)狀態(tài)的精確化、智能化管理[2],但RFID在使用過程中會(huì)產(chǎn)生射頻信號(hào),可能會(huì)對(duì)裝備正常運(yùn)行產(chǎn)生電磁干擾,多個(gè)RFID標(biāo)簽在進(jìn)行識(shí)別時(shí)也易相互產(chǎn)生干擾。
本文將采用二維碼標(biāo)簽對(duì)裝備部組件及其對(duì)外接口連接線纜進(jìn)行標(biāo)識(shí),用戶通過運(yùn)行于Android智能設(shè)備的客戶端軟件,掃碼完成身份識(shí)別、解碼后,自動(dòng)觸發(fā)業(yè)務(wù)邏輯處理,查詢與此二維碼標(biāo)簽標(biāo)識(shí)對(duì)象所相關(guān)的技術(shù)信息,以此為用戶提供各類信息服務(wù),具有技術(shù)成熟、識(shí)別速度快、易于制作、成本低、開發(fā)周期短等特點(diǎn),用戶即掃即查,更加契合現(xiàn)今用戶使用習(xí)慣,更易激發(fā)用戶興趣。
按照裝備配套表,為其所有部組件及其連接線纜統(tǒng)一制作、更換二維碼銘牌,二維碼參考格式為“A:加電控制組合”,或者“B:6S2208-7D X1”,其中A和B為特征標(biāo)識(shí)字,可自行定義,主要用于區(qū)別部組件和部組件對(duì)外接口連接的線纜。本裝備信息交互查詢APP運(yùn)行于常見的Android系統(tǒng)智能設(shè)備,軟件調(diào)用設(shè)備的攝像頭進(jìn)行掃碼,以解析出二維碼中的特征標(biāo)識(shí)字、部組件名稱或部組件連接線纜代號(hào),之后從數(shù)據(jù)庫(kù)中查詢出其相關(guān)數(shù)據(jù)信息,最后自動(dòng)跳轉(zhuǎn)至部組件詳情頁(yè)或部組件對(duì)外接口明細(xì)頁(yè)將數(shù)據(jù)信息展示給用戶。
用戶可以通過頁(yè)面工具欄上面的搜索菜單項(xiàng),輸入關(guān)鍵字查詢相關(guān)數(shù)據(jù)信息,也可以用作裝備電子技術(shù)手冊(cè),瀏覽數(shù)據(jù)信息。
采用模型-視圖-控制器(MVC,model-view-controller)的架構(gòu)模式進(jìn)行分層設(shè)計(jì),如圖1所示。用戶在視圖層進(jìn)行交互操作,控制器層根據(jù)用戶請(qǐng)求進(jìn)行業(yè)務(wù)邏輯處理,從數(shù)據(jù)模型層查詢相關(guān)數(shù)據(jù)信息,再回送視圖層將查詢結(jié)果顯示給用戶。
圖1 應(yīng)用軟件對(duì)象分解圖
在數(shù)據(jù)模型層,裝備信息分成兩類存儲(chǔ)在assets文件夾下,編譯時(shí)打包至APK安裝包內(nèi),第一類是裝備的部組件清單、部組件接口明細(xì)清單、部組件連接線纜針腳定義明細(xì)等,此類信息數(shù)據(jù)量較小,利用開源數(shù)據(jù)庫(kù)框架LitePal進(jìn)行管理[3]。第二類是裝備部組件的詳細(xì)介紹、實(shí)物圖、結(jié)構(gòu)圖、電路圖、接線圖,此類信息數(shù)據(jù)量較大,則以PDF、JPEG格式文件存儲(chǔ)在assets文件下,利用barteksc:android-pdf-viewer開源庫(kù)加載顯示PDF文件[4],利用Glide開源庫(kù)加載顯示JPEG文件[5]。
控制器層4個(gè)活動(dòng)對(duì)象MainActivity(首頁(yè))、EquipmentActivity(部組件清單頁(yè))、DetailsPageActivity(部組件詳情頁(yè))、InterfaceDatasActivity(部組件接口明細(xì)頁(yè))相互間跳轉(zhuǎn)關(guān)系如圖2所示,分別對(duì)應(yīng)視圖層中的activity_main.xml、activity_equipment.xml、activity_details_page.xml、activity_interface_datas.xml四個(gè)布局頁(yè)。
圖2 應(yīng)用軟件順序圖
在視圖層,首頁(yè)列出裝備的結(jié)構(gòu)組成和功能組成供用戶選擇,用戶點(diǎn)擊選擇后將自動(dòng)跳轉(zhuǎn)至部組件清單頁(yè)。在部組件清單頁(yè)利用RecyclerView控件展示用戶選中的某結(jié)構(gòu)組成或分系統(tǒng)所包含的部組件,RecyclerView設(shè)置為StaggeredGridLayoutManager縱向2列瀑布流布局,條目則采用自定義的圖片+文字縱向布局,用戶點(diǎn)擊選中某一部組件后將自動(dòng)跳轉(zhuǎn)至部組件詳情頁(yè)。部組件詳情頁(yè)將為用戶展示其詳細(xì)相關(guān)技術(shù)信息,包括詳細(xì)介紹、對(duì)外接口、實(shí)物圖、結(jié)構(gòu)圖、電路圖、接線圖,采用TabLayout控件+ViewPager控件實(shí)現(xiàn),ViewPager控件包含6個(gè)頁(yè)面,可通過左右滑動(dòng)或者點(diǎn)擊標(biāo)簽進(jìn)行頁(yè)面,其中詳細(xì)介紹、實(shí)物圖、結(jié)構(gòu)圖、電路圖、接線圖4個(gè)頁(yè)面展示裝備信息均為PDF格式文件,對(duì)外接口頁(yè)則采用smartTable開源庫(kù)加載顯示數(shù)據(jù)表格,用戶點(diǎn)擊某對(duì)外接口后將自動(dòng)跳轉(zhuǎn)至部組件對(duì)外接口明細(xì)頁(yè)。部組件對(duì)外接口明細(xì)頁(yè)也采用smartTable開源庫(kù)加載顯示數(shù)據(jù)表格,展示該對(duì)外接口所連接線纜的針腳定義列表。
此外,4個(gè)布局頁(yè)頂部均設(shè)有提供掃碼查詢和關(guān)鍵字搜索查詢菜單項(xiàng)的標(biāo)題欄,其中首頁(yè)和部組件清單頁(yè)采用Toolbar,部組件詳情頁(yè)和部組件接口明細(xì)頁(yè)則改用可折疊式標(biāo)題欄CollapsingToolbarLayout,下拉標(biāo)題欄式可顯示部組件或部組件對(duì)外接口的照片。
2.2.1 裝備信息數(shù)據(jù)管理設(shè)計(jì)
1)利用LitePal配置管理數(shù)據(jù):
首先在app/build.gradle文件中的dependencies閉包中添加“implementation 'org.litepal.android:java:3.0.0'”以引入LitePal開源數(shù)據(jù)庫(kù)框架。之后在assets文件夾下新建litepal.xml配置數(shù)據(jù)庫(kù),關(guān)鍵代碼如下:
對(duì)應(yīng)配置文件中定義的三張數(shù)據(jù)表定義三個(gè)對(duì)應(yīng)的數(shù)據(jù)管理類:Matchingequipments:其實(shí)例為裝備某一部組件,包含屬性有序號(hào)、名稱、代號(hào)、所屬分系統(tǒng)、安裝位置、接口清單、備注;Equipmentinterfaces:其實(shí)例為裝備部組件某一對(duì)外接口的定義,包含的屬性有序號(hào)、名稱、代號(hào)、接口、連接線纜、線纜去向、備注;Cablepinsdefinitions:其實(shí)例為部組件對(duì)外接口連接線纜的針腳定義,包含的屬性有序號(hào)、名稱、接口A#針腳pin_nx、電路特性、接口B(信號(hào)去向)、針腳pin_ny(信號(hào)去向)。
LitePal新生成的數(shù)據(jù)庫(kù)文件默認(rèn)保存在/data/data/packagename/databases目錄下,APP啟動(dòng)運(yùn)行后,將自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)文件,之后就可以利用LitePal查詢裝備數(shù)據(jù)信息,比如由組合名稱查找組合對(duì)應(yīng)代號(hào):
String mMark = LitePal.select("mark").where("name = ?", mNameTxt).find(MatchingEquipments.class).get(0).getMark();
2)從assets文件下的SQLite數(shù)據(jù)庫(kù)導(dǎo)入數(shù)據(jù):
因LitePal只支持自己創(chuàng)建的數(shù)據(jù)庫(kù),為使用已有裝備信息數(shù)據(jù)庫(kù),在利用LitePal配置管理數(shù)據(jù)時(shí),對(duì)應(yīng)數(shù)據(jù)表定義的三個(gè)數(shù)據(jù)管理類應(yīng)與現(xiàn)有數(shù)據(jù)庫(kù)中數(shù)據(jù)表的結(jié)構(gòu)保持一致,然后新建DBManager類,通過其定義的openDatabase( )和closeDatabase( )兩個(gè)函數(shù),將assets文件下的已有裝備信息數(shù)據(jù)庫(kù)導(dǎo)入至LitePal創(chuàng)建的數(shù)據(jù)庫(kù),采取讀取寫入字節(jié)流的方式導(dǎo)入已有裝備信息數(shù)據(jù),關(guān)鍵代碼如下:
//數(shù)據(jù)庫(kù)文件名
private static final String DB_NAME = "ElectricCableManagementDatas.db";
//包名
private static final String PACKAGE_NAME = "com.example.electriccablemanagement2";
//LitePal創(chuàng)建數(shù)據(jù)庫(kù)的存放目錄
private static final String DB_PATH = "/data"+Environment.getDataDirectory().getAbsolutePath() + "/" + PACKAGE_NAME + "/databases";
//打開數(shù)據(jù)庫(kù)
public void openDatabase() {
//判斷目錄是否存在,若不存在則創(chuàng)建目錄
File dFile = new File(DB_PATH);
if (!dFile.exists())
dFile.mkdir();
//打開數(shù)據(jù)庫(kù)文件并拷貝復(fù)制數(shù)據(jù)塊
this.database = this.openDatabase(DB_PATH + "/" + DB_NAME);
}
//從assets文件夾導(dǎo)入已有裝備信息數(shù)據(jù)庫(kù)
private SQLiteDatabase openDatabase(String dbfile) {
……
if ((new File(dbfile).exists())) {
//創(chuàng)建字節(jié)輸入流
FileInputStream fis = this.context.getResources().getAssets().open("ElectricCableManagementDatas.db");
//創(chuàng)建字節(jié)輸出流
FileOutputStream fos = new FileOutputStream(dbfile);
int BUFFER_SIZE = 1028 * 10;
byte[] buffer = new byte[BUFFER_SIZE];
//字節(jié)輸入流實(shí)際讀取的字符數(shù)
int count = 0;
//從已有裝備信息數(shù)據(jù)庫(kù)文件讀取字符并寫入LitePal創(chuàng)建的數(shù)據(jù)庫(kù)
while ((count = fis.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
//關(guān)閉字節(jié)輸入流和字節(jié)輸出流
fos.close();
fis.close();
……
}
在MainActivity的onCreate()中添加如下代碼以在APP啟動(dòng)時(shí)自動(dòng)導(dǎo)入裝備數(shù)據(jù)庫(kù)。
//從assets文件夾導(dǎo)入外部數(shù)據(jù)庫(kù)
DBManager dbHelper =new DBManager(this);
dbHelper.openDatabase();
dbHelper.closeDatabase();
3)加載顯示PDF文件和JPEG文件:
首先在app/build.gradle文件中的dependencies閉包中添加“implementation 'com.github.barteksc:android-pdf-viewer:2.8.2'”、“implementation 'com.github.bumptech.glide:glide:4.11.0'”以引入庫(kù)文件。加載顯示PDF文件和JPEG文件關(guān)鍵代碼如下:
//加載顯示PDF文件
mPdfView=(PDFView)findViewById(R.id.equipment_details_pdfview);
mPdfView.fromAsset(mName.pdf).enableSwipe(true).swipeHorizontal(true).enableDoubletap(true).defaultPage(0).load();
//加載顯示JPEG文件
Glide.with(this).load(mPicturePath).into(pictureImage);
2.2.2 標(biāo)題欄掃碼查詢菜單項(xiàng)設(shè)計(jì)
華為統(tǒng)一掃碼服務(wù)(Scan Kit)[6]提供便捷的條形碼和二維碼掃描與解析能力,默認(rèn)支持13種碼制式,可以實(shí)現(xiàn)遠(yuǎn)距離條碼或二維碼的檢測(cè)與自動(dòng)放大,并針對(duì)常見復(fù)雜掃碼場(chǎng)景(如:強(qiáng)光照、污損、柱面等)做了針對(duì)性識(shí)別優(yōu)化,以提升掃碼成功率與用戶體驗(yàn)。Scan Kit提供Default View Mode、Customized View Mode、Bitmap API Mode三種調(diào)用方式,其中Default View Mode提供相機(jī)掃碼和導(dǎo)入圖片掃碼兩個(gè)功能,提供了完整的Activity和掃碼界面UI,Scan Kit直接控制相機(jī)實(shí)現(xiàn)最優(yōu)的相機(jī)Zoom控制、自適應(yīng)的曝光調(diào)節(jié)、自適應(yīng)對(duì)焦調(diào)節(jié)等操作,保障最佳的掃碼體驗(yàn),特別適用于快速集成。將HMS SDK集成到Android Studio開發(fā)環(huán)境中的操作步驟為:
首先打開Android Studio項(xiàng)目級(jí)build.gradle文件,在allprojects ->repositories和buildscript ->repositories里面分別添加代碼“maven {url 'http://developer.huawei.com/repo/'}”、在buildscript ->dependencies里面添加代碼“classpath 'com.huawei.agconnect:agcp:1.2.1.301'”以配置HMS SDK的maven倉(cāng)地址。之后打開app/build.gradle文件,在文件頭添加代碼“apply plugin: 'com.huawei.agconnect'”、在“dependencies”中添加代碼“implementation 'com.huawei.hms:scanplus:1.1.1.301'”以添加編譯依賴。調(diào)用Scan Kit時(shí),需要在Manifest文件中注冊(cè)申明“com.huawei.hms.hmsscankit.ScanKitActivity”,構(gòu)建相機(jī)掃碼和導(dǎo)入圖片掃碼功能,還需要申請(qǐng)“CAMERA”(相機(jī)權(quán)限)和“READ_EXTERNAL_STORAGE”(讀文件權(quán)限)。配置完成后,使用Default View調(diào)用方式進(jìn)行掃碼查詢裝備數(shù)據(jù)信息的主要業(yè)務(wù)流程如圖3所示。
圖3 應(yīng)用軟件順序圖
掃碼查詢關(guān)鍵代碼如下所示:
//工具欄菜單選擇響應(yīng)處理
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
//掃碼查詢
case R.id.scanview:
//動(dòng)態(tài)申請(qǐng)相機(jī)和文件讀寫權(quán)限
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE},PERMISSION_CODE);
break;
default:
}
return true;
}
//權(quán)限返回的結(jié)果處理
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
{
//判斷是否通過權(quán)限申請(qǐng)
if (permissions == null || grantResults == null || grantResults.length < 2 || grantResults[0] != PackageManager.PERMISSION_GRANTED || grantResults[1] != PackageManager.PERMISSION_GRANTED) {
return;
}
//默認(rèn)掃碼功能,支持選擇相冊(cè)識(shí)別
if (requestCode == DEFINED_CODE) {
//設(shè)置支持掃碼識(shí)別的類型碼
ScanUtil.startScan(this, REQUEST_CODE_SCAN, new HmsScanAnalyzerOptions.Creator().setHmsScanTypes(HmsScan.ALL_SCAN_TYPE).create());
}
}
//掃碼識(shí)別并查詢數(shù)據(jù)庫(kù)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
……
//讀取掃碼返回結(jié)果
if (requestCode == REQUEST_CODE_SCAN) {
HmsScan obj = data.getParcelableExtra(ScanUtil.RESULT);
if (obj != null) {
//從掃碼結(jié)果中取出原始碼值
String scan_result = obj.originalValue;
//跳轉(zhuǎn)至電子組合頁(yè)面,需提供組合的名稱和對(duì)應(yīng)圖片的絕對(duì)存儲(chǔ)路徑
//根據(jù)掃碼結(jié)果自動(dòng)跳轉(zhuǎn)至對(duì)應(yīng)界面,若scan_result以A開頭,比如“A:加電控制組合”,則跳轉(zhuǎn)至電子組合頁(yè)面
if(scan_result.startsWith("A")){Intent intent = new Intent(MainActivity.this, DetailsPageActivity.class);
Bundle check_bd = new Bundle();
//從二維碼中識(shí)別出組合名稱
String mName = scan_result.substring(2);
//由組合名稱查找組合對(duì)應(yīng)代號(hào)
String mMark = LitePal.select("mark").where("name = ?", mName).find(MatchingEquipments.class).get(0).getMark();
//組合對(duì)應(yīng)實(shí)物照片存儲(chǔ)絕對(duì)路徑
String mPicturePath = "file:///android_asset/Pictures/" + mMark + ".jpg";
//跳轉(zhuǎn)至組合詳情頁(yè)
check_bd.putString("名稱",mName);
check_bd.putString("圖片絕對(duì)路徑",mPicturePath);
intent.putExtras(check_bd);
startActivity(intent);
}
//若以B開頭,比如“B:6S2208-7D X1”,則跳轉(zhuǎn)至組合對(duì)外接口頁(yè)面,需提供組合接口代號(hào)
else if(scan_result.startsWith("B")){
Intent intent = new Intent(MainActivity.this, InterfaceDatasActivity.class);
//從二維碼中識(shí)別出組合接口對(duì)應(yīng)的代號(hào),并自動(dòng)跳轉(zhuǎn)至對(duì)應(yīng)界面intent.putExtra("CHECK_KEY",scan_result.substring(2));
startActivity(intent);
}}
else {
Toast.makeText(MainActivity.this, "未掃碼到二維碼或條形碼!", Toast.LENGTH_SHORT).show();
}}}
2.2.3 標(biāo)題欄關(guān)鍵字搜索查詢菜單項(xiàng)設(shè)計(jì)
關(guān)鍵字搜索查詢采用SearchView控件實(shí)現(xiàn),用戶輸入關(guān)鍵字比如部組件的代號(hào)時(shí),點(diǎn)擊提交查詢按鈕,將自動(dòng)從裝備數(shù)據(jù)庫(kù)從查詢?cè)摬拷M件的相關(guān)技術(shù)信息,并自動(dòng)跳轉(zhuǎn)至部組件詳情頁(yè)展示相關(guān)數(shù)據(jù)。搜索欄具備自動(dòng)完成功能,在用戶輸入1個(gè)字符后,將自動(dòng)展開一個(gè)下拉列表列出與改字符匹配的預(yù)設(shè)項(xiàng)供用戶選擇,用戶選中下拉列表中的某一待選項(xiàng)后,將自動(dòng)完成提交、查詢,并自動(dòng)跳轉(zhuǎn)至部組件詳情頁(yè)展示相關(guān)數(shù)據(jù)。關(guān)鍵代碼如下:
//加載菜單
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//引用menu文件
getMenuInflater().inflate(R.menu.toolbar, menu);
//獲取搜索框組件SearchView
mSearchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.searchview));
//設(shè)置顯示搜索框展開時(shí)的提交按鈕
mSearchView.setSubmitButtonEnabled(true);
//設(shè)置搜索框提示語(yǔ)
mSearchView.setQueryHint("請(qǐng)輸入關(guān)鍵字");
//獲取mSearchView的子組件以自定義樣式
mSearchAutoComplete = (SearchAutoComplete) mSearchView.findViewById(R.id.search_src_text);
//設(shè)置輸入框提示文字的顏色、背景色、大小
mSearchAutoComplete.setHintTextColor(getResources().getColor(android.R.color.darker_gray));
mSearchAutoComplete.setTextColor(getResources().getColor(android.R.color.background_light));
mSearchAutoComplete.setTextSize(14);
//設(shè)置輸入框輸入1個(gè)字符時(shí)觸發(fā)查詢
mSearchAutoComplete.setThreshold(1);
//創(chuàng)建數(shù)組適配器,list為存放預(yù)設(shè)項(xiàng)數(shù)據(jù)的字符類型數(shù)組
ArrayAdapter adapter = new ArrayAdapter
//為輸入框設(shè)置數(shù)組適配器
mSearchAutoComplete.setAdapter(adapter);
//監(jiān)聽搜索框輸入字符,實(shí)時(shí)顯示匹配預(yù)設(shè)項(xiàng),實(shí)現(xiàn)快速搜索查詢功能
mSearchAutoComplete.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
//獲取選擇項(xiàng)的值,也即組合代號(hào)
String selectStr = (String) parent.getItemAtPosition(position);
mSearchAutoComplete.setText(selectStr);
//由組合代號(hào)查找組合名稱
String mNmae = LitePal.select("name").where("mark = ?", selectStr).find(MatchingEquipments.class).get(0).getName();
//組合對(duì)應(yīng)實(shí)物照片存儲(chǔ)絕對(duì)路徑
String mPicturePath = "file:///android_asset/Pictures/" + selectStr + ".jpg";
//自動(dòng)跳轉(zhuǎn)至部組件詳情頁(yè)
Intent intent = new Intent(MainActivity.this, DetailsPageActivity.class);
Bundle check_bd = new Bundle();
check_bd.putString("名稱",mNmae);
check_bd.putString("圖片絕對(duì)路徑",mPicturePath);
intent.putExtras(check_bd);
startActivity(intent);
return;
}
});
//監(jiān)聽搜索框文字變化
mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override public boolean onQueryTextSubmit(String searchStr) {
//由組合代號(hào)查找組合名稱
String mNmae = LitePal.select("name").where("mark = ?", searchStr).find(MatchingEquipments.class).get(0).getName();
//組合對(duì)應(yīng)實(shí)物照片存儲(chǔ)絕對(duì)路徑
String mPicturePath = "file:///android_asset/Pictures/" + searchStr + ".jpg";
//自動(dòng)跳轉(zhuǎn)至部組件詳情頁(yè)
Intent intent = new Intent(MainActivity.this, DetailsPageActivity.class);
Bundle check_bd = new Bundle();
check_bd.putString("名稱",mNmae);
check_bd.putString("圖片絕對(duì)路徑",mPicturePath); intent.putExtras(check_bd);
startActivity(intent);
return false;
}
……
return super.onCreateOptionsMenu(menu);
}
2.2.4 表格數(shù)據(jù)展示編程設(shè)計(jì)
部組件詳情頁(yè)中的對(duì)外接口標(biāo)簽頁(yè)和部組件對(duì)外接口連接線纜針腳定義明細(xì),采用smartTable開源控件[7]以表格的形式進(jìn)行展示。使用前需在app/build.gradle文件中的dependencies閉包中添加“com.github.huangyanbin:SmartTable:2.2.0”以引入庫(kù)文件。關(guān)鍵代碼如下所示:
//在activity_interface__datas.xml中添加smartTable控件
android:id="@+id/interface_datas_table" android:layout_width="match_parent" android:layout_height="match_parent" /> //在InterfaceDatasActivity中使用smartTable控件 public class InterfaceDatasActivity extends AppCompatActivity { //InterfaceDatasInfo為自定義類對(duì)象,包含pinNumber、circuitCharacteristic、connectionDestination三個(gè)String變量 private SmartTable //表格表題 private String smartTableTitle; //針腳號(hào) Column //電路特性 Column //信號(hào)去向 Column …… @Override protected void onCreate(Bundle savedInstanceState) { …… //讀取數(shù)據(jù) Intent intent = getIntent(); //接口代號(hào),比如6S2208-7D X1 String check_key = intent.getStringExtra("CHECK_KEY"); //接口對(duì)應(yīng)實(shí)物圖片存儲(chǔ)路徑 mPicturePath = PATH_HEAD + check_key + ".jpg"; //由組合接口代號(hào)分析出組合代號(hào) String mMark = check_key.substring(0,(check_key.indexOf("7D"))+2); //由組合代號(hào)查找組合名稱 String mNameTxt = LitePal.select("name").where("mark = ?", mMark).find(MatchingEquipments.class).get(0).getName(); smartTableTitle = mNameTxt + check_key; …… //查詢數(shù)據(jù)庫(kù),獲取組合對(duì)應(yīng)接口針腳定義數(shù)據(jù) List check_CablePinsDefinitions = LitePal.where("connectiona = ?",check_key).find(CablePinsDefinitions.class); //表格填充數(shù)據(jù) List for(int i=0;i String pinnumber = check_CablePinsDefinitions.get(i).getPinnumberA(); String define = check_CablePinsDefinitions.get(i).getCircuitCharacteristic(); String connect = check_CablePinsDefinitions.get(i).getConnectionB(); connect = connect + ":" + check_CablePinsDefinitions.get(i).getPinnumberB(); list.add(new InterfaceDatasInfo(pinnumber,define,connect)); } //定義表格的列條目 pinNumber = new Column<>("針腳號(hào)", "pinNumber"); //滑動(dòng)到表格左邊時(shí)固定列 pinNumber.setFixed(true); circuitCharacteristic = new Column<>("電路特性", "circuitCharacteristic"); //設(shè)置列左對(duì)齊 circuitCharacteristic.setTextAlign(Paint.Align.LEFT); //定義表格的列條目 connectionDestination = new Column<>("信號(hào)去向", "connectionDestination"); //設(shè)置列左對(duì)齊 connectionDestination.setTextAlign(Paint.Align.LEFT); //定義表格數(shù)據(jù) final TableData interfaceDatasTable = (SmartTable //設(shè)置連接表格數(shù)據(jù) interfaceDatasTable.setTableData(tableData); //隱藏表題 interfaceDatasTable.getConfig().setShowTableTitle(false); //設(shè)置是否顯示頂部序號(hào)列 interfaceDatasTable.getConfig().setShowXSequence(false); //設(shè)置是否顯示左側(cè)序號(hào)列 interfaceDatasTable.getConfig().setShowYSequence(false); //設(shè)置表格單元內(nèi)容字體大小及顏色 interfaceDatasTable.getConfig().setContentStyle(new FontStyle(40, Color.BLUE)); //設(shè)置表格列項(xiàng)點(diǎn)擊事件響應(yīng) pinNumber.setOnColumnItemClickListener(new OnColumnItemClickListener @Override public void onClick(Column Toast.makeText(InterfaceDatasActivity.this,"點(diǎn)擊了" + value,Toast.LENGTH_SHORT).show(); //不要忘記刷新表格,否則選中效果會(huì)延時(shí)一步 interfaceDatasTable.refreshDrawableState(); interfaceDatasTable.invalidate(); }}); …… } 軟件編譯完成后,安裝部署在Android系統(tǒng)智能設(shè)備上,用戶可選擇順序?yàn)g覽查詢、掃碼查詢、關(guān)鍵字搜索查詢3種使用方式,運(yùn)行效果如圖4所示。 圖4 應(yīng)用軟件運(yùn)行效果圖 本文介紹了如何利用華為統(tǒng)一掃碼服務(wù),實(shí)現(xiàn)裝備部組件的掃碼識(shí)別,并查詢、顯示與其相對(duì)應(yīng)的技術(shù)信息,同時(shí)也實(shí)現(xiàn)了關(guān)鍵字搜索查詢部組件相關(guān)技術(shù)信息,通過掃碼識(shí)別查詢和關(guān)鍵字搜索查詢,將裝備信息與裝備快速關(guān)聯(lián)起來,在裝備信息的管理使用上,更加契合現(xiàn)今用戶的使用習(xí)慣,在裝備信息使用管理、技術(shù)培訓(xùn)、維修保障等方面具有極大的軍事使用價(jià)值。3 軟件運(yùn)行結(jié)果
4 結(jié)束語(yǔ)