Вылетает программа при попытке вывести некторые аргументы в 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 шт):
Если вы используете 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 уже создана и готова к работе.
Я думаю ваша проблема находится здесь.


