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

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

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

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

Android Studio

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

Kotlin

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

Q&A

解決済

1回答

752閲覧

Kotlinで変数に入っている値に応じて処理(setOnClickListener)を分けたい

yamada_norio

総合スコア1

Android

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

Android Studio

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

Kotlin

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

0グッド

0クリップ

投稿2021/09/12 10:23

質問者のレベル

プログラミングはちょこっとスクリプトをかけるぐらい(主にbash)で素人です。

何をやってるときに問題にぶつかったか

以下URLの、「ステップ 2: clickLemonImage() を実装する」の項。
https://developer.android.com/codelabs/basic-android-kotlin-training-project-lemonade?hl=ja#4

前提・実現したいこと

現在のlemonadeStateの状態に応じて処理を分けたい。

日本語で書くなら、
changeButton.setOnClickListenerが実行されたとき、
lemonadeState が、SELECTの時、lemonadeState を SQUEEZEに変える。
lemonadeState が、SQUEEZEの時、lemonadeState を DRINKに変える。
(以下省略)

という処理を実現したい。

何かしらヒントをお授けください。

該当のソースコード

Kotlin

1 private val SELECT = "select" 2 private val SQUEEZE = "squeeze" 3 private val DRINK = "drink" 4 private val RESTART = "restart" 5 private var lemonadeState = "select" 6 7 private val changeButton:ImageView = findViewById(R.id.lemonTree) 8 private val textBox:TextView = findViewById(R.id.textView) 9 10 override fun onCreate(savedInstanceState: Bundle?) { 11 super.onCreate(savedInstanceState) 12 setContentView(R.layout.activity_main) 13 changeButton.setOnClickListener { clickLemonImage() } 14 } 15 16 private fun clickLemonImage() { 17 18 when (lemonadeState) { 19 SELECT -> { 20 lemonadeState = SQUEEZE 21 } 22 SQUEEZE -> { 23 lemonadeState = DRINK 24 } 25 DRINK-> { 26 lemonadeState = RESTART 27 28 } 29 RESTART -> { 30 lemonadeState = SELECT 31 32 } 33 34 } 35 } 36}

試したこと

以下のコメント行に「何かしらlemonadeStateを変える処理」というのを入れれば良い
ということまでは考え付きました。

数字を使えるなら、以下の、 //「何かしらlemonadeStateを変える処理」、counter += 1のような処理を入れれば
「changeButton.setOnClickListener」が実行されるたび、画像が変わる(変えられる)ことはわかりました。

しかし、これを
「changeButton.setOnClickListenerが実行される際ののlemonadeStateの状態により、処理を分ける」という処理が
正直皆目見当つきません。

数字を使わない理由は、上記URLに、

状態には SELECT、SQUEEZE、DRINK、RESTART の 4 つがあり、現在の状態は lemonadeState 変数によって表されます。
このメソッドでは、状態ごとに異なる処理を行う必要があります。

とあり、数字で無く「文字」で状態を表せ
と読み取れる文があったためです。

Kotlin

1private fun clickLemonImage() { 2 //「何かしらlemonadeStateを変える処理」 3 when (lemonadeState) {

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

プロジェクトの作成環境は、Empty Activityで、Minimum SDKはAPI19を指定しております。

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

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

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

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

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

TakaiY

2021/09/12 12:59

clickLemonImage の処理を見ると、「changeButton.setOnClickListenerが実行されたとき、lemonadeState が、SELECTの時、lemonadeState を SQUEEZEに変える。lemonadeState が、SQUEEZEの時、lemonadeState を DRINKに変える。(以下省略) という処理を実現したい。」の通りの処理になっているようです。 わからないことは何でしょう?
hoshi-takanori

2021/09/12 19:55

GitHub から落としてきた元のコードの // TODO: 〜 に、英文でやるべきことが書いてあるので、その通りに書けばいいと思います。 他の人もご指摘の通り、基本的な状態繊維はできてますが、それに加えて ・SELECT の場合、変数 lemonSize と squeezeCount に適切な値を入れる ・SQUEEZE の場合、まず変数 lemonSize と squeezeCount の値を操作して、lemonSize が特定の値の場合だけ状態遷移する ・clickLemonImage の最後で (状態が何であれ) setViewElements を呼んで表示を更新 ・setViewElements では状態に応じてテキストと画像を更新 する必要があるかと。
guest

回答1

0

ベストアンサー

状態遷移という考え方です。
質問の意図がよくわからなかったのですが、

changeButton.setOnClickListenerが実行されたとき、
lemonadeState が、SELECTの時、lemonadeState を SQUEEZEに変える。
lemonadeState が、SQUEEZEの時、lemonadeState を DRINKに変える。

これは、「該当のソースコード」でお示しいただいたコードがまさにこの処理をやっていると思います。

投稿2021/09/12 13:05

ak.n

総合スコア291

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

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

yamada_norio

2021/09/13 13:54

ありがとうございます。 非常にお恥ずかしい話ですが、おもいきって一度全部削除してから、 一から入れなおしたところ無事に動きました。 消さずにソースを取っておけばよかったのですが、 消してしまい、今は何が間違っていたのか確認ができません。 ほんとにお恥ずかしい限りです。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問