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

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

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

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

Kotlin

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

Q&A

解決済

1回答

1233閲覧

Android Kotlin での画面振分け方法

HYDESA

総合スコア8

Android Studio

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

Kotlin

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

0グッド

0クリップ

投稿2021/08/25 04:46

編集2021/08/25 04:59

前提・実現したいこと

いつもお世話になっております。
androidアプリを製作しております。
画面遷移から2つのViewを振り分けたくググっていますが
ヒットするサイトが無かったので、質問させていただきました。

やりたいことは、Mainページでラジオボタンで処理を選択し、
実行ボタンから次の画面の表示を切り替えるというものです。

言語はKotlin で intent を使って画面遷移とデータ移行を行っています。

ところが、IF文やWhenを使って処理をしようとすると
関数がグレーアウトしてしまい、一向にうまくいきません。

発生している問題

IF文で囲ったval intent がグレーアウトしてしまう

該当のソースコード

kotlin

1class MainActivity : AppCompatActivity() { 2 override fun onCreate(savedInstanceState: Bundle?) { 3 super.onCreate(savedInstanceState) 4 setContentView(R.layout.activity_main) 5 6 // ホスト名入力EditText 7 val editText1 = findViewById<EditText>(R.id.editText1) 8 // Group化されたRadioButton 9 // radioButton1がSubWindow画面を表示 10 val radioButton1 = findViewById<RadioButton>(R.id.radioButton1) 11 // radioButton2がTestWindow画面を表示 12 val radioButton2 = findViewById<RadioButton>(R.id.radioButton2) 13 // 実行ボタン 14 val runButton = findViewById<Button>(R.id.button1) 15 16 // 実行ボタンがタップされた時の処理 17 runButton.setOnClickListener { 18 if(radioButton1.isChecked){ 19 // radioButton1がTrue 20 val intent = Intent(this, SubWindow::class.java) // ←変数だけグレーアウト 21 }else{ 22 // radioButton1がFalse(radioButton2がTrue) 23 val intent = Intent(this, TestWindow::class.java) // ←変数だけグレーアウト 24 } 25 intent.putExtra("hostName", editText1.text.toString()) 26 startActivity(intent) 27 }

試したこと

if(radioButton1.isChecked){
のところを

Kotlin

1var context = SubWindow::class.java 2if(radioButton2.isChecked){ 3 context = TextWindow::class.java 4 // Error: 5 // ↑Type mismatch: inferred type is Class<TextWindow> but Class<SubWindow> was expected 6 // ↑Type mismatch: inferred type is SubWindow but TextWindow was expected 7 // ↑Type mismatch: inferred type is TextWindow but SubWindow was expected 8} 9val intent = Intent(this, context)

とか

Kotlin

1var select = 0 2if(radioButton2.isChecked) select = 1 3 4when(select){ 5 0 -> {val intent = Intent(this, SubWindow::class.java)} // ←グレーアウト 6 1 -> {val intent = Intent(this, TestWindow:class.java)} // ←グレーアウト 7}

などやってみましたが
エラーが出たり、グレーアウトしたりと
うまくいきませんでした。

ボタンによる振り分けはうまく行きますが、
ほぼ同じソースが2つになってしまうため、
Intentだけを分けるようにして簡素化したいです。

IF文等での振り分けは出来ないのでしょうか。
すいませんがどなたかご教示ください。
よろしくお願い致します。

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

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

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

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

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

jimbe

2021/08/25 06:29 編集

変数のスコープを間違っておられるようです。 intent 変数の宣言を(var にして) if 文や when 文の前に持っていっては如何でしょうか。
HYDESA

2021/08/25 07:15

コメントありがとうございます。 If文前に var intent :Intent を置いて If文内で定義したところ、無事に出来ました。 ご教示ありがとうございました、大変助かりました。
guest

回答1

0

ベストアンサー

変数の宣言だけ if の前で行うと良いでしょう。

Kotlin

1 // 実行ボタンがタップされた時の処理 2 runButton.setOnClickListener { 3 val intent: Intent 4 if(radioButton1.isChecked){ 5 // radioButton1がTrue 6 intent = Intent(this, SubWindow::class.java) 7 }else{ 8 // radioButton1がFalse(radioButton2がTrue) 9 intent = Intent(this, TestWindow::class.java) 10 } 11 intent.putExtra("hostName", editText1.text.toString()) 12 startActivity(intent) 13 }

または、Kotlin の if は文ではなく式なので、こういう書き方もできます。

Kotlin

1 // 実行ボタンがタップされた時の処理 2 runButton.setOnClickListener { 3 val intent = if(radioButton1.isChecked){ 4 // radioButton1がTrue 5 Intent(this, SubWindow::class.java) 6 }else{ 7 // radioButton1がFalse(radioButton2がTrue) 8 Intent(this, TestWindow::class.java) 9 } 10 intent.putExtra("hostName", editText1.text.toString()) 11 startActivity(intent) 12 }

ちなみに、元の書き方だと intent というローカル変数は if の中だけで有効なので、その後のコードでは intent なんて変数は知らないというエラーになるはずですが、これがエラーにならないのは、Kotlin だと intent が getIntent という Activity クラスのゲッター呼び出しと解釈されるからですね。

投稿2021/08/25 07:13

hoshi-takanori

総合スコア7895

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

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

HYDESA

2021/08/25 07:19

hoshi-takanoriさん、コメントありがとうございました。 jimbeさんのコメントで対処出来ましたが、細かなところまで 教えてくださったので、ベストアンサーとさせていただきました。 大変助かりました。 またよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問