在HarmonyOS NEXT开发中showLoading 和 showToast 怎么实现?

在HarmonyOS NEXT开发中showLoading 和 showToast 怎么实现?

阅读 501
avatarAI BotBETA

在HarmonyOS NEXT开发中,showLoadingshowToast 的实现可以通过使用 CommonDialogToastDialog 来完成。以下是具体的实现方法:

showLoading

// 引入必要的包
import ohos.aafwk.ability.Ability;
import ohos.agp.components.CommonDialog;
import ohos.agp.window.dialog.Dialog;
import ohos.bundle.IBundleManager;

// 显示加载对话框的方法
public void showLoading(Ability ability) {
    // 创建 CommonDialog 实例
    CommonDialog loadingDialog = new CommonDialog(ability);
    loadingDialog.setTitle("Loading...");
    loadingDialog.setMessage("Please wait...");
    loadingDialog.setCancelable(false); // 禁止取消对话框

    // 设置对话框的样式为加载样式
    loadingDialog.setProgressStyle(CommonDialog.PROGRESS_STYLE_SPINNER);

    // 显示对话框
    loadingDialog.show();
}

showToast

// 引入必要的包
import ohos.aafwk.ability.Ability;
import ohos.agp.components.Component;
import ohos.agp.window.dialog.ToastDialog;

// 显示Toast的方法
public void showToast(Ability ability, String message) {
    // 创建 ToastDialog 实例
    ToastDialog toastDialog = new ToastDialog(ability);
    toastDialog.setText(message);
    toastDialog.setDuration(ToastDialog.LENGTH_SHORT); // 设置显示时间

    // 显示Toast
    toastDialog.show();
}

使用示例

// 在某个Ability中调用这两个方法
public class MyAbility extends Ability {
    @Override
    protected void onStart(Intent intent) {
        super.onStart(intent);
        super.setUIContent(ResourceTable.Layout_ability_main);

        // 显示加载对话框
        showLoading(this);

        // 模拟一些异步操作,比如网络请求
        new Thread(() -> {
            try {
                Thread.sleep(3000); // 模拟耗时操作
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            // 在UI线程更新UI
            getUITaskDispatcher().postTask(() -> {
                // 关闭加载对话框
                // 注意:这里需要持有对加载对话框的引用,以便能够关闭它
                // 这里仅作为示例,实际代码中需要管理对话框的生命周期
                showToast(MyAbility.this, "Loading complete!");
            });
        }).start();
    }

    // 前面定义的 showLoading 和 showToast 方法需要在这个类中或作为工具类被调用
}

注意:在上面的示例中,showLoading 方法创建的 CommonDialog 实例没有在示例中被持有引用,实际开发中你需要管理这个对话框的生命周期,以便在适当的时候关闭它。这通常涉及到在适当的时机(如异步操作完成后)调用 dialog.hide()dialog.cancel() 方法。

1 个回答

可使用promptAction.openCustomDialog自定义弹窗:

//Index.ets  
import { 
  changeDialogBuilder, 
  MyShowTest 
} 
  from '../common/HttpUtils'import { 
  customDialogBuilder 
} 
  from './testProm'let myShowTest = new MyShowTest()@Entry@Component struct Index {@State message: string = 'Hello World'onPageShow() : void { 
  changeDialogBuilder(customDialogBuilder.bind(this)) 
} 
  build() { 
    Row() { 
      Column() { 
        Text(this.message).fontSize(50).fontWeight(FontWeight.Bold).onClick(() = >{ 
          myShowTest.showTest() 
        }) 
      }.width('100%') 
    }.height('100%') 
  } 
} 
//testProm.ets  
@Builder export 
function customDialogBuilder() { 
  Column() { 
    Text('正在加载中').fontSize(16) 
  }.height(100).width(100).backgroundColor('#EEE') 
} 
//HttpUtils.ets  
import promptAction from '@ohos.promptAction'let myDialogBuilder: CustomBuilder; 
let customDialogId: number = 0 export 
function changeDialogBuilder(builder: CustomBuilder) { 
  myDialogBuilder = builder 
} 
export class MyShowTest { 
  showTest() { 
    if (myDialogBuilder === undefined) { 
      return 
    } 
    promptAction.openCustomDialog({ 
      builder: myDialogBuilder, 
      alignment: DialogAlignment.Center, 
    }).then((dialogId: number) = >{ 
      customDialogId = dialogId 
    }) setTimeout(() = >{ 
      promptAction.closeCustomDialog(customDialogId) 
    }, 
      2000) 
  } 
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进