несоответствие типов Kotlin и getStringArrayListExtra - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь построить распознавание речи в Kotlin. Большая часть моего кода вырезана из пасты inte rnet. Тем не менее я терплю неудачу. У меня есть простой android. xml с 1 просмотром текста, 1 редактированием и 1 кнопкой с "onclick" = mybuttondo.

мой Kotlin код:

package com.example.mytestspeech
import android.app.Activity
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.speech.RecognizerIntent
import android.view.ActionMode
import android.view.View
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*
import kotlin.collections.ArrayList
class MainActivity : AppCompatActivity() {
    val SPEECHINTENTRQ = 0
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        textView.text = "newworld"
    }
    fun mybuttondo(view: View) {
        // only my test for ListOf<String>
        var mytext = "mystring"
        var myarr = listOf<String>("one","two")
        editText.setText(myarr[1])
        // the speechrecognition
        val speechRecognitionIntent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH)
        speechRecognitionIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault().toString())
        startActivityForResult(speechRecognitionIntent, SPEECHINTENTRQ)
    }
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        //var speechresult2: kotlin.collections.ArrayList<String>
        var speechresult2 : kotlin.collections.ArrayList<String> = kotlin.collections.ArrayList()
        //var speechresult2: ArrayList<String> = arrayListOf()
        //var speechresult2: kotlin.collections.List<String> = kotlin.collections.ArrayList() // compiled successfully
        //var speechresult2 = java.util.ArrayList(String)
        //var spokenText: java.util.ArrayList<String>         //ArrayList<String>
        var speechresult: String? = String()
        if (requestCode == SPEECHINTENTRQ  &&  resultCode == Activity.RESULT_OK) {
            // this works with String
            speechresult = data?.getStringExtra(RecognizerIntent.EXTRA_RESULTS)
            editText.setText(speechresult)
            //this does not work
            //no matter, which var definition from above i use
            speechresult2 = data?.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS)
            // here I get compiler message:
            //Type mismatch: inferred type is java.util.ArrayList<String!>? but kotlin.collections.ArrayList<String> /* = java.util.ArrayList<String> */ was expected

            //spokenText  = speechresult2[0]
            //textView.text = spokenText
        }
        else
            editText.setText("Keine Eingabe"+requestCode)
    }
}

Я написал в коде проблема при компиляции

speechresult2 = data?.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS) 

не работает с несовпадением типов ...... я пробовал несколько определений списка массивов (в коде как комментарий с //) ни одно из них не работает

Когда я пытаюсь сделать это с

var speechresult2 = data?.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS) 

без предопределенного списка массивов, компилятор работает. Но тогда у меня есть проблема, что, например,

var spokenText = speechresult2[0] 

не работает. То же сообщение компилятора.

Что не так в моем определении списка массивов?

1 Ответ

0 голосов
/ 04 мая 2020

Ну data?.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS) возвращает ArrayList? т.е. ArrayList, который может иметь значение NULL.

Вы можете создать переменную ArrayList, которая может иметь значение NULL, или инициализировать ее новым ArrayList, если он возвращает значение NULL.

Пример

// to populate speech result with empty arraylist if the call returns null
val speechresult2: ArrayList<String> =
    data?.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS) ?: ArrayList()

// or just take nullable array list
val speechresult2: ArrayList<String>? =
    data?.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS)

...