【问题标题】:How to handle NavController destination changes?如何处理 NavController 目标更改?
【发布时间】:2019-11-04 03:52:17
【问题描述】:

我想实现 addOnDestinationChangedListener,但是没有运气。我试过自己实现它,但是 id 不匹配

NavController mController = Navigation.findNavController(this, R.id.nav_auth_fragment);
mController.addOnDestinationChangedListener((controller, destination, arguments) -> {
    switch (destination.getId()){
        case R.id.action_loginFragment_to_numberEntryFragment:
            Toast.makeText(this, "Welcome to number Entry", Toast.LENGTH_SHORT).show();
            break;
        case R.id.action_numberEntryFragment_to_otpFragment:
            Toast.makeText(this, "Enter your OTP", Toast.LENGTH_SHORT).show();
            break;
        case R.id.action_otpFragment_to_userRegistrationFragment:
            Toast.makeText(this, "Your number is verified!", Toast.LENGTH_SHORT).show();
            break;
        default:
            break;
    }
});

我尝试记录它,这是结果

2019-11-04 11:39:17.179 26830-26830/com.example.myapp D/AuthActivity: 2131230930 == 2131230775 = false
2019-11-04 11:39:17.179 26830-26830/com.example.myapp D/AuthActivity: 2131230930 == 2131230781 = false
2019-11-04 11:39:17.180 26830-26830/com.example.myapp D/AuthActivity: 2131230930 == 2131230782 = false
where 2131230930 is the destination.getId() and (2131230775, 2131230781, 2131230782) is the resource ids
even when I'm at the destination, the id still doesn't match with the resource id

【问题讨论】:

  • 这段代码是在activity还是fragment中?
  • @coroutineDispatcher 代码在活动中。
  • @ArchuMohan 谢谢你,但是我在安装支持存储库时没有问题

标签: android android-jetpack android-jetpack-navigation


【解决方案1】:

您正在使用R.id.action_numberEntryFragment_to_otpFragment - 即您正在使用的操作 的 ID。但是,OnDestinationChangedListener 会收到您最终实际要去的 destination 的 ID - 即 <action> 上的 app:destination 字段。

因此,您应该使用目标 ID(只是猜测您的目标 ID 是什么):

mController.addOnDestinationChangedListener((controller, destination, arguments) -> {
    switch (destination.getId()){
        case R.id.numberEntryFragment:
            Toast.makeText(this, "Welcome to number Entry", Toast.LENGTH_SHORT).show();
            break;
        case R.id.otpFragment:
            Toast.makeText(this, "Enter your OTP", Toast.LENGTH_SHORT).show();
            break;
        case R.id.userRegistrationFragment:
            Toast.makeText(this, "Your number is verified!", Toast.LENGTH_SHORT).show();
            break;
        default:
            break;
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 2023-02-21
    相关资源
    最近更新 更多