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

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

ただいまの
回答率

90.52%

  • Android

    6521questions

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

  • Android Studio

    3701questions

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

  • Kotlin

    324questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 47

waewae96

score 4

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で管理しています。

 発生している問題・エラーメッセージ

エラーメッセージ

 該当のソースコード

//MainActivity.kt

class MainActivity : AppCompatActivity() {
    private lateinit var realm: Realm

    private val myRequestCode = 0
    //EditActivityからonActivityResultを呼び出すために使用
    private val mainIntent = Intent(this, EditActivity::class.java)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        realm = Realm.getDefaultInstance()
        val information = realm.where<Information>().findAll()
        listView.adapter = InformationAdapter(information)

        //値の更新
        val number = realm.where<Information>().equalTo("num", 2.toInt()).findAll()
        num.text = number.size.toString()

        addButton.setOnClickListener { onAddButtonTapped(it) }

        listView.setOnItemClickListener { parent, _, position, _ ->
            val information = parent.getItemAtPosition(position) as Information
            atndIntent.putExtra("information_id", information.id)
            startActivityForResult(intent, myRequestCode)
//            startActivity<EditActivity>(
//                    "information_id" to information.id
//            )
        }
    }

    private fun onAddButtonTapped(@Suppress("UNUSED_PARAMETER")view: View){
        startActivityForResult(intent, myRequestCode)
//        startActivity<EditActivity>()
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

        if (requestCode == myRequestCode && resultCode == Activity.RESULT_OK) {
            val number = realm.where<Information>().equalTo("num", 2.toInt()).findAll()
        num.text = number.size.toString()

        }
    }
    override fun onDestroy() {
        super.onDestroy()
        realm.close()
    }
}
//EditActivity.k

class EditActivity : AppCompatActivity() {
    private lateinit var realm: Realm

    //forDatePicker
    private var textViewDate: TextView? = null
    private var cal = Calendar.getInstance()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_edit_activity)
        realm = Realm.getDefaultInstance()

        val editIntent = Intent()
//        editIntent.putExtra("string", "success!")

        val informationId = intent.extras?.getLong("information_id", -1L)
