#android #exception #android-activity #android-intent
#Android #исключение #android-активность #android-намерение
Вопрос:
привет
У меня есть класс MainActivity, который расширяет класс DashboardActivity. В основном классе activity есть верхняя панель действий, которая при нажатии переходит к классу AddReminderActivity. Действие верхней панели действий определено в классе активности панели мониторинга как
private void createReminder() {
// TODO: fill in implementation
Intent intent = new Intent(DashboardActivity.this,AddReminderActivity.class);
Log.i("in OnActivityResult", "create reminder called");
startActivityForResult(intent, ACTIVITY_CREATE);
Log.i("in OnActivityResult", "Start Activity called Result");
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
Log.i("in OnActivityResult", "Activity Result" resultCode);
super.onActivityResult(requestCode, resultCode, intent);
Log.i("in OnActivityResult", "Activity Result" resultCode);
Log.i("in OnActivityResult", "intent Result" intent.getExtras());
Bundle extras = intent.getExtras();
Toast.makeText(getApplicationContext(),resultCode, Toast.LENGTH_SHORT).show();
switch(requestCode){
case ACTIVITY_CREATE:
if (resultCode == Activity.RESULT_OK) {
String title = extras.getString(ReminderDBAdapter.KEY_REMINDER_TITLE);
String content = extras.getString(ReminderDBAdapter.KEY_REMINDER_CONTENT);
mDbHelper.createReminder(title, content);
mDbHelper.close();
}
startActivity(new Intent(this,ListReminder.class));
break;
}
// TODO: fill in rest of method
}
В классе AddReminderActivityClass, который я вызвал
btnSubmitReminder.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Bundle bundle = new Bundle();
bundle.putString(ReminderDBAdapter.KEY_REMINDER_TITLE, mReminderTitle.getText().toString());
bundle.putString(ReminderDBAdapter.KEY_REMINDER_CONTENT, mReminderContent.getText().toString());
if(mRowId != null){
bundle.putLong(ReminderDBAdapter.KEY_ROWID, mRowId);
}
System.out.println(mReminderTitle.getText().toString());
Toast.makeText(getApplicationContext(), mReminderTitle.getText().toString(), Toast.LENGTH_SHORT).show();
Intent mIntent = new Intent();
mIntent.putExtras(bundle);
//setResult(RESULT_OK, mIntent);
if (getParent() == null) {
setResult(DashboardActivity.RESULT_OK, mIntent);
} else {
getParent().setResult(DashboardActivity.RESULT_OK, mIntent);
}
Log.i("in OnActivityResult", "set result" RESULT_OK);
finish();
}
});
Но при возврате обратно к onActivityResult намерение возвращает null и возникает следующее исключение. Я не могу распознать, в чем проблема
05-16 17:25:09.686: ERROR/AndroidRuntime(441): FATAL
ИСКЛЮЧЕНИЕ: main 05-16
17:25:09.686:
ОШИБКА / AndroidRuntime(441):
исключение java.lang.RuntimeException: сбой
выдача результата ResultInfo{who=null,
запрос = 0, результат = -1, данные=Намерение {
(имеет дополнительные функции) }} к activity
{com.babz.android.businessReminder/com.babz.android.businessReminder.MainActivity}:
android.content.res.Resources$NotFoundException:
Идентификатор строкового ресурса #0xffffffff 05-16
17:25:09.686:
ОШИБКА / AndroidRuntime(441): при
android.app.ActivityThread.Результаты доставки (ActivityThread.java:3515)
05-16 17:25:09.686:
ОШИБКА / AndroidRuntime(441): при
android.app.ActivityThread.Обрабатывает конечный результат (ActivityThread.java:3557)
05-16 17:25:09.686:
ОШИБКА / AndroidRuntime(441): при
android.app.ActivityThread.access $ 2800 (ActivityThread.java: 125)
05-16 17:25:09.686:
ОШИБКА / AndroidRuntime(441): при
android.app.ActivityThread$H.handleMessage (ActivityThread.java:2063)
05-16 17:25:09.686:
ОШИБКА / AndroidRuntime(441): при
android.os.Handler.DispatchMessage(Обработчик.java:99)
05-16 17:25:09.686:
ОШИБКА / AndroidRuntime(441): при
android.os.Looper.loop(Looper.java:123)
05-16 17:25:09.686:
ОШИБКА / AndroidRuntime(441): при
android.app.ActivityThread.main (ActivityThread.java:4627)
05-16 17:25:09.686:
ОШИБКА / AndroidRuntime(441): при
java.lang.reflect.Метод.вызывающий (собственный
Метод) 05-16 17:25:09.686:
ОШИБКА / AndroidRuntime(441): при
java.lang.reflect.Метод.invoke(метод.java:521)
05-16 17:25:09.686:
ОШИБКА / AndroidRuntime(441): при
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-16 17:25:09.686:
ОШИБКА / AndroidRuntime(441): при
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-16 17:25:09.686:
ОШИБКА / AndroidRuntime(441): при
dalvik.system.NativeStart.main (собственный
Метод) 05-16 17:25:09.686:
ОШИБКА / AndroidRuntime (441): вызвано:
android.content.res.Resources$NotFoundException:
Идентификатор строкового ресурса #0xffffffff 05-16
17:25:09.686:
ОШИБКА / AndroidRuntime(441): при
android.content.res.Resources.getText(Ресурсы.java:201)
05-16 17:25:09.686:
ОШИБКА / AndroidRuntime(441): при
android.widget.Toast.makeText(Toast.java:258)
05-16 17:25:09.686:
ОШИБКА / AndroidRuntime(441): при
com.babz.android.businessReminder.DashboardActivity.onActivityResult(DashboardActivity.java:68)
05-16 17:25:09.686:
ОШИБКА / AndroidRuntime(441): при
android.app.Activity.dispatchActivityResult(Activity.java:3890)
05-16 17:25:09.686:
ОШИБКА / AndroidRuntime(441): при
android.app.ActivityThread.Результаты доставки (ActivityThread.java:3511)
Ответ №1:
Раскомментируйте вызов метода SetResult.
Комментарии:
1. Метод SetResult был вызван в условном операторе.
Ответ №2:
насколько я могу судить, вы получаете исключение при попытке получить значение с ключом, которого не существует в пакете, так что в вашем случае, вероятно, одно из этих:
String title = extras.getString(ReminderDBAdapter.KEY_REMINDER_TITLE);
String content = extras.getString(ReminderDBAdapter.KEY_REMINDER_CONTENT);
Вы можете спросить пакет, существует ли ключ, вызвав containsKey (строковый ключ) в пакете, поэтому я предлагаю вам использовать это, чтобы выяснить, так это или нет.
Комментарии:
1. Спасибо. Но у меня есть debug, и значение поступает в комплекте.
Ответ №3:
Как сказал Guru, ваш метод SetResult() не вызывается. Таким образом, намерение никогда не устанавливается.
Я даю отдельный ответ, потому что существует общая проблема, требующая решения: использование неправильного SetResult().
Убедитесь, что вы используете SetResult(resultCode, intentData), А не SetResult (resultCode). Я должен подчеркнуть, потому что во многих примерах во многих книгах используется последнее, подразумевая, что то же самое намерение, которое было отправлено в действие через startActivityForResult (), просто вернет то же самое намерение. ВСЕ намерения ДОЛЖНЫ быть добавлены напрямую, иначе вы будете получать NULL для намерения в onActivityResult() каждый раз.
Ответ №4:
На самом деле, проблема в этой строке:
Toast.makeText(getApplicationContext(),resultCode, Toast.LENGTH_SHORT).show();
Это вызывает исключение, потому что параметр resultCode
является int
, и в этом случае makeText()
метод предполагает, что значение является идентификатором ресурса (т.Е.: R.string.something
). Однако в этом случае значение равно -1, и это генерирует это:
android.content.res.Resources$NotFoundException: String resource ID #0xffffffff
На самом деле вы надеялись вызвать makeText()
метод, который вместо этого принимает String
. Попробуйте это:
Toast.makeText(getApplicationContext(),"ResultCode: " resultCode,
Toast.LENGTH_SHORT).show();