Как обрабатывать изменения назначения NavController? - PullRequest
0 голосов
/ 04 ноября 2019

Я хочу реализовать addOnDestinationChangedListener, но не повезло. Я попытался реализовать это самостоятельно, но идентификаторы не совпадают

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

1 Ответ

0 голосов
/ 04 ноября 2019

Вы используете R.id.action_numberEntryFragment_to_otpFragment - т. Е. Идентификаторы действий , которые вы используете. Тем не менее, OnDestinationChangedListener получает идентификатор пункта назначения , в который вы в конечном итоге действительно отправляетесь, т. Е. Поле app:destination в <action>.

Поэтому вам следует использоватьцелевые идентификаторы (просто догадываясь, какие у вас целевые идентификаторы):

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;
    }
});
...