ventajas tutorial programar google desventajas desde desarrollo cero aprende android kotlin

android - tutorial - kotlin vs java



kotlin.TypeCastException: null no se puede convertir al tipo com.midsizemango.databasekotlin.Note que no sea nulo (1)

Estoy tratando de codificar mi aplicación en Kotlin, pero la nula no se puede convertir al tipo no nulo y la aplicación se detiene cuando abro EditNoteActivity en EXTRA_NOTE probablemente.

Cualquier ayuda es muy apreciada

Código:

class EditNoteActivity : AppCompatActivity() { var note: Note? = null private val editNote: TextView? = null private val fabdrwble: Boolean? = null private val notesData: MutableList<Note>? = null private var databaseHelper: DatabaseHelper? = null private val save: Boolean? = null private var saveButton: FloatingActionButton? = null private val tint: ColorStateList? = null internal var mRowId: Long? = null internal var spinner: Spinner? = null internal var spinnertext: String? = null internal var fav: Int = 0 internal var mSharedFromIntentFilter = false internal var editTitle: EditText? = null internal var editContent: EditText? = null internal var inputlayoutTitle: TextInputLayout? = null internal var inputlayoutContent: TextInputLayout? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_edit_note) var toolbar = findViewById(R.id.toolbar_edit) as Toolbar? setSupportActionBar(toolbar) if (supportActionBar != null) supportActionBar!!.setDisplayHomeAsUpEnabled(true) databaseHelper = DatabaseHelper(applicationContext) inputlayoutTitle = findViewById(R.id.inputlayoutTitle) as TextInputLayout? inputlayoutContent = findViewById(R.id.inputlayoutContent) as TextInputLayout? editTitle = findViewById(R.id.note_title) as EditText editContent = findViewById(R.id.note_content) as EditText? val bundle = intent.extras val s = bundle.getString("edit") if (s == "add") { window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE) } else if (s == "editv") { window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN) } note = intent.getSerializableExtra(EXTRA_NOTE) as Note if (note != null) { editTitle?.setText(note!!.getTitle()) editContent?.setText(note!!.getContent()) } else { note = Note() //note.setUpdatedAt(new Date()); } saveButton = findViewById(R.id.add_edit_button) as FloatingActionButton? saveButton!!.setOnClickListener { if (isNoteFormOk) { setNoteResult() finish() } else validateNoteForm() } var ll = findViewById(R.id.llmain) as LinearLayout? var ll1 = findViewById(R.id.ll1) as LinearLayout? /*if(note.getColor() == Color.TRANSPARENT){ selectedColor = preselect; }else { selectedColor = note.getColor(); } getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); systemBarTintManager = new SystemBarTintManager(this); systemBarTintManager.setStatusBarTintEnabled(true); ll.setBackgroundColor(selectedColor); ll1.setBackgroundColor(selectedColor); toolbar.setBackgroundColor(note.getColor()); systemBarTintManager.setStatusBarTintColor(selectedColor);*/ } override fun onResume() { super.onResume() } override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { android.R.id.home -> { onBack() return true } /* case R.id.speech: try { displaySpeechRecognizer(); } catch (ActivityNotFoundException e) { Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://market.android.com/details?id=com.google.android.googlequicksearchbox")); startActivity(browserIntent); } return true;*/ else -> return super.onOptionsItemSelected(item) } } private fun displaySpeechRecognizer() { val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH) intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM) startActivityForResult(intent, SPEECH_REQUEST_CODE) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == SPEECH_REQUEST_CODE && resultCode == Activity.RESULT_OK) { val results = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS) val spokenText = results[0] editContent?.setText(spokenText) } if (requestCode == RequestResultCode.REQUEST_CODE_ADD_NOTE) { if (resultCode == Activity.RESULT_OK) { addNote(data) } } } private val isNoteFormOk: Boolean get() { val title = editTitle?.text.toString() return !(title == null || title.trim { it <= '' '' }.length == 0) } private fun validateNoteForm() { var msg: String? = null if (isNullOrBlank(editTitle?.text.toString())) { msg = "Title Required" inputlayoutTitle?.error = "Title is Missing" } if (msg != null) { Toast.makeText(applicationContext, msg, Toast.LENGTH_LONG).show() } } private fun setNoteResult() { note!!.setTitle(editTitle?.text.toString().trim { it <= '' '' }) note!!.setContent(editContent?.text.toString().trim { it <= '' '' }) //note.setUpdatedAt(new Date()); val intent = Intent() intent.putExtra(EXTRA_NOTE, note) setResult(Activity.RESULT_OK, intent) //addNote(intent); Toast.makeText(this@EditNoteActivity, "Note Saved.", Toast.LENGTH_LONG).show() } private fun onBack() { if (isNoteFormOk) { if (editTitle?.text.toString() == note!!.getTitle() && editContent?.text.toString() == note!!.getContent()) { setResult(Activity.RESULT_CANCELED, Intent()) finish() } else { AlertDialog.Builder(this@EditNoteActivity) .setTitle("Save") .setMessage("Do You Want to Save Note") .setPositiveButton("SAVE") { dialog, which -> setNoteResult() finish() }.setNegativeButton("CANCEL") { dialog, which -> setResult(Activity.RESULT_CANCELED, Intent()) finish() }.show() } } else { setResult(Activity.RESULT_CANCELED, Intent()) finish() } } private fun addNote(data: Intent) { val note = data.getSerializableExtra(EXTRA_NOTE) as Note val noteId = databaseHelper!!.createNote(note) note.setId(noteId) } override fun onBackPressed() { onBack() val intentHome = Intent(this@EditNoteActivity, MainActivity::class.java) intentHome.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP intentHome.putExtra(EXTRA_NOTE, note) setResult(Activity.RESULT_OK, intentHome) } companion object { private val EXTRA_NOTE = "EXTRA_NOTE" private val SPEECH_REQUEST_CODE = 0 fun isNullOrBlank(str: String?): Boolean { return str == null || str.trim { it <= '' '' }.length == 0 } } }

Registros:

java.lang.RuntimeException: No se puede iniciar la actividad ComponentInfo {com.midsizemango.databasekotlin / com.midsizemango.databasekotlin.EditNoteActivity}: kotlin.TypeCastException: null no se puede convertir en un tipo no nulo com.midsizemango.dparo app.ActivityThread.performLaunchActivity (ActivityThread.java:2298) en android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2360) en android.app.ActivityThread.access $ 800 (ActivityThread.java:144) H.handleMessage (ActivityThread.java:1278) en android.os.Handler.dispatchMessage (Handler.java:102) en android.os.Looper.loop (Looper.java:135) en android.app.ActivityThread.main (ActivityThread .java: 5221) en java.lang.reflect.Method.invoke (Método nativo) en java.lang.reflect.Method.invoke (Method.java:372) en com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:899) en com.android.internal.os.ZygoteInit.main (ZygoteInit.java:694) Causado por: kotlin.TypeCastException: null no puede se convierte en un tipo no nulo com.midsizemango.databasekotlin.Note en com.midsizemango.databasekotlin.EditNoteActivity.onCreate (EditNoteActivity.kt: 82) en android.app.Activity.performCreate (Activity.java:5933) en androidroid.app .Instrumentation.callActivityOnCreate (Instrumentation.java:1105) en android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2251) en android.app. (ActivityThread.java:144) en android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1278) en android.os.Handler.dispatchMessage (Handler.java:102) en android.os.Looper.loop (Looper. java: 135) en android.app.ActivityThread.main (ActivityThread.java:5221) en java.lang.reflect.Method.invoke (Método nativo) en java.lang.reflect.Method.invoke (Method.java:372) en com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:899) en com.android.internal.os.ZygoteInit.main (ZygoteInit.java:694)


En esta línea:

note = intent.getSerializableExtra(EXTRA_NOTE) as Note

Note es un tipo que no es nulo , por lo que la conversión a él desencadena una comprobación nula. Ya que está comparando note a null manualmente después, probablemente se refirió al operador de conversión segura , que produce un null si la expresión no es del tipo especificado en el lado derecho:

note = intent.getSerializableExtra(EXTRA_NOTE) as? Note