文档管理中心
我的

使用导航类组件

NDK提供一系列Navigation和页面路由状态查询接口,开发者可以通过OH_ArkUI_GetNavDestinationName、OH_ArkUI_GetNavDestinationParam、OH_ArkUI_GetNavDestinationState、OH_ArkUI_GetNavigationId、OH_ArkUI_GetNavDestinationIndex等查询页面的状态、索引、名称等信息,并根据查询结果进行对应的操作,如显示不同的页面信息。

本文提供页面状态查询开发指导,查询之前需要先接入ArkTS页面,具体请参考接入ArkTS页面。

查询页面信息

查询页面信息,需要先确保目标节点已作为子节点挂载到页面中,若节点未挂载则操作会失败,例如在aboutToAppear生命周期中查询不到对应信息。页面详细生命周期以及组件挂载生命周期参考页面生命周期。开发者可以根据查询到的页面信息加载不同的页面组件。

本示例仅展示核心功能代码,完整示例请参考NDK使用页面查询接口示例。

  1. 查询当前页面名称。

    使用OH_ArkUI_GetNavDestinationName可以查询NavDestination页面名称。router页面名称可以通过OH_ArkUI_GetRouterPageName接口查询。

    收起
    自动换行
    深色代码主题
    复制
    1. // 获取页面名称
    2. char pageName[NUM_50];
    3. int32_t bufferLen = 0;
    4. OH_ArkUI_GetNavDestinationName(node, pageName, NUM_50, &bufferLen);
  2. 查询页面跳转参数。

    使用OH_ArkUI_GetNavDestinationParam可以查询NavDestination页面跳转参数。

    收起
    自动换行
    深色代码主题
    复制
    1. // 获取页面跳转参数
    2. napi_value param = OH_ArkUI_GetNavDestinationParam(node);
    3. napi_value nameVal = nullptr;
    4. napi_get_named_property(env, param, "name", &nameVal);
    5. size_t len = 0;
    6. napi_get_value_string_utf8(env, nameVal, nullptr, 0, &len);
    7. std::unique_ptr<char[]> viewName = std::make_unique<char[]>(len + 1);
    8. napi_get_value_string_utf8(env, nameVal, viewName.get(), len + 1, &len);
    9. ArkUI_NodeHandle targetNode = nullptr;
    10. std::string view = viewName.get();
    11. if (view == "QueryNavigation") {
    12. InitNavigationNode(column, pageName);
    13. } else if (view == "QueryRouter") {
    14. InitRouterNode(column);
    15. }
    16. nativeApi->addChild(node, column);

查询页面状态

使用OH_ArkUI_GetNavDestinationState可以查询当前占位组件所属的NavDestination页面状态。router页面可以通过OH_ArkUI_GetRouterPageState接口查询,根据查询结果进行对应的适配,如设置组件visible属性、视频播放状态。

本示例仅展示核心功能代码,完整示例请参考NDK使用页面查询接口示例。

收起
自动换行
深色代码主题
复制
  1. ArkUI_NodeHandle targetNode = nullptr;
  2. OH_ArkUI_NodeUtils_GetAttachedNodeHandleById("navDestinationState", &targetNode);
  3. auto entry = NativeEntry::GetInstance();
  4. entry->ReportError(targetNode, "event clicked");
  5. ArkUI_NavDestinationState state;
  6. OH_ArkUI_GetNavDestinationState(targetNode, &state);
  7. if (state == NUM_8) {
  8. entry->SetColor(targetNode, 0x80808080);
  9. } else if (state == NUM_9) {
  10. entry->SetColor(targetNode, 0xFF000000);
  11. }

查询页面栈信息

使用OH_ArkUI_GetNavDestinationIndex可以查询当前占位组件所属NavDestination在栈中的位置。router页面索引可以通过OH_ArkUI_GetRouterPageIndex接口查询。根据返回的页面栈信息,可在应用开发中实现DFX功能,例如性能监控与用户行为分析等参数的收集,用于数据上报和分析。

本示例仅展示核心功能代码,完整示例请参考NDK使用页面查询接口示例。

收起
自动换行
深色代码主题
复制
  1. char navigationId[NUM_50];
  2. int32_t bufferLen = 0;
  3. OH_ArkUI_GetNavigationId(handle, navigationId, NUM_50, &bufferLen);
  4. char name[NUM_50];
  5. int32_t nameLen = OH_ArkUI_GetNavDestinationName(handle, name, NUM_50, &nameLen);
  6. int32_t index = -1;
  7. OH_ArkUI_GetNavDestinationIndex(handle, &index);
  8. OH_LOG_Print(LOG_APP, LOG_ERROR, 0xFF00, "NAPI",
  9. "navigation id: %{public}s, name: %{public}s, index: %{public}d, error: %{public}s",
  10. navigationId, name, index, info.c_str());