2016-06-21 8 views
10

Ich versuche, meine App in Kotlin zu kodieren, aber ich bekomme null kann nicht auf Nicht-Null-Typ gegossen werden und app Kraft stoppt wenn ich EditNoteActivity bei EXTRA_NOTE wahrscheinlich öffne.Kotlin.TypeCastException: null kann nicht auf Nicht-Null-Typ com.midsizemango.databasekotlin.Note

Jede Hilfe Highly

Geschätzt

Code:

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([email protected], "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([email protected]) 
        .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([email protected], 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 
    } 
} 
} 

Logs:

java.lang.RuntimeException: Kann Aktivität ComponentInfo { com.midsizemango.databasekotlin/com starten .midsizemango.databasekotlin.EditNoteActivity}: kotlin.TypeCastException: null kann nicht in einen Nicht-Null-Typ com.mids umgewandelt werden izemango.databasekotlin.Note bei android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2298) bei android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2360) bei android.app.ActivityThread.access $ 800 (ActivityThread. java: 144) bei android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1278) bei android.os.Handler.dispatchMessage (Handler.java:102) bei android.os.Looper.loop (Looper .java: 135) bei android.app.ActivityThread.main (ActivityThread.java:5221) bei java.lang.reflect.Method.invoke (native Methode) bei java.lang.re flect.Method.invoke (Method.java:372) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:899) bei com.android.internal.os.ZygoteInit.main (ZygoteInit .java: 694) verursacht durch: kotlin.TypeCastException: null kann nicht auf nicht-null Typ com.midsizemango.databasekotlin.Note bei com.midsizemango.databasekotlin.EditNoteActivity.onCreate (EditNoteActivity.kt gewirkt: 82) bei android.app.Activity.performCreate (Activity.java:5933) unter android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1105) bei android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2251) bei android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:2360) bei android.app.ActivityThread.access $ 800 (ActivityThread.java:144) bei android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1278) bei android.os.Handler.dispatchMessage (Handler.java:102) bei android.os.Looper.loop (Looper.java:135) bei android.app.ActivityThread.main (ActivityThread.java:5221) bei java.lang.reflect.Method.invoke (native Methode) bei java.lang.reflect.Method.invoke (Method.java:372) bei com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:899) bei com.android.internal.os .ZygoteInit.main (ZygoteInit.java: 694)

Antwort

38

In dieser Zeile:

note = intent.getSerializableExtra(EXTRA_NOTE) as Note 

Note ist ein non-null type, so dass der Guss es löst eine Nullprüfung. Da Sie note zu null manuell danach sind zu vergleichen, wahrscheinlich gemeint Sie die safe cast operator, die null ergibt, wenn der Ausdruck nicht von der Art, in der rechten Seite angegeben ist:

note = intent.getSerializableExtra(EXTRA_NOTE) as? Note 
+1

Genau wie Swift! – Dante

+0

versuchen Sie es nicht –

+1

@Dante Kotlin erste Version: 2011, Swift erste Veröffentlichung: 2014. Ich denke, es ist anders herum;) – pablisco

Verwandte Themen