Dlaczego tak
Metoda apply() od razu zapisuje zmianę w pamięci obiektu SharedPreferences, a na dysk przenosi ją asynchronicznie, dlatego następujący po niej odczyt zwraca już 18. Klucza „kolor” nie zapisano, więc getInt zwraca wartość domyślną podaną w drugim argumencie, czyli 14, a nie 0 ani wyjątek. Odpowiedź r = 14 wynika z błędnego założenia, że apply() działa tak wolno, iż odczyt nie widzi jeszcze nowej wartości.