Kotlinでアプリ開発中のものです。Kotlinに関してはまだ触り始めて10日もたっていない初心者です。
あるActivity(MainActivityとします)に、TextViewでデータ数を表示し、そこからもう一つのActivity(EditActivityとします)に遷移し、データの編集、更新をする。そしてEditActivityを閉じると(finishで閉じています)MainActivityのTextViewが更新されるという作りにしたいです。
例)
[MainActivity]
・データ数:0 ←TextViewで表示
・MainActivity→EditActivityに遷移(同時にidという値(Long)を送る)
[EditActivity]
・データを追加(データ編集後、「保存」or「更新」ボタンを押す)→finish()→MainActivityに移動
[MainActivity]
・データ数:1 ←TextViewで表示
うまく表せているか微妙ですが、こんな感じです。
要は、finish()した時にonActivityResult内の動作ができていればよいです。
データはrealmで管理しています。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
Kotlin
1//MainActivity.kt 2 3class MainActivity : AppCompatActivity() { 4 private lateinit var realm: Realm 5 6 private val myRequestCode = 0 7 //EditActivityからonActivityResultを呼び出すために使用 8 private val mainIntent = Intent(this, EditActivity::class.java) 9 10 override fun onCreate(savedInstanceState: Bundle?) { 11 super.onCreate(savedInstanceState) 12 setContentView(R.layout.activity_main) 13 14 realm = Realm.getDefaultInstance() 15 val information = realm.where<Information>().findAll() 16 listView.adapter = InformationAdapter(information) 17 18 //値の更新 19 val number = realm.where<Information>().equalTo("num", 2.toInt()).findAll() 20 num.text = number.size.toString() 21 22 addButton.setOnClickListener { onAddButtonTapped(it) } 23 24 listView.setOnItemClickListener { parent, _, position, _ -> 25 val information = parent.getItemAtPosition(position) as Information 26 atndIntent.putExtra("information_id", information.id) 27 startActivityForResult(intent, myRequestCode) 28// startActivity<EditActivity>( 29// "information_id" to information.id 30// ) 31 } 32 } 33 34 private fun onAddButtonTapped(@Suppress("UNUSED_PARAMETER")view: View){ 35 startActivityForResult(intent, myRequestCode) 36// startActivity<EditActivity>() 37 } 38 39 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { 40 41 if (requestCode == myRequestCode && resultCode == Activity.RESULT_OK) { 42 val number = realm.where<Information>().equalTo("num", 2.toInt()).findAll() 43 num.text = number.size.toString() 44 45 } 46 } 47 override fun onDestroy() { 48 super.onDestroy() 49 realm.close() 50 } 51} 52
Kotlin
1 2//EditActivity.k 3 4class EditActivity : AppCompatActivity() { 5 private lateinit var realm: Realm 6 7 //forDatePicker 8 private var textViewDate: TextView? = null 9 private var cal = Calendar.getInstance() 10 11 override fun onCreate(savedInstanceState: Bundle?) { 12 super.onCreate(savedInstanceState) 13 setContentView(R.layout.activity_edit_activity) 14 realm = Realm.getDefaultInstance() 15 16 val editIntent = Intent() 17// editIntent.putExtra("string", "success!") 18 19 val informationId = intent.extras?.getLong("information_id", -1L) 20// val informationId = intent?.getLongExtra("information_id", -1L) 21 if(informationId != -1L){ 22 val information = realm.where<Information>() 23 .equalTo("id", informationId).findFirst() 24 dateEdit.text = DateFormat.format("yyyy/MM/dd", information?.date) 25 situation.setSelection(information!!.situ) 26 detailEdit.setText(information.detail) 27 delete.visibility = View.VISIBLE //deleteButtonを見えるようにする 28 }else{ 29 dateEdit.text = DateFormat.format("yyyy/MM/dd", Date()) //当日の日付を自動入力 30 situation.setSelection(0) 31 delete.visibility = View.INVISIBLE //deleteButtonを見えなくする 32 } 33 34 save.setOnClickListener { 35 when(informationId){ 36 -1L -> { 37 realm.executeTransaction{ 38 val maxId = realm.where<Information>().max("id") 39 val nextId = (maxId?.toLong() ?: 0L) + 1 40 val information = realm.createObject<Information>(nextId) 41 dateEdit.text.toString().toDate("yyyy/MM/dd")?.let{ 42 information.date = it 43 } 44 information.situ = situ.selectedItemPosition 45 information.detail = detailEdit.text.toString() 46 } 47 setResult(Activity.RESULT_OK, intent) 48 alert("追加しました"){ 49 yesButton { finish() } 50 }.show() 51 } 52 else -> { 53 realm.executeTransaction{ 54 val information = realm.where<Information>() 55 .equalTo("id", informationId).findFirst() 56 dateEdit.text.toString().toDate("yyyy/MM/dd")?.let{ 57 information?.date = it 58 } 59 information!!.situ = situ.selectedItemPosition 60 information.detail = detailEdit.text.toString() 61 } 62 setResult(Activity.RESULT_OK, intent) 63 alert("修正しました"){ 64 yesButton{finish()} 65 }.show() 66 } 67 } 68 } 69 70 delete.setOnClickListener { 71 // ダイアログを作成して表示 72 val builder = AlertDialog.Builder(this@EditActivity) 73 builder.setTitle("削除") 74 builder.setMessage("本当に削除しますか?") 75 builder.setPositiveButton("削除"){_, _ -> 76 // 削除処理 77 realm.executeTransaction { 78 realm.where<Information>().equalTo("id", informationId) 79 ?.findFirst()?.deleteFromRealm() 80 } 81 setResult(Activity.RESULT_OK, intent) 82 alert("削除しました"){ 83 yesButton { finish() } 84 }.show() 85 } 86 builder.setNegativeButton("キャンセル") { _, _ -> 87 Toast.makeText(applicationContext,"キャンセルされました",Toast.LENGTH_SHORT).show() 88 }.show() 89 } 90 91 92 supportActionBar?.setDisplayHomeAsUpEnabled(true) 93 supportActionBar?.title = "情報の追加" 94 95 // get the references from layout file 96 textViewDate = this.dateEdit 97 98 // create an OnDateSetListener 99 val dateSetListener = object : DatePickerDialog.OnDateSetListener { 100 override fun onDateSet(view: DatePicker, year: Int, monthOfYear: Int, 101 dayOfMonth: Int) { 102 cal.set(Calendar.YEAR, year) 103 cal.set(Calendar.MONTH, monthOfYear) 104 cal.set(Calendar.DAY_OF_MONTH, dayOfMonth) 105 updateDateInView() 106 } 107 } 108 109 // when you click on the button, show DatePickerDialog that is set with OnDateSetListener 110 // get reference to textView 111 val tapDate = findViewById<TextView>(R.id.dateEdit) as TextView 112 tapDate.setOnClickListener (object : View.OnClickListener { 113 override fun onClick(view: View) { 114 DatePickerDialog(this@EditActivity, 115 dateSetListener, 116 // set DatePickerDialog to point to today's date when it loads up 117 cal.get(Calendar.YEAR), 118 cal.get(Calendar.MONTH), 119 cal.get(Calendar.DAY_OF_MONTH)).show() 120 } 121 }) 122 } 123 124 private fun updateDateInView() { 125 val myFormat = "yyyy/MM/dd" // mention the format you need 126 val sdf = SimpleDateFormat(myFormat, Locale.US) 127 textViewDate!!.text = sdf.format(cal.getTime()) 128 } 129 130 override fun onDestroy() { 131 super.onDestroy() 132 realm.close() 133 } 134 135 private fun String.toDate(pattern: String = "yyyy/MM/dd HH:mm"): Date?{ 136 val sdFormat = try{ 137 SimpleDateFormat(pattern) 138 } catch (e: IllegalArgumentException){ 139 null 140 } 141 val date = sdFormat?.let{ 142 try{ 143 it.parse(this) 144 } catch(e: ParseException){ 145 null 146 } 147 } 148 return date 149 } 150 151 //action bar config 152 override fun onOptionsItemSelected(item: MenuItem?): Boolean { 153 when (item?.itemId) { 154 android.R.id.home -> finish() 155 else -> return super.onOptionsItemSelected(item) 156 } 157 return true 158 } 159} 160
試したこと
本来Edit→Mainにデータは送らなくてよいのですが、念のため送ってみたりなどしましたが特に効果はなかったです
コメントアウトしている方(anko)でEditActivityに遷移するとうまくいくのですが、もちろんonActivityResultは機能しません。
逆に、コメントアウトしたままの状態でbuildすると、アプリはlaunchすらできず強制終了されます。
簡単なことなんだろうとは思いますがなかなかうまくいかず...どうしたらよいでしょう?
補足情報(FW/ツールのバージョンなど)
AndroidStudio3.2
Kotlin使用
anko, realm使用
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。