Получение ResourceNotFoundException несмотря на передачу идентификатора элемента - PullRequest
0 голосов
/ 14 июня 2019

Я создаю приложение, в котором пользователь может создавать записи с помощью назначенного действия и редактировать записи в этом же задании, долго щелкая запись. Приложение использует архитектуру MVVM с Room для своей базы данных. Когда я пытаюсь изменить запись, я получаю следующую ошибку:

Process: com.example.cryptpass_kt, PID: 13448
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=-1, data=Intent { (has extras) }} to activity {com.example.cryptpass_kt/com.example.cryptpass_kt.MainActivity}: android.content.res.Resources$NotFoundException: String resource ID #0x1
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4393)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4436)
        at android.app.ActivityThread.-wrap19(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1665)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6703)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)
     Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x1
        at android.content.res.Resources.getText(Resources.java:347)
        at android.widget.Toast.makeText(Toast.java:339)
        at com.example.cryptpass_kt.MainActivity.onActivityResult(MainActivity.kt:112)
        at android.app.Activity.dispatchActivityResult(Activity.java:7240)

И ошибка указывает на эту -> строку в моем MainActivity.kt файле:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        if (requestCode == ADD_ENTRY_REQUEST && resultCode == Activity.RESULT_OK) {
            Toast.makeText(this, data?.getStringExtra(AddEditEntryActivity.EXTRA_USERNAME), Toast.LENGTH_SHORT).show()
            Toast.makeText(this, data?.getStringExtra(AddEditEntryActivity.EXTRA_PASSWORD), Toast.LENGTH_SHORT).show()
            Toast.makeText(this, data?.getStringExtra(AddEditEntryActivity.EXTRA_HINT), Toast.LENGTH_SHORT).show()

            val username = Objects.requireNonNull<Intent>(data).getStringExtra(AddEditEntryActivity.EXTRA_USERNAME)
            val password = Objects.requireNonNull<Intent>(data).getStringExtra(AddEditEntryActivity.EXTRA_PASSWORD)
            val hint = Objects.requireNonNull<Intent>(data).getStringExtra(AddEditEntryActivity.EXTRA_HINT)

            val entry = Entry(username, hint, password)
            viewModel.insert(entry)

            Toast.makeText(this, "Entry added!", Toast.LENGTH_SHORT).show()

        } else if (requestCode == EDIT_ENTRY_REQUEST && resultCode == Activity.RESULT_OK) {
            val id = Objects.requireNonNull<Intent>(data).getIntExtra(AddEditEntryActivity.EXTRA_ID, -1)

            -> Toast.makeText(this, data!!.getIntExtra(AddEditEntryActivity.EXTRA_ID, -1), Toast.LENGTH_SHORT).show()
            Toast.makeText(this, data.getStringExtra(AddEditEntryActivity.EXTRA_USERNAME), Toast.LENGTH_SHORT).show()
            Toast.makeText(this, data.getStringExtra(AddEditEntryActivity.EXTRA_PASSWORD), Toast.LENGTH_SHORT).show()
            Toast.makeText(this, data.getStringExtra(AddEditEntryActivity.EXTRA_HINT), Toast.LENGTH_SHORT).show()

            if (id == -1) {
                Toast.makeText(this, "Something went wrong", Toast.LENGTH_SHORT).show()
                return
            }

            val username = Objects.requireNonNull<Intent>(data).getStringExtra(AddEditEntryActivity.EXTRA_USERNAME)
            val password = Objects.requireNonNull<Intent>(data).getStringExtra(AddEditEntryActivity.EXTRA_PASSWORD)
            val hint = Objects.requireNonNull<Intent>(data).getStringExtra(AddEditEntryActivity.EXTRA_HINT)

            val entry = Entry(username, hint, password, id)
            entry.id = id
            viewModel.update(entry)

            Toast.makeText(this, "Entry updated", Toast.LENGTH_SHORT).show()

        } else {Toast.makeText(this, "Entry not added!", Toast.LENGTH_SHORT).show()}
    }

Строка - это сообщение Toast, которое я добавил, чтобы отследить ошибки, связанные с обменом данными между двумя действиями. Он сообщает, что для ошибки устанавливается значение по умолчанию -1. Этого не должно быть, потому что, когда я редактирую запись, я передаю ее конкретный идентификатор из AddEditEntry.kt активность:

override fun onCreate(savedInstanceState: Bundle?) {
        ...
        val saveEntry = findViewById<Button>(R.id.btn_save)

        val intent = intent

        // This is responsible for updating an entry
        if (intent.hasExtra(EXTRA_ID)) {
            title = getString(R.string.edit_entry)
            saveEntry.setText(R.string.update_entry)

            usernameEditText!!.setText(getIntent().getStringExtra(EXTRA_USERNAME))
            passwordEditText!!.setText(getIntent().getStringExtra(EXTRA_PASSWORD))
            hintEditText!!.setText(getIntent().getStringExtra(EXTRA_HINT))
        }

        else {title = "Add Entry"}

        Objects.requireNonNull<ActionBar>(supportActionBar).setHomeAsUpIndicator(R.drawable.ic_close_white_24dp)

        generatePassword.setOnClickListener { passwordEditText!!.setText(generatedPassword()) }

        saveEntry.setOnClickListener {
            val data = Intent()
            data.putExtra(EXTRA_USERNAME, usernameEditText!!.text.toString())
            data.putExtra(EXTRA_HINT, hintEditText!!.text.toString())
            data.putExtra(EXTRA_PASSWORD, passwordEditText!!.text.toString())

            val id = getIntent().getIntExtra(EXTRA_ID, -1)

            if (id != -1) {data.putExtra(EXTRA_ID, id)}

            setResult(Activity.RESULT_OK, data)
            finish()

            Toast.makeText(this, "data.putExtra() from AddEditEntryActivity", Toast.LENGTH_SHORT).show()
            Toast.makeText(this, usernameEditText!!.text.toString(), Toast.LENGTH_SHORT).show()
            Toast.makeText(this, hintEditText!!.text.toString(), Toast.LENGTH_SHORT).show()
            Toast.makeText(this, passwordEditText!!.text.toString(), Toast.LENGTH_SHORT).show()
        }
    }

Этот является полным репозиторием Github. Я также могу добавить больше кода для запроса.

1 Ответ

1 голос
/ 14 июня 2019
Перегрузка

Toast.makeText(), которая принимает аргумент int, ожидает увидеть идентификатор строкового ресурса, и вы передаете ему int, который не является идентификатором строкового ресурса: data!!.getIntExtra(AddEditEntryActivity.EXTRA_ID, -1).

Вы должны использовать перегрузку Toast.makeText(), которая вместо этого принимает аргумент String - конвертируйте ваше int в строку:

Toast.makeText(this, data!!.getIntExtra(AddEditEntryActivity.EXTRA_ID, -1).toString(), ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...