#android #android-intent #firebase-realtime-database #onitemclicklistener
#Android #android-намерение #firebase-realtime-database #onitemclicklistener
Вопрос:
Я знаю, что здесь много таких вопросов, но я считаю, что моя проблема уникальна.
У меня есть список модулей, когда пользователь выбирает модуль, открывается другое действие, показывающее «колоды» для этого модуля. Для этого требуется, чтобы второе действие узнало, какой элемент listview был нажат. Ниже я пытаюсь добиться этого.
modulesListView.setOnItemClickListener((parent, view, position, id) -> {
ModuleObject moduleObject = list.get(position);
Intent intent = new Intent(FlashCards.this, FlashCardDecks.class);
Bundle extras = new Bundle();
extras.putString("EXTRA_MODULE_ID", moduleObject.getModuleId());
extras.putString("EXTRA_MODULE_NAME", moduleObject.getModuleName());
intent.putExtras(extras);
startActivity(intent);
});
В новом действии я получаю доступ к имени модуля и идентификатору следующим образом:
Bundle extras = getIntent().getExtras();
assert extras != null;
String moduleId = extras.getString("EXTRA_MODULE_ID");
String moduleName = extras.getString("EXTRA_MODULE_NAME");
Затем я использую moduleName для установки заголовка и ModuleID для доступа к firebase и заполнения listview. Все хорошо. Переменные передаются так, как они должны быть.
Но в моем втором действии у меня есть диалоги, которые позволяют пользователям добавлять и удалять «колоды» из базы данных firebase, используя следующую ссылку…
decksDatabaseReference = firebaseDatabase.getReference().child(userID).child("decks").child(moduleId);
Используя эту ссылку, пользователь может добавить «колоды» в listview во втором действии
//create new deckObjet
DeckObject deckObject = new DeckObject();
//get unique id from firebase
String deckId = decksDatabaseReference.push().getKey();
//set unique id to deck object
deckObject.setId(deckId);
//add new deckObject to database
decksDatabaseReference.child(deckId).setValue(deckObject);
//refresh activity to show change in listview
startActivity(new Intent(FlashCardDecks.this, FlashCardDecks.class));
Это приведет к сбою приложения. Но когда я в следующий раз открываю приложение, новая колода появляется во втором действии. Поэтому я не знаю, почему приложение выходит из строя с нулевым указателем
Вот ошибка:
java.lang.RuntimeException: не удается запустить activity ComponentInfo{com.ec16358.examcompanion/com.ec16358.examcompanion.FlashCardDecks}: java.lang.Исключение NullPointerException: попытка вызвать виртуальный метод ‘java.lang.Строка android.os.BaseBundle.getString(java.lang.Строка)’ для ссылки на нулевой объект
…
на com.ec16358.examcompanion.FlashCardDecks.onCreate(FlashCardDecks.java:48)
(Строка 48 FlashCardDecks = String moduleId = extras.getString("EXTRA_MODULE_ID");
)
Комментарии:
1. Попробуйте проверить это — if (extras!= null) перед доступом к «moduleName» и «ModuleID», чтобы избежать исключения NullPointerException.
Ответ №1:
Это сработало
if (getIntent().getStringExtra("EXTRA_MODULE_ID") != null amp;amp; (getIntent().getStringExtra("EXTRA_MODULE_NAME") != null)){
moduleId = bundle.getString("EXTRA_MODULE_ID");
moduleName = bundle.getString("EXTRA_MODULE_NAME");
}