新聞中心
想了解更多內(nèi)容,請(qǐng)?jiān)L問:

創(chuàng)新互聯(lián)建站2013年開創(chuàng)至今,先為赫山等服務(wù)建站,赫山等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為赫山企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos.
在開發(fā)HarmonyOS應(yīng)用時(shí),你是否也遇到過翻遍資料也找不到答案的困擾?
沒關(guān)系,本期我們將為大家?guī)黹_發(fā)者呼聲最高的16個(gè)問題答疑,涵蓋FA開發(fā)和UI組件,有原理有代碼,讓你快速get到解決方案。
趕緊往下看,一起來學(xué)習(xí)學(xué)習(xí)吧~
一、FA開發(fā)篇
Q1:在JS開發(fā)中,一個(gè)文件如何使用定義在其他文件中的變量?
A: 在開發(fā)過程中,有時(shí)候?yàn)榱舜a清晰,會(huì)新建一個(gè)文件,定義一個(gè)變量,把某個(gè)數(shù)據(jù)很大的常量數(shù)組獨(dú)立到該新建文件中,其他文件有需要的時(shí)候可以使用到該數(shù)據(jù)。那么究竟應(yīng)該如何使用?
舉個(gè)例子,我們新建一個(gè)data.js的文件,定義一個(gè)data1的變量存儲(chǔ)數(shù)據(jù)。
若我們需要使用到data.js中的data1變量,首先需要將data1變量導(dǎo)出:
在data.js文件末尾加上如下代碼:
- export {
- data1
- }
接著在需要使用該數(shù)據(jù)的文件頭中導(dǎo)入data.js文件,假設(shè)此時(shí)是user.js需要使用data1數(shù)據(jù),那么我們?cè)趗ser.js的文件頭中導(dǎo)入data.js文件,代碼如下:
- import data from '../../common/js/data.js'
在user.js文件中使用data.data1就可使用data1變量了。
Q2:在JS開發(fā)中,如何控制塊元素的橫縱向排列?
A: 如果想在JS中實(shí)現(xiàn)塊元素的縱向排列,需要給父元素設(shè)置flex-direction:column;如果想在JS中實(shí)現(xiàn)塊元素的橫向排列,需要給父元素設(shè)置flex-direction:row。通常容器組件flex-direction樣式的缺省值為row,即默認(rèn)為橫向排列。
Q3:在JS開發(fā)中,如何控制一個(gè)元素顯示或隱藏?
A: 在JS中,如果想要?jiǎng)討B(tài)控制某個(gè)元素的顯示或隱藏,可以為元素添加show屬性,并為這個(gè)屬性綁定js變量;若將變量值設(shè)為true,即可控制元素顯示,設(shè)為false,則控制元素隱藏,示例代碼如下:
Q4:為什么export的JS模塊在別的JS文件中import時(shí),會(huì)出現(xiàn)修改不生效的情況呢?
A: 在JS開發(fā)中,開發(fā)者可能會(huì)遇到這樣的情況,某個(gè)變量在模塊1中,被模塊2 import并使用了,但是修改模塊1中的這個(gè)變量,模塊2中并沒有生效這個(gè)修改的情況。這是由于HarmonyOS JS UI框架的import是靜態(tài)import,即編譯過程會(huì)把互相依賴的文件合并以提高運(yùn)行效率。如果一個(gè)JS模塊被多個(gè)文件import,則會(huì)在不同的文件中分別生成變量。
如果是要共享使用某個(gè)變量,使之變化在各模塊中都能生效,建議在app.js里聲明變量,并通過**getApp()**全局方法去獲取該對(duì)象。
Q5:FA卡片如何動(dòng)態(tài)更換圖片?
A: 開發(fā)者可以通過調(diào)用setImageContent接口實(shí)現(xiàn)FA卡片圖片的動(dòng)態(tài)更換。但使用setImageContent接口設(shè)置圖片時(shí),涉及到資源id,需要在/base/profile中新建remote.xml配置文件,內(nèi)容如下:
- $media:test
其中,test是需要設(shè)置的圖片名。
Q6:如何定位AbilitySlice展示耗時(shí)問題?
A: 當(dāng)開發(fā)者在開發(fā)自己的app的時(shí)候,如果發(fā)現(xiàn)頁(yè)面展示的比較慢,需要對(duì)耗時(shí)問題進(jìn)行定位并針對(duì)性進(jìn)行改進(jìn),HarmonyOS提供兩種方法幫助開發(fā)者完成該定位:
1.通過bytrace提供的接口進(jìn)行打點(diǎn)跟蹤:
● 詳情請(qǐng)參考:
https://developer.harmonyos.com/cn/docs/documentation/doc-references/bytrace-0000001054679000
2.通過用于追蹤進(jìn)程軌跡、分析性能的命令行工具——bytrace來實(shí)現(xiàn):
● 詳情請(qǐng)參考:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ide-command-line-bytrace-0000001125636225
Q7 :HarmonyOS中如何讀取EXCEL中的數(shù)據(jù)?
A: 開發(fā)者可以參考以下步驟實(shí)現(xiàn):
1.在entry > build.gradle中添加如下依賴:
- dependencies {
- ……
- implementation group: 'org.jxls', name: 'jxls-jexcel', version: '1.0.9'
- }
2.在entry > resources > base > media目錄下加入要讀取的EXCEL表格,注意EXCEL表格的后綴為xls。
3.在MainAbilitySlice.java中讀取EXCEL表格中的數(shù)據(jù),代碼如下:
- public class MainAbilitySlice extends AbilitySlice {
- private static final HiLogLabel TAG = new HiLogLabel(3, 0xD001100, "MainAbilitySlice");
- @Override
- public void onStart(Intent intent) {
- super.onStart(intent);
- super.setUIContent(ResourceTable.Layout_ability_main);
- // 處理EXCEL表格數(shù)據(jù)
- try {
- // 打開EXCEL文件
- Resource resource = getResourceManager()
- .getRawFileEntry("entry/resources/base/media/excel.xls").openRawFile();
- Workbook wb = Workbook.getWorkbook(resource);
- int sheetSize = wb.getNumberOfSheets();
- if (sheetSize > 0) {
- // 獲取EXCEL的第一個(gè)sheet
- Sheet sheet = wb.getSheet(0);
- int rowTotal = sheet.getRows();
- // 遍歷單元格獲取數(shù)據(jù)
- for (int i = 0; i < rowTotal; i++) {
- Cell[] cells = sheet.getRow(i);
- for (int j = 0; j < cells.length; j++) {
- String content = cells[j].getContents();
- HiLog.info(TAG, "content:" + content);
- }
- }
- }
- } catch (IOException | BiffException e) {
- HiLog.error(TAG, "exception");
- }
- }
- }
二、UI組件篇
Q1:如何在JS中給image組件切換圖源?
A: 將image組件中的src屬性用js中的變量綁定,如 src=“{{imageSrc}}”,當(dāng)需要更改圖源時(shí),僅需在js文件中將這個(gè)js變量值變更即可,如 imageSrc=“/common/pic.png”。
Q2:如何在JS中實(shí)現(xiàn)文本超長(zhǎng)時(shí)顯示省略號(hào)?
A: 開發(fā)者需要先為文本設(shè)置一個(gè)最大行數(shù),接著使用樣式text-overflow:ellipsis,在文本超出行數(shù)時(shí),即會(huì)用省略號(hào)表示。
Q3:如何通過JS實(shí)現(xiàn)點(diǎn)擊input組件并實(shí)現(xiàn)打開鍵盤的效果?
A: 在**.hml中給input組件設(shè)置id值,并為其設(shè)置focusable="true"的屬性,在.js**中通過this.$element(“inputID”)取到input元素,然后調(diào)用focus方法即可,代碼示例如下:
.hml:
- focusable="true">
.js:
- this.$element("box").focus({focus:true})
Q4:Switch組件如何設(shè)置thumb高度超出track?
A: Switch即開關(guān)選擇器,通過開關(guān),實(shí)現(xiàn)某個(gè)功能的開啟或關(guān)閉。但在用戶的實(shí)際使用中,可能出現(xiàn)由于手指不能完全對(duì)準(zhǔn)Switch組件導(dǎo)致無法實(shí)現(xiàn)開關(guān)控制的情況,原始效果如下:
因此開發(fā)者的解決方案是設(shè)置組件滑動(dòng)塊高出底層的高度或者滑動(dòng)手柄的高度超出滑動(dòng)軌跡的高度來增加用戶可控范圍。效果如下:
可以看到藍(lán)色圈圈的高度是超出底層灰色的高度,實(shí)現(xiàn)這種效果的代碼如下:
- Switch testSwitch = (Switch) findComponentById(ResourceTable.Id_test_switch);
- ShapeElement trackOn = new ShapeElement();
- trackOn.setShape(ShapeElement.PATH);
- trackOn.setRgbColor(RgbPalette.BLUE);
- Path pathOn = new Path();
- pathOn.addRoundRect(new RectFloat(0.0f, 10.0f, 200.0f, 90.0f), 40.0f, 40.0f, Path.Direction.CLOCK_WISE);
- trackOn.setBounds(0, 0, 100, 200);
- trackOn.setPath(pathOn);
- ShapeElement trackOff = new ShapeElement();
- trackOff.setShape(ShapeElement.PATH);
- trackOff.setRgbColor(RgbPalette.GRAY);
- Path pathOFF = new Path();
- pathOFF.addRoundRect(new RectFloat(0.0f, 10.0f, 200.0f, 90.0f), 40.0f, 40.0f, Path.Direction.CLOCK_WISE);
- trackOff.setBounds(0, 0, 100, 200);
- trackOff.setPath(pathOFF);
- StateElement stateElement = new StateElement();
- stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_CHECKED}, trackOn);
- stateElement.addState(new int[]{ComponentState.COMPONENT_STATE_EMPTY}, trackOff);
Q5:Java開發(fā)中,當(dāng)TextField組件底部對(duì)齊時(shí),如何才能避免輸入內(nèi)容后組件被軟鍵盤遮擋?
A: 當(dāng)TextField組件被設(shè)計(jì)在底部時(shí),開發(fā)者可以通過以下方法避免輸入內(nèi)容后TextField組件被軟鍵盤遮擋,步驟如下:
調(diào)用TextField父類Component中的setLayoutRefreshedListener方法進(jìn)行組件布局刷新監(jiān)聽;
在回調(diào)中通過getWindowVisibleRect方法獲取組件可視矩形區(qū)域;
根據(jù)可視區(qū)域算出textField需要移動(dòng)的距離,使textField不被軟件盤遮擋;
示例代碼如下:
- Component componentByIdLayout = findComponentById(ResourceTable.Id_directionlayout);
- if (componentByIdLayout instanceof DirectionalLayout) {
- mLayout = (DirectionalLayout) componentByIdLayout;
- }
- Component componentByIdTextField = findComponentById(ResourceTable.Id_text_field);
- if (componentByIdTextField instanceof TextField) {
- mTextField = (TextField) componentByIdTextField;
- }
- // 監(jiān)聽組件布局刷新
- mLayout.setLayoutRefreshedListener(new Component.LayoutRefreshedListener() {
- @Override
- public void onRefreshed(Component component) {
- Rect rect = new Rect();
- // 獲取組件可視矩形區(qū)域
- boolean result = mTextField.getWindowVisibleRect(rect);
- if (!result) {
- HiLog.error(TAG, "getWindowVisibleRect fail");
- return;
- }
- if (mTempVisibleHeight == 0 || mTempVisibleHeight == rect.bottom) {
- mTempVisibleHeight = rect.bottom;
- return;
- }
- // 計(jì)算textField組件需要移動(dòng)的距離
- int inputHeight = mTempVisibleHeight - rect.bottom;
- mTempVisibleHeight = rect.bottom;
- if (inputHeight > 0) {
- mTextField.setText("input method height is " + inputHeight);
- mTextField.setTranslationY(0 - inputHeight);
- }
- if (inputHeight < 0) {
- mTextField.setText("input method height is 0");
- mTextField.setTranslationY(0);
- }
- }
- });
Q6:Java開發(fā)中,為什么TextField組件橫、豎屏?xí)r輸入樣式差別很大?
A: 當(dāng)TextField組件的width和height屬性設(shè)置為match_parent時(shí),會(huì)根據(jù)屏幕寬高自動(dòng)適配,故橫、豎屏?xí)r,TextField尺寸會(huì)發(fā)生改變,樣式差別很大。如果需要保持橫豎屏切換不改變TextField組件,開發(fā)者只需設(shè)置固定大小即可。
Q7:如何使應(yīng)用不支持多窗口特性?
A: 一般情況下,HarmonyOS默認(rèn)應(yīng)用支持多窗口特性,若開發(fā)者不需要此支持,可以在config.json文件“module”節(jié)點(diǎn)下增加屬性標(biāo)識(shí)“resizeable”: false即可,該設(shè)置適用于手機(jī)、平板、智慧屏、車機(jī)、智能穿戴。
● 詳情請(qǐng)參考:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/basic-config-file-elements-0000000000034463
Q8:Fraction如何在子線程中更新UI?
A: Fraction可以作為UI的一部分放在Ability或者AbilitySlice中,不能單獨(dú)使用。Fraction的生命周期狀態(tài)取決于它的容器。如果容器被銷毀,其中的所有部分也將被銷毀,開發(fā)者可以使用Fraction定義各種布局,以豐富應(yīng)用程序的用戶界面。開發(fā)者可以通過EventHandler的方式在子線程中更新UI,可參考如下代碼實(shí)現(xiàn):
- public class MeFraction extends Fraction {
- public void execute(Text text) {
- EventHandler handler = new EventHandler(EventRunner.current()) {
- // 重寫實(shí)現(xiàn)processEvent方法處理事件
- @Override
- protected void processEvent(InnerEvent event) {
- super.processEvent(event);
- if (event == null) {
- return;
- }
- if (event.eventId == 100) {
- text.setText("更新UI");
- }
- }
- };
- // 創(chuàng)建子線程并通過EventHandler發(fā)送事件
- new Thread(() -> handler.sendEvent(InnerEvent.get(100))).start();
- }
- }
Q9:如何通過代碼實(shí)現(xiàn)橫幅展示消息功能?
A: 在Java開發(fā)中,要實(shí)現(xiàn)消息展示功能需要用到NotificationSlot功能集合,其控制包括通知音、振動(dòng)、鎖屏顯示和級(jí)別。當(dāng)開發(fā)者將NotificationSlot的級(jí)別設(shè)置為L(zhǎng)EVEL_HIGH,即可實(shí)現(xiàn)橫幅展示消息功能。
- NotificationSlot slot = new NotificationSlot("slot_001", "slot_default", NotificationSlot.LEVEL_HIGH);
● 更多關(guān)于NotificationSlot的介紹可以參考官網(wǎng)鏈接:
https://developer.harmonyos.com/cn/docs/documentation/doc-references/notificationslot-0000001054120100
想了解更多內(nèi)容,請(qǐng)?jiān)L問:
和華為官方合作共建的鴻蒙技術(shù)社區(qū)
https://harmonyos.
當(dāng)前文章:據(jù)說,90%以上的開發(fā)者都想知道這些問題的答案
本文路徑:http://www.dlmjj.cn/article/dpieeop.html


咨詢
建站咨詢
