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

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

ただいまの
回答率

87.36%

kotlin 『変化し続ける数値』 と『変化しない数値』の計算をしたい

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 864

score 6

表題の通り、ランダムに0.5秒ごとに切り替わる数値(以下A)と、ある一定の数値(B)の計算をする機能を実装したいです。
その計算結果もAと同様に0.5秒ごとに切り替わるように表示させたいです。

まずAは、0.5秒ごとに100以下の数値がランダムに切り替わって表示されます。
以下、コード
MainActivity.kt

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

//100以下の数値を0.5秒ごとにランダム表示(スタートボタンで開始)
         buttonSTART.setOnClickListener {
             GlobalScope.launch {
                 while (true){
                     delay1(500L)
                     textView.text = "${(1..100).random()}"
                 }
             }
         }

ランダムに表示するビュー
activity_main.xml

    <TextView
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:id="@+id/textViewNumberA"
            android:textAlignment="center"
            android:background="@android:color/darker_gray"
            android:textSize="36sp"
            app:layout_constraintTop_toBottomOf="@+id/buttonMOVE"    
            app:layout_constraintEnd_toStartOf="@+id/buttonEMG"
            android:layout_marginBottom="17dp" 
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="25dp"
            app:layout_constraintBottom_toBottomOf="parent" 
            android:layout_marginEnd="21dp"
    />

一定の値Bを入力するのEditText

 <EditText
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:inputType="number"
            android:ems="10"
            android:id="@+id/editNumberB"
            android:background="@android:color/darker_gray"
            android:autofillHints="" tools:ignore="LabelFor"
            app:layout_constraintTop_toBottomOf="@+id/visualizer" app:layout_constraintEnd_toStartOf="@+id/mvc"
            app:layout_constraintBottom_toTopOf="@+id/buttonMOVE" app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="21dp" android:layout_marginEnd="15dp"
    />

Webで計算アプリの作り方などを参照して書いてみたのですが、もちろんうまくいかず、
ガバガバなコードになっていると思います。

流れとしては、
1.Bを入力
2.スタートボタンを押すと、Aが0.5秒ごとに表示(View1)、と同時に計算結果も表示(View2)

になります。

以下、書いてみたコード(本当にぐちゃぐちゃなコードです)

//計算
        buttonSTART.setOnClickListener {

            //数値Bの入力を取得
            val get_b = findViewById<EditText>(R.id.editNumberB)
            val st_b = editNumberB.text.toString()

            //数値Aを取得
            val get_a = findViewById<TextView>(R.id.textViewNumberA)
            val st_a = textViewNumberA.text.toString()

            val a = Integer.parseInt(st_a)
            val b = Integer.parseInt(st_b)

            //計算
            val kekka = b / a * 100

            //表示
            val set_kekka = findViewById<TextViewKekka>(R.id.mvc)
            }

エミュレーターでランさせたところ、STARTボタンをおしたところでアプリが落ちます。

アドバイスよろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • keicha_hrs

    2019/09/14 21:52 編集

    AnonymouZさんとkakajikaさんの助言を全く受け入れずに突き進んでも良い結果は得られないと思います。

    キャンセル

回答 2

0

変化するどーこーとは関係なく、とにかく2つの値の計算、表示をきちんと完成させましょう。
まずはそれからのはなしです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/09/14 22:16

    回答ありがとうございます。
    AをランダムではなくBと同じように普通に数値を入力する場合とした時は問題なく計算、表示はできております。

    しかしAが変化し続けている場合の、まさしく計算、表示がうまくいかず止まっております。
    その計算、表示ができればそれで解決するのですが、情報収集に戸惑っております。

    キャンセル

0

  • textViewNumberAというTextView
  • editNumberBというEditText
  • buttonSTARTというButton
  • mvcというTextView

の4つがあったとして、

  • buttonSTARTを押したらtextViewNumberAに1〜100の数字を0.5秒ごとにランダム表示
  • editNumberBに適当な数値を入力したら、その値とtextViewNumberAとを計算して、計算結果をtextViewNumberAの表示更新と同じタイミングでmvcに表示。

という解釈でざっくり書いてみました。(細かいエラー処理は想定していない)

MainActivity.kt

package (自分のパッケージ名)

import android.os.Bundle
import android.view.inputmethod.EditorInfo
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.coroutines.*

class MainActivity : AppCompatActivity(), CoroutineScope by MainScope() {

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

        var editNumberBVal = 0

        editNumberB.setOnEditorActionListener(TextView.OnEditorActionListener { _, actionId, _ ->
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                // ソフトウェアキーボードの確定キーを押したときの値を覚えておく
                editNumberBVal = editNumberB.text.toString().toInt()
                return@OnEditorActionListener true
            }
            false
        })

        buttonSTART.setOnClickListener {
            // GlobalScopeは使わない
            launch {
                while (true) {
                    delay(500L)
                    val textViewNumberAVal = (1..100).random()

                    // 計算する
                    val result = (editNumberBVal.toDouble() / textViewNumberAVal * 100).toInt()

                    textViewNumberA.text = "$textViewNumberAVal"
                    mvc.text = "$result"
                }
            }
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        cancel()  // コルーチンを止める
    }
}


app/build.gradle(1行追加)

dependencies {
    (省略)
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.1"
    (省略)
}

とりあえずこんなので叩き台になりますか?

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/09/15 01:44

    回答ありがとうございます。
    また、細かくコードを教えてくださってありがとうございます。
    教えていただいたコードを参考に実装してみたところ、importの追加や細かなエラー修正のみでほぼ同じコードの形で参考になりました。

    しかし、launchとdelayのエラーを修正できずにいます。

    Unresolved reference.
    None of following candidates is applicable because of receiver type mismatch:
    public fun CoroutineScope.launch(context: CoroutineContext = ..., start: CoroutineStart =
    ...,block: suspend CoroutineScope.()→ Unit): job defined in kotlinx.coroutines

    というエラー文が出ました。
    誠に恐縮ですが、このエラー文から考えられることはありますか?

    キャンセル

  • 2019/09/15 11:37

    app/build.gradleのdependenciesブロックに
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.1"
    の記述はあるのでしょうか?

    キャンセル

  • 2019/09/16 12:31

    確認したところ、
    1.3.1の部分が1.1.1となっていました。
    再度書き直して試してみます。

    キャンセル

  • 2019/09/16 16:42 編集

    まずlaunchやdelayが正しく使えないのは、質問者様がどこかで誤った記述をしているためなのか、そうではないのかで切り分けた方が良いと思います。まずは新規プロジェクトを作って私と全く同じコードを記述して、ノーエラーで通るのかどうか確かめてみませんか。それがノーエラーで通ることを確認できたのなら、ご自身で作ったプロジェクトには何かしら誤った記述があるということです。コルーチンについては実験的に公開されていた時期があるので、古い資料を参考にして組み込んだらうまくいかない可能性があります。今日現在の新しい情報に基づいて作るべきです。

    キャンセル

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

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

関連した質問

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