Вылетает программа при попытке вывести некторые аргументы в Log. Kotlin

Я создавал приложение, в нём есть элемент "Number (Decimal)", c id result_editText

введите сюда описание изображения

введите сюда описание изображения

Я хотел сделать его недоступным для изменения после некоторого момента, для этого написал

result_editText.setEnabled(false);
result_editText.setCursorVisible(false);

Но при компиляции и запуске на устройстве приложение вылетало (оно скмплировалось, вывелось значком на рабочий стол, но при запуске вылетает)

Я решил проверить что не так, поэтому переписал код таким образом:

//result_editText.setEnabled(false);
//result_editText.setCursorVisible(false);
Log.d("tag", result_editText.text.toString())

Но проблема осталась. Можете подсказать в чём может быть дело?

P.S. kotlinx.android.synthetic.main.fragment_home.* импортирован

P.P.S. Закоментировав обращение к result_editText программа работает полностью корректно.

P.P.P.S. Вот xml представление этого эл-а

1


Ответы (1 шт):

Автор решения: Sergei Buvaka

Если вы используете Kotlin, вам нет необходимости вызывать findViewById(). Но тут нужно помнить 2 вещи.

В Activity ваш макет раздувается в методе onCreate() вызовом метода setContentView() и сразу же после него вы можете использовать синтетики. Если вы попытаетесь воспользоваться синтетиком раньше чем вызовется этот метод - получите IllegalStateException.

Частой ошибкой бывает аналогичная попытка использования синтетиков в Fragment-ах. Так как в Java вы присваиваете значение переменным в onCreateView() многие новички пытаются это же сделать и с помощью синтетиков в Kotlin-е, не совсем понимая как это работает.

Поясню:

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.your_layout, container, false);
    textView = view.findViewById(R.id.text_vew);
    return view;
}

Как видите тут для того чтоб получить доступ к View через findViewById() вы используете View которую уже раздули с помощью LayoutInflater. Потому вы имеет доступ к этим id.

Но в Kotlin-е синтетик в этом месте программы еще не может получить доступ к этой ссылке. Я лично не пробовал, но уверен, что если вы обратитесь к вашей переменной в этом месте через view.textView это сработает.

Но более логичным подходом будет начинать использовать элементы XML уже в методе onViewCreated() или позже. Этот метод говорит, что View уже создана и готова к работе.

Я думаю ваша проблема находится здесь.

→ Ссылка