亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于華為統(tǒng)一掃碼服務(wù)編程實(shí)現(xiàn)裝備信息的交互查詢

        2021-06-30 12:44:52杜國(guó)祥楊小龍
        關(guān)鍵詞:詳情頁(yè)代號(hào)掃碼

        杜國(guó)祥,劉 洋,楊小龍,王 君

        (中國(guó)人民解放軍32382部隊(duì),武漢 430311)

        0 引言

        為適應(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ā)用戶興趣。

        1 總體構(gòu)想

        按照裝備配套表,為其所有部組件及其連接線纜統(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ù)信息。

        2 軟件設(shè)計(jì)

        2.1 軟件總體設(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 關(guān)鍵軟件編程設(shè)計(jì)

        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(this,android.R.layout.simple_dropdown_item_1line, 0,list);

        //為輸入框設(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 interfaceDatasTable;

        //表格表題

        private String smartTableTitle;

        //針腳號(hào)

        Column pinNumber;

        //電路特性

        Column circuitCharacteristic;

        //信號(hào)去向

        Column connectionDestination;

        ……

        @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 = new List() {};

        check_CablePinsDefinitions = LitePal.where("connectiona = ?",check_key).find(CablePinsDefinitions.class);

        //表格填充數(shù)據(jù)

        List list = new ArrayList<>();

        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 tableData = new TableData<>(smartTableTitle,list, pinNumber, circuitCharacteristic, connectionDestination);

        interfaceDatasTable = (SmartTable)findViewById(R.id.interface_datas_table);

        //設(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 column, String value, String bool, int position) {

        Toast.makeText(InterfaceDatasActivity.this,"點(diǎn)擊了" + value,Toast.LENGTH_SHORT).show();

        //不要忘記刷新表格,否則選中效果會(huì)延時(shí)一步

        interfaceDatasTable.refreshDrawableState();

        interfaceDatasTable.invalidate();

        }});

        ……

        }

        3 軟件運(yùn)行結(jié)果

        軟件編譯完成后,安裝部署在Android系統(tǒng)智能設(shè)備上,用戶可選擇順序?yàn)g覽查詢、掃碼查詢、關(guān)鍵字搜索查詢3種使用方式,運(yùn)行效果如圖4所示。

        圖4 應(yīng)用軟件運(yùn)行效果圖

        4 結(jié)束語(yǔ)

        本文介紹了如何利用華為統(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à)值。

        猜你喜歡
        詳情頁(yè)代號(hào)掃碼
        《中獸醫(yī)學(xué)雜志》
        跨境電商背景下廣西工藝品詳情頁(yè)優(yōu)化技巧
        《中獸醫(yī)學(xué)雜志》
        臍橙連上物聯(lián)網(wǎng) 掃碼便知“前世今生”
        山之高
        演習(xí)代號(hào):圍城計(jì)劃
        代號(hào)“凌凌漆”
        淺析消費(fèi)心理下商品無線端詳情頁(yè)優(yōu)化策略
        絲路視野(2019年31期)2019-05-09 13:45:32
        中國(guó)進(jìn)入“掃碼”時(shí)代
        伙伴(2018年1期)2018-05-14 10:49:15
        店鋪詳情頁(yè)裝修那些事
        日本成熟妇人高潮aⅴ| 一个人看的视频www免费| 日本一区午夜艳熟免费| 成人日韩av不卡在线观看| av网站在线观看二区| 熟女中文字幕一区二区三区 | 日韩欧美在线综合网| 亚洲成aⅴ人片在线观看天堂无码| 亚洲天堂av高清在线| 公与淑婷厨房猛烈进出| 亚洲av无码不卡久久| 狠狠丁香激情久久综合| 在线观看一区二区三区国产| 美女扒开屁股让男人桶| 国产无遮挡又黄又爽又色| 亚洲香蕉毛片久久网站老妇人 | 一本一本久久a久久精品综合| 国产一区二区三区在线av| 97一期涩涩97片久久久久久久| 国产亚洲日韩在线三区| 欧美亚洲另类自拍偷在线拍| 亚洲精品一区二区三区在线观| 国产综合色在线视频区| 99亚洲精品久久久99| 黑人一区二区三区在线| 青青草在线这里只有精品| 一夲道无码人妻精品一区二区| 青春草国产视频| 亚洲无人区一码二码国产内射| 日韩视频在线观看| 久久久久亚洲av无码观看| 国产在线观看网址不卡一区| 国产在线视频91九色| 小宝极品内射国产在线| 精品91亚洲高清在线观看| 亚洲三级香港三级久久| 东京道一本热中文字幕| 成人区视频| 日本在线无乱码中文字幕 | 国产系列丝袜熟女精品视频| 偷拍偷窥在线精品视频|