🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Android

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

Android Studio

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

Kotlin

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

Q&A

解決済

1回答

946閲覧

Android Studio

yasuun

総合スコア7

Android

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

Android Studio

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

Kotlin

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

0グッド

0クリップ

投稿2021/03/13 23:25

編集2021/03/26 09:22

●やりたいこと
Android StudioにてMain.ktからResult.ktへFloat型の値を送りたい。
Mainにて、putExtra("WEIGHT", weight!!)で格納された値をResultにて同じくgetFloatExtra("WEIGHT", weight!!)で受け取ろうとしているのですが、エラーとなり何度試しても解決策がわかりません。。。
現在はエラーが出ないように、val Weight = intent.getFloatExtra("WEIGHT", 0f)としてデフォルト値0を入れているのですが、これだと0のため計算ができず、どの計算の答えも0となってしまいます。

おそらく質問の仕方がうまくなく、ご指摘頂くかもしれませんが初心者のためどのような質問がいいか未だにわかっておりません、、。
何卒よろしくお願い致します。

Kotlin(Main.kt)

1 2class MainActivity : AppCompatActivity() { 3 //lateinitはonCreate外にあるbindingを紐づけるため 4 5 //下記3つはEditText型 6 lateinit var editWeight: EditText 7 lateinit var editAge: EditText 8 lateinit var editHight: EditText 9 10 //下記2つはRadioButton型 11 lateinit var radioMan: RadioButton 12 lateinit var radioWoman: RadioButton 13 14 //下記3つはButton型 15 lateinit var infoButton: Button 16 lateinit var keisanButton: Button 17 lateinit var nextButton: Button 18 19 //上の8つの宣言はbinding.idで直指定出来るため必要のないフィールド 20 21 //男女どちらがチェックされたかを判断する変数 22 var man_is_checkd = false 23 var woman_is_checked = false 24 25 //?はnull許容型このままでは計算できない 26 var weight: Float? = 0f 27 var age: Float? = 0f 28 var hight: Float? = 0f 29 30 private lateinit var binding: ActivityMainBinding //binding 31 32 override fun onCreate(savedInstanceState: Bundle?) { 33 super.onCreate(savedInstanceState) 34 binding = ActivityMainBinding.inflate(layoutInflater)//binding 35 setContentView(binding.root)//binding 36 37 //それぞれのviewとの紐付け 38 //先にも書いたが、直指定出来るため変数にいれる必要もないがjavaの復習のため 39 editWeight = binding.weight 40 editAge = binding.age 41 editHight = binding.hight 42 43 radioMan = binding.man 44 radioWoman = binding.woman 45 46 infoButton = binding.infoBtn 47 keisanButton = binding.keisanBtn 48 nextButton = binding.nextBtn 49 50 51 //binding.ID.メソッド(文字or整数など) 52 binding.welcomDA.setText("WelcomDaietAdviser") 53 binding.textView2.setText("まずは基礎代謝を計算しましょう!") 54 55 56 //計算結果を格納するプロパティ(javaでいうフィールド) 57 var kisotaisya: Float 58 59 binding.keisanBtn.setOnClickListener { 60 61 val weight = editWeight.text.toString().toFloatOrNull() 62 val age = editAge.text.toString().toFloatOrNull() 63 val height = editHight.text.toString().toFloatOrNull() 64 if (weight == null || age == null || height == null) { 65 AlertDialog.Builder(this) 66 .setTitle(R.string.dialog_title_invalid_input) 67 .setPositiveButton(android.R.string.ok, null).show() 68 return@setOnClickListener 69 } 70 71 if (man_is_checkd) { //男が選ばれた処理 72 kisotaisya = 13.397f * weight!! + 4.799f * height!! - 5.677f * age!! + 88.362f 73 } else if (woman_is_checked) { //女が選ばれた処理 74 kisotaisya = 9.247f * weight!! + 3.098f * height!! - 4.33f * age!! + 447.593f 75 } else { //どちらも選ばれていない 76 AlertDialog.Builder(this) 77 .setTitle(R.string.dialog_title_invalid_input) 78 .setPositiveButton(android.R.string.ok, null).show() 79 return@setOnClickListener 80 } 81 binding.kisotaisya.setText(kisotaisya.toString()) 82 83 } 84 85 86//前回入力した数値を記憶しておく処理 87 binding.infoBtn.setOnClickListener { 88 89 val data: SharedPreferences = getSharedPreferences("DATA", Context.MODE_PRIVATE) 90 val editor = data.edit() 91 editor.putFloat("WEIGHT", weight!!) 92 editor.putFloat("AGE", age!!) 93 editor.putFloat("HIGHT", hight!!) 94 editor.apply() 95 96 } 97 98 99 100 binding.nextBtn.setOnClickListener { 101 startActivity(Intent(this, ResultActivity1::class.java).apply { 102 putExtra("WEIGHT", weight!!) 103 putExtra("AGE", age!!) 104 putExtra("HIGHT", hight!!) 105 //putExtra("KISOTAISYA", kiso)//if文で計算したkisotaisyaを入れて、ResultActivityで使いたいができない) 106 }) 107 108 } 109 } 110 111fun onClickRadioButton(view: View) { 112 if (view is RadioButton) { //ラジオボタンからしか呼ばれないため不要な処理 113 114 val checked: Boolean = view.isChecked //ラジオボタンがチェックされた 115 116 when (view.getId()) { 117 R.id.man -> if (checked) { //viewのidがmanで、もしcheckedならmanをtruewomanをfalse 118 man_is_checkd = true 119 woman_is_checked = false 120 } 121 R.id.woman -> if (checked) { 122 man_is_checkd = false 123 woman_is_checked = true 124 } 125 } 126 } 127 } 128} 129 130

result.kt

1class ResultActivity1 : AppCompatActivity() { 2 lateinit var binding: ActivityResult1Binding 3 override fun onCreate(savedInstanceState: Bundle?) { 4 super.onCreate(savedInstanceState) 5 binding=ActivityResult1Binding.inflate(layoutInflater) 6 setContentView(binding.root) 7 8 binding.Text1.setText("基礎代謝を計算しましょう!") 9 binding.textStrong.setText("高強度TR") 10 binding.textMidium.setText("中強度TR") 11 binding.textLow.setText("低強度TR") 12 binding.textWalking.setText("ウォーキング") 13 binding.textSit.setText("座位") 14 binding.textStand.setText("立位(立ち姿勢)") 15 binding.min1.setText("分") 16 binding.min2.setText("分") 17 binding.min3.setText("分") 18 binding.min4.setText("分") 19 binding.min5.setText("分") 20 binding.min6.setText("分") 21 binding.todayActive1.setText("今日の活動代謝は") 22 binding.totalKcal1.setText("今日の消費カロリー") 23 24binding.activeKeisanBtn.setOnClickListener { 25 val editTR1 = binding.editTR1.text.toString().toFloatOrNull() 26 val editTR2 = binding.editTR2.text.toString().toFloatOrNull() 27 val editTR3 = binding.editTR3.text.toString().toFloatOrNull() 28 val editWalk = binding.editWalk.text.toString().toFloatOrNull() 29 val editSit = binding.editSit.text.toString().toFloatOrNull() 30 val editStand = binding.editStand.text.toString().toFloatOrNull() 31 32 if(editTR1 == null || editTR2 == null || editTR3 == null || editWalk == null 33 || editSit == null || editStand == null) { 34 AlertDialog.Builder(this) 35 .setTitle(R.string.dialog_title_invalid_input) 36 .setPositiveButton(android.R.string.ok, null).show() 37 return@setOnClickListener 38 39 } 40 41 //putExtraで格納された値を変数に入れる処理 42 val Weight = intent.getFloatExtra("WEIGHT", 0f) 43 val Age = intent.getFloatExtra("AGE", 0f) 44 val Hight = intent.getFloatExtra("HIGHT", 0f) 45 val kisotaisya3 = intent.getFloatExtra("KISOTAISYA", 0f); 46 47 //活動代謝の合計とmain.java出したkisotaisyaの合計を計算 48 //val totalKcal2 = katudoTaisya + //mainActivutyのkisotaisyaを使いたい 49 //binding.totalKcal2.setText(totalKcal2) 50 51 52 //各運動別の活動代謝計算式 53 //活動代謝の出し方(例)(2.5METs-1) × 60kg × 0.5時間 × 1.05 = 78.75kcal 54 val active1 = 5f * Weight * editTR1!! * 1.05f 55 val active2 = 4f * Weight * editTR2!! * 1.05f 56 val active3 = 3.5f * Weight * editTR3!! * 1.05f 57 val activeWalk = 1.8f * Weight * editWalk!! * 1.05f 58 val activeStand = 0.8f * Weight * editStand!! * 1.05f 59 val activeSit = 0.5f * Weight * editSit!! * 1.05f 60 61 //この日の活動代謝の合計 62 val katudoTaisya = active1 + active2 + active3 + activeWalk + activeStand + activeSit 63 //結果を画面に表示 64 binding.todayActive2.setText(katudoTaisya.toString()) 65 66

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

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

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

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

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

hoshi-takanori

2021/03/13 23:47

Kotlin なので main.java じゃなくて main.kt では。そして、weight や age などの変数が keisanBtn の OnClickListener のローカル変数になってますが、MainActivity のプロパティにすべきでは。
yasuun

2021/03/26 06:42

ありがとうございます。 javaと並行して行なっているので間違えてしまいました。。 また、プロパティにしてみたのですがうまく作動できなくなり、何度か試したのですが、、。 また直っているかわかりませんが、修正しましたので、機会があればまたご指導よろしくお願い致します。
hoshi-takanori

2021/03/26 07:28 編集

えっと、setOnClickListener の部分だけ抜き出してますけど、それぞれ MainActivity や ResultActivity の onCreate メソッドの中に書いてあるという認識でよろしいでしょうか? また、activity_main.xml には入力欄 3 つとチェックボックス (またはラジオボタン) 2 つとテキスト表示欄 1 つとボタン 2 つ、activity_result.xml には入力欄 6 つとテキスト表示欄 1 つとボタン 1 つがあるってことですよね?
yasuun

2021/03/26 09:11

はい!onCreateに記入しております。 main.xmlにはボタンは3つありますが、現在稼働させているのは2つになります! result.xmlも入力欄6つと、表示蘭は2つありますが現在稼働させているのは1つです!(今後稼働させる予定です)。 全て載せないとわかりにくいですよね、、 修正いたします!
yasuun

2021/03/26 09:24

申し訳ございません。XMLの方が文字数の関係で載せられなく、result.ktと足りていないmain.ktのみ追加致しました。 度々申し訳ございませんが、何卒よろしくお願い致します。
guest

回答1

0

ベストアンサー

weight, age, hight (height) という変数ですが、MainActivity のプロパティになってるやつは、このクラス全体からアクセスできます。が、

Kotlin

1class MainActivity : AppCompatActivity() { 2 3 //?はnull許容型このままでは計算できない 4 var weight: Float? = 0f 5 var age: Float? = 0f 6 var hight: Float? = 0f

keisanBtn の setOnClickListener の中にも (ほぼ) 同じ名前のローカル変数があって、OnClickListener の中ではこちらが優先されます。つまり、keisanBtn を押した時はローカル変数が更新されてプロパティの方はそのままなので、infoBtn や nextBtn が押されたときにプロパティにアクセスしても 0 のままです。

Kotlin

1 binding.keisanBtn.setOnClickListener { 2 3 val weight = editWeight.text.toString().toFloatOrNull() 4 val age = editAge.text.toString().toFloatOrNull() 5 val height = editHight.text.toString().toFloatOrNull()

このように MainActivity の中のいろんなところからアクセスしたい変数は、ローカル変数ではなく MainActivity のプロパティの方を使いましょう。

Kotlin

1 binding.keisanBtn.setOnClickListener { 2 3 weight = editWeight.text.toString().toFloatOrNull() 4 age = editAge.text.toString().toFloatOrNull() 5 hight = editHight.text.toString().toFloatOrNull()

計算結果を格納する kisotaisya も、現状はプロパティではなく onCreate のローカル変数になってますので、MainActivity のプロパティにすると良いでしょう。

また、男女のラジオボタンを押した時の処理は呼ばれてますか? activity_main.xml に android:onClick="onClickRadioButton" と書いてあればそれで大丈夫ですが、Kotlin コードで設定するならこんな感じでしょうか。

Kotlin

1 radioMan.setOnClickListener(this::onClickRadioButton) 2 radioWoman.setOnClickListener(this::onClickRadioButton)

念のため、以上の変更を加えたソースを貼っておきます。

Kotlin

1class MainActivity : AppCompatActivity() { 2 //lateinitはonCreate外にあるbindingを紐づけるため 3 4 //下記3つはEditText型 5 lateinit var editWeight: EditText 6 lateinit var editAge: EditText 7 lateinit var editHight: EditText 8 9 //下記2つはRadioButton型 10 lateinit var radioMan: RadioButton 11 lateinit var radioWoman: RadioButton 12 13 //下記3つはButton型 14 lateinit var infoButton: Button 15 lateinit var keisanButton: Button 16 lateinit var nextButton: Button 17 18 //上の8つの宣言はbinding.idで直指定出来るため必要のないフィールド 19 20 //男女どちらがチェックされたかを判断する変数 21 var man_is_checkd = false 22 var woman_is_checked = false 23 24 //?はnull許容型このままでは計算できない 25 var weight: Float? = 0f 26 var age: Float? = 0f 27 var height: Float? = 0f 28 29 //計算結果を格納するプロパティ(javaでいうフィールド) 30 var kisotaisya: Float = 0f 31 32 private lateinit var binding: ActivityMainBinding //binding 33 34 override fun onCreate(savedInstanceState: Bundle?) { 35 super.onCreate(savedInstanceState) 36 binding = ActivityMainBinding.inflate(layoutInflater)//binding 37 setContentView(binding.root)//binding 38 39 //それぞれのviewとの紐付け 40 //先にも書いたが、直指定出来るため変数にいれる必要もないがjavaの復習のため 41 editWeight = binding.weight 42 editAge = binding.age 43 editHight = binding.hight 44 45 radioMan = binding.man 46 radioWoman = binding.woman 47 48 //ラジオボタンの処理 49 radioMan.setOnClickListener(this::onClickRadioButton) 50 radioWoman.setOnClickListener(this::onClickRadioButton) 51 52 infoButton = binding.infoBtn 53 keisanButton = binding.keisanBtn 54 nextButton = binding.nextBtn 55 56 57 //binding.ID.メソッド(文字or整数など) 58 binding.welcomDA.setText("WelcomDaietAdviser") 59 binding.textView2.setText("まずは基礎代謝を計算しましょう!") 60 61 62 binding.keisanBtn.setOnClickListener { 63 64 weight = editWeight.text.toString().toFloatOrNull() 65 age = editAge.text.toString().toFloatOrNull() 66 height = editHight.text.toString().toFloatOrNull() 67 if (weight == null || age == null || height == null) { 68 AlertDialog.Builder(this) 69 .setTitle(R.string.dialog_title_invalid_input) 70 .setPositiveButton(android.R.string.ok, null).show() 71 return@setOnClickListener 72 } 73 74 if (man_is_checkd) { //男が選ばれた処理 75 kisotaisya = 13.397f * weight!! + 4.799f * height!! - 5.677f * age!! + 88.362f 76 } else if (woman_is_checked) { //女が選ばれた処理 77 kisotaisya = 9.247f * weight!! + 3.098f * height!! - 4.33f * age!! + 447.593f 78 } else { //どちらも選ばれていない 79 AlertDialog.Builder(this) 80 .setTitle(R.string.dialog_title_invalid_input) 81 .setPositiveButton(android.R.string.ok, null).show() 82 return@setOnClickListener 83 } 84 binding.kisotaisya.setText(kisotaisya.toString()) 85 86 } 87 88 89//前回入力した数値を記憶しておく処理 90 binding.infoBtn.setOnClickListener { 91 92 val data: SharedPreferences = getSharedPreferences("DATA", Context.MODE_PRIVATE) 93 val editor = data.edit() 94 editor.putFloat("WEIGHT", weight!!) 95 editor.putFloat("AGE", age!!) 96 editor.putFloat("HIGHT", height!!) 97 editor.apply() 98 99 } 100 101 102 103 binding.nextBtn.setOnClickListener { 104 startActivity(Intent(this, ResultActivity1::class.java).apply { 105 putExtra("WEIGHT", weight!!) 106 putExtra("AGE", age!!) 107 putExtra("HIGHT", height!!) 108 putExtra("KISOTAISYA", kisotaisya)//if文で計算したkisotaisyaを入れて、ResultActivityで使いたいができない) 109 }) 110 111 } 112 } 113 114 fun onClickRadioButton(view: View) { 115 if (view is RadioButton) { //ラジオボタンからしか呼ばれないため不要な処理 116 117 val checked: Boolean = view.isChecked //ラジオボタンがチェックされた 118 119 when (view.getId()) { 120 R.id.man -> if (checked) { //viewのidがmanで、もしcheckedならmanをtruewomanをfalse 121 man_is_checkd = true 122 woman_is_checked = false 123 } 124 R.id.woman -> if (checked) { 125 man_is_checkd = false 126 woman_is_checked = true 127 } 128 } 129 } 130 } 131}

投稿2021/03/26 10:28

hoshi-takanori

総合スコア7899

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

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

yasuun

2021/03/26 12:29

毎度ご丁寧な回答ありがとうございます!! そういうことだったんですね、、汗 やっと理解できました???? また、ラジオボタンもおっしゃる通りXMLでandroid:onClick="onClickRadioButton"というように記述しております。 またご協力頂けると嬉しいです。。 よろしくお願い致します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問