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