Намерение вернуть нулевое значение при activityresult

#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();