Подтвердить что ты не робот

Ошибка Android в слайд-активности

Поэтому, пытаясь использовать переход активности Slide, но с другой серьезностью, приложение падает при использовании Gravity.START, используя это:

getWindow().setExitTransition(new Slide(Gravity.START));

и я получаю эту ошибку:

IllegalArgumentException: Неверное направление слайда

Но если вы посмотрите в исходном коде, этот конкретный конструктор над вызовами setSlideEdge(), то в этом случае этот метод проходит через оператор switch, чтобы установить значение Gravity, которое вы указали ранее:

switch (slideEdge) {
        case Gravity.LEFT:
            mSlideCalculator = sCalculateLeft;
            break;
        case Gravity.TOP:
            mSlideCalculator = sCalculateTop;
            break;
        case Gravity.RIGHT:
            mSlideCalculator = sCalculateRight;
            break;
        case Gravity.BOTTOM:
            mSlideCalculator = sCalculateBottom;
            break;
        case Gravity.START:
            mSlideCalculator = sCalculateStart;
            break;
        case Gravity.END:
            mSlideCalculator = sCalculateEnd;
            break;
        default:
            throw new IllegalArgumentException("Invalid slide direction");
    }

Gravity.LEFT работает нормально, но поскольку я хочу поддержку RTL, имеет смысл использовать Gravity.START. Я в замешательстве, почему случай по умолчанию выполняется в этом операторе switch, и единственным объяснением для него является ошибка.

Я бы сообщил об этом Google, но у них нет общедоступных способов сообщать об ошибках API, подобных этому, и в этом случае ошибка не совсем очевидна для исправления. Итак, PSA для всех, кто хочет использовать анимацию слайдов с гравитацией START.

4b9b3361

Ответ 1

Это проблема, которая приводит к сбоям на устройствах API 21. Причина в том, что исходная версия Slide в API 21 поддерживает только LEFT, TOP, RIGHT и BOTTOM силы тяжести.

Источник слайдов из API 21

Источник слайдов из API 22

Один из способов решения этой проблемы - использовать GravityCompat из Поддержка библиотеки.

new Slide(GravityCompat.getAbsoluteGravity(GravityCompat.START, getResources().getConfiguration().getLayoutDirection()));

Метод getAbsoluteGravity() принимает предпочтительный вес (START или END) и текущее направление макета и возвращает значение силы тяжести как LEFT или RIGHT в зависимости от текущей конфигурации.