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

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

ただいまの
回答率

87.48%

アクテビティ間のデータ転送がうまく行きません。

解決済

回答 1

投稿 編集

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

score 5

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
kotlin言語ででandroidのアプリを作っています。
背景を変えるように作ったspinnerのリストをクリックし、MainActivityの画面に戻っても、画像変更が反映されるように作っています。しかし実行してみると背景が変化しません
■■な機能を実装中に以下のエラーメッセージが発生しました。
実行しても背景が変わりません。(実行エラー)

該当のソースコード

kotlin
ソースコード

MainActivity.kt
package com.example.mkualarm

import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

open class MainActivity : AppCompatActivity() {//open修飾子 継承できるようにする

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

        AddAlarm.setOnClickListener {
            //SetActivityに移動
            val intent = Intent(this, SetActivity::class.java)
            startActivity(intent)
        }
    }

    // MainActivity#onResumeで固定値定義されている画像を不揮発領域を参照して差し替える処理に変更すれば問題なく動作します。らしい
    //背景場面を統一
    override fun onResume() {//onResumeはActivityが呼び出された時に実行される
        super.onResume()
        //SetActivityから背景選択の際に受け取った変数を入れる
        val text = intent.getIntExtra("TEXT_KEY",R.drawable.mokou2)

        background.setImageResource(text)//imageviewの背景のやつ

  }
} 
SetActivity.kt


package com.example.mkualarm

import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.*
import kotlinx.android.synthetic.main.activity_set.*
import java.text.SimpleDateFormat
import java.util.*

open class SetActivity : MainActivity() {

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

        //listviewの名前の配列
        val listView = findViewById<ListView>(R.id.listview)
        listView.adapter = MycoustomAdapter(this)

//clickしたときの処理
        settingA.setOnClickListener {

            //MainActivityに戻る
            val intent = Intent(this, MainActivity::class.java)

            startActivity(intent)
        }
    }

    public inner class MycoustomAdapter(context: Context) :
        BaseAdapter() { //innerクラスにした

        fun getToday(): String {//現在時刻取得
            val date = Date()
            val format = SimpleDateFormat("HH:mm", Locale.getDefault())
            return format.format(date)
        }

        private val mContext: Context

        private val names = arrayListOf<String>(
            "時刻", "背景", "音声", "未定"
        )
        val descriptions = listOf("", "", "", "") 

        val arrays = arrayListOf(//spinnerのやつ
            R.array.txt_time_arr,//ここ
            R.array.txt_image_arr,
            R.array.txt_sound_arr,
            R.array.txt_unknown_arr
        )

        init {
            mContext = context
        }

        //responsible for how many rows in my list
        override fun getCount(): Int {
            return names.size
        }

        override fun getItemId(position: Int): Long {
            return position.toLong()
        }

        override fun getItem(position: Int): Any {
            return "TEST STRING"
        }

        //responsible for rendering out each row
        override fun getView(position: Int, convertView: View?, viewGroup: ViewGroup?): View {
            val layoutInflater = LayoutInflater.from(mContext)
            val LISTITEM = layoutInflater.inflate(R.layout.list_item, viewGroup, false)

            val NameTextView = LISTITEM.findViewById<TextView>(R.id.nameTextView)
            NameTextView.text = names.get(position)

            val DescTextView = LISTITEM.findViewById<TextView>(R.id.descTextView)

            DescTextView.text = descriptions.get(position)//Textview2がdescriptionsの要素に変わる

            val spinner: Spinner = LISTITEM.findViewById(R.id.spinner)//spinnerをにつける
            var adapter = ArrayAdapter.createFromResource(//adapterのレイアウト
                mContext, arrays.get(position), R.layout.spinner_item
            )
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)

            // Apply the adapter to the spinner
            spinner.adapter = adapter

            // リスナーを登録
            spinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
                // アイテムが選択された時
                override fun onItemSelected(
                    parent: AdapterView<*>?,
                    view: View?, pos: Int, id: Long
                ) {
                    val spinnerParent = parent as Spinner
                    val item = spinnerParent.selectedItem as String
                    // Kotlin Android Extensions


                    //pos == 1は背景のリスト
                    if (position == 1) {

                        when (pos) {

                            0 -> {
                                background.setImageResource(R.drawable.mokou2)//背景変更○
                            val text = R.drawable.mokou2
                                //intent変数をつなげる(第一引数はキー,第二引数は渡したい変数)
                                intent.putExtra("TEXT_KEY",text)
                            }
                            1 -> {
                                background.setImageResource(R.drawable.mokou3)
                                 val text = R.drawable.mokou3
                                intent.putExtra("TEXT_KEY",text)
                            }//背景変更○


                        }
                    }
                }

                // アイテムが選択されなかった
                override fun onNothingSelected(parent: AdapterView<*>?) {         
                }
            }    
            return LISTITEM    
        }
    }
}

試したこと

MainActivity.ktのソースコードの
//SetActivityから背景選択の際に受け取った変数を入れる
val text = intent.getIntExtra("TEXT_KEY",R.drawable.mokou2)
のgetIntExtra処理の第二引数(初期値)を0にすると画像が出なくなるので、background.setImageResource(text)が機能していることはわかりました。

以下を参考にして作りました

https://akira-watson.com/android/kotlin/activity-trans-data.html#1
https://qiita.com/kazu5546325/items/d3e18579215c0b379f93

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • nakasho_dev

    2019/10/01 00:31

    ソースコードは```で囲ってください。読みやすくした方が回答が得られやすいですよ。

    キャンセル

  • nakasho_dev

    2019/10/07 00:07

    SetActivityがMainActivityを継承している意図が分からないです。MainActivityからstartActivityForResultでSetActivityを呼び出して、その結果をonActivityResultで受け取る方法が一般的だと認識しています。

    キャンセル

  • sumanai

    2019/10/07 15:59

    Androidのアプリ開発を始めたばかりという事もあり、どのようなメソッド等を使えばいいかよく分かっていませんでした。
    やりたい事としては、
    MainActivityとSetActivityの背景の統一がしたかったい、とりあえずSetActivityはMainActivityを継承しておけば、同じになると思い継承していました。SetActivityの画面で、背景画像を変更して、MainActivityに画面遷移する時に変更する画像のIDをデータを渡せばいいと考えてました。

    キャンセル

回答 1

checkベストアンサー

0

  1. MainActivityからstartActivityForResultでSetActivityを呼び出す
  2. SetActivityはMainActivityに渡したい値をsetResultで渡してfinish
  3. MainActivityはその結果をonActivityResultで受け取る

という流れを意識してください。
以下の記事が分かりやすそうです。

また、SetActivityはMainActivityを継承してもインスタンスは別物です。
どちらかを変えればどちらにも反映される、なんてことは一般的なやり方ではできません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/10/07 23:43

    色々調べてみて、アクテビティ間でのデータの受け渡しはできました。
    onActivityResult内で受け取ったデータを他のメソッドで扱う場合はどうすればいいのですか?

    キャンセル

  • 2019/10/07 23:48

    他のメソッドというのが自作のものであれば引数として渡せばよいのではないでしょうか。

    キャンセル

  • 2019/10/08 00:59

    自作のものではないです。onResumeというやつです。

    キャンセル

  • 2019/10/08 01:18

    MainActivityのメンバ変数に保存してはいかがでしょうか。また、ActivityはKillされやすいのでonSaveInstanceStateで保存する方法なども有効です。もう少し理解が進んだらAndroid Architecture ComponentのViewModelに保存することをお勧めします。

    キャンセル

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

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

関連した質問

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