//        val informationId = intent?.getLongExtra("information_id", -1L)
        if(informationId != -1L){
            val information = realm.where<Information>()
                    .equalTo("id", informationId).findFirst()
            dateEdit.text = DateFormat.format("yyyy/MM/dd", information?.date)
            situation.setSelection(information!!.situ)
            detailEdit.setText(information.detail)
            delete.visibility = View.VISIBLE //deleteButtonを見えるようにする
        }else{
            dateEdit.text = DateFormat.format("yyyy/MM/dd", Date()) //当日の日付を自動入力
            situation.setSelection(0)
            delete.visibility = View.INVISIBLE //deleteButtonを見えなくする
        }

        save.setOnClickListener {
            when(informationId){
                -1L -> {
                    realm.executeTransaction{
                        val maxId = realm.where<Information>().max("id")
                        val nextId = (maxId?.toLong() ?: 0L) + 1
                        val information = realm.createObject<Information>(nextId)
                        dateEdit.text.toString().toDate("yyyy/MM/dd")?.let{
                            information.date = it
                        }
                        information.situ = situ.selectedItemPosition
                        information.detail = detailEdit.text.toString()
                    }
                    setResult(Activity.RESULT_OK, intent)
                    alert("追加しました"){
                        yesButton { finish() }
                    }.show()
                }
                else -> {
                    realm.executeTransaction{
                        val information = realm.where<Information>()
                                .equalTo("id", informationId).findFirst()
                        dateEdit.text.toString().toDate("yyyy/MM/dd")?.let{
                            information?.date = it
                        }
                        information!!.situ = situ.selectedItemPosition
                        information.detail = detailEdit.text.toString()
                    }
                    setResult(Activity.RESULT_OK, intent)
                    alert("修正しました"){
                        yesButton{finish()}
                    }.show()
                }
                }
            }

        delete.setOnClickListener {
            // ダイアログを作成して表示
            val builder = AlertDialog.Builder(this@EditActivity)
                builder.setTitle("削除")
                builder.setMessage("本当に削除しますか?")
                builder.setPositiveButton("削除"){_, _ ->
                    // 削除処理
                    realm.executeTransaction {
                        realm.where<Information>().equalTo("id", informationId)
                                ?.findFirst()?.deleteFromRealm()
                    }
                    setResult(Activity.RESULT_OK, intent)
                    alert("削除しました"){
                        yesButton { finish() }
                    }.show()
                }
                builder.setNegativeButton("キャンセル") { _, _ ->
                    Toast.makeText(applicationContext,"キャンセルされました",Toast.LENGTH_SHORT).show()
                }.show()
            }


        supportActionBar?.setDisplayHomeAsUpEnabled(true)
        supportActionBar?.title = "情報の追加"

        // get the references from layout file
        textViewDate = this.dateEdit

        // create an OnDateSetListener
        val dateSetListener = object : DatePickerDialog.OnDateSetListener {
            override fun onDateSet(view: DatePicker, year: Int, monthOfYear: Int,
                                   dayOfMonth: Int) {
                cal.set(Calendar.YEAR, year)
                cal.set(Calendar.MONTH, monthOfYear)
                cal.set(Calendar.DAY_OF_MONTH, dayOfMonth)
                updateDateInView()
            }
        }

        // when you click on the button, show DatePickerDialog that is set with OnDateSetListener
        // get reference to textView
        val tapDate = findViewById<TextView>(R.id.dateEdit) as TextView
        tapDate.setOnClickListener (object : View.OnClickListener {
            override fun onClick(view: View) {
                DatePickerDialog(this@EditActivity,
                        dateSetListener,
                        // set DatePickerDialog to point to today's date when it loads up
                        cal.get(Calendar.YEAR),
                        cal.get(Calendar.MONTH),
                        cal.get(Calendar.DAY_OF_MONTH)).show()
            }
        })
    }

    private fun updateDateInView() {
        val myFormat = "yyyy/MM/dd" // mention the format you need
        val sdf = SimpleDateFormat(myFormat, Locale.US)
        textViewDate!!.text = sdf.format(cal.getTime())
    }

    override fun onDestroy() {
        super.onDestroy()
        realm.close()
    }

    private fun String.toDate(pattern: String = "yyyy/MM/dd HH:mm"): Date?{
        val sdFormat = try{
            SimpleDateFormat(pattern)
        } catch (e: IllegalArgumentException){
            null
        }
        val date = sdFormat?.let{
            try{
                it.parse(this)
            } catch(e: ParseException){
                null
            }
        }
        return date
    }

    //action bar config
    override fun onOptionsItemSelected(item: MenuItem?): Boolean {
        when (item?.itemId) {
            android.R.id.home -> finish()
            else -> return super.onOptionsItemSelected(item)
        }
        return true
    }
}

 試したこと

本来Edit→Mainにデータは送らなくてよいのですが、念のため送ってみたりなどしましたが特に効果はなかったです
コメントアウトしている方(anko)でEditActivityに遷移するとうまくいくのですが、もちろんonActivityResultは機能しません。
逆に、コメントアウトしたままの状態でbuildすると、アプリはlaunchすらできず強制終了されます。
簡単なことなんだろうとは思いますがなかなかうまくいかず...どうしたらよいでしょう?

 補足情報(FW/ツールのバージョンなど)

AndroidStudio3.2
Kotlin使用
anko, realm使用

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

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

//MainActivity.kt

class MainActivity : AppCompatActivity() {
    private lateinit var realm: Realm

    private val myRequestCode = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        realm = Realm.getDefaultInstance()
        val information = realm.where<Information>().findAll()
        listView.adapter = InformationAdapter(information)

        //値の更新
        val number = realm.where<Information>().equalTo("num", 2.toInt()).findAll()
        num.text = number.size.toString()

        addButton.setOnClickListener { onAddButtonTapped(it) }

        listView.setOnItemClickListener { parent, _, position, _ ->
            val information = parent.getItemAtPosition(position) as Information

            //ここでIntentをつくる
            val mainIntent = Intent(this, EditActivity::class.java)

            atndIntent.putExtra("information_id", information.id)
            startActivityForResult(intent, myRequestCode)
        }
    }

    private fun onAddButtonTapped(@Suppress("UNUSED_PARAMETER")view: View){

        //ここでもIntentをつくる
        val mainIntent = Intent(this, EditActivity::class.java)
        startActivityForResult(intent, myRequestCode)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

        if (requestCode == myRequestCode && resultCode == Activity.RESULT_OK) {
            val number = realm.where<Information>().equalTo("num", 2.toInt()).findAll()
        num.text = number.size.toString()

        }
    }
    override fun onDestroy() {
        super.onDestroy()
        realm.close()
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Android

    6521questions

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

  • Android Studio

    3701questions

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

  • Kotlin

    324questions

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