質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

1018閲覧

Kotlinによる別アクティビティ内のTextViewの書き換え

waewae96

総合スコア20

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2018/10/10 15:53

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使用

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

intentをsetContextView()より前に作っていたことが原因でクラッシュしていたようでした。
以下のように直すとクラッシュしなくなりました。

Kotlin

1//MainActivity.kt 2 3class MainActivity : AppCompatActivity() { 4 private lateinit var realm: Realm 5 6 private val myRequestCode = 0 7 8 override fun onCreate(savedInstanceState: Bundle?) { 9 super.onCreate(savedInstanceState) 10 setContentView(R.layout.activity_main) 11 12 realm = Realm.getDefaultInstance() 13 val information = realm.where<Information>().findAll() 14 listView.adapter = InformationAdapter(information) 15 16 //値の更新 17 val number = realm.where<Information>().equalTo("num", 2.toInt()).findAll() 18 num.text = number.size.toString() 19 20 addButton.setOnClickListener { onAddButtonTapped(it) } 21 22 listView.setOnItemClickListener { parent, _, position, _ -> 23 val information = parent.getItemAtPosition(position) as Information 24 25 //ここでIntentをつくる 26 val mainIntent = Intent(this, EditActivity::class.java) 27 28 atndIntent.putExtra("information_id", information.id) 29 startActivityForResult(intent, myRequestCode) 30 } 31 } 32 33 private fun onAddButtonTapped(@Suppress("UNUSED_PARAMETER")view: View){ 34 35 //ここでもIntentをつくる 36 val mainIntent = Intent(this, EditActivity::class.java) 37 startActivityForResult(intent, myRequestCode) 38 } 39 40 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { 41 42 if (requestCode == myRequestCode && resultCode == Activity.RESULT_OK) { 43 val number = realm.where<Information>().equalTo("num", 2.toInt()).findAll() 44 num.text = number.size.toString() 45 46 } 47 } 48 override fun onDestroy() { 49 super.onDestroy() 50 realm.close() 51 } 52}

投稿2018/10/11 06:00

waewae96

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問