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

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

詳細はこちら
Android Studio

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

Kotlin

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

Q&A

解決済

1回答

1760閲覧

kotlinのandroid開発でアプリが落ちる

ryu-sei

総合スコア12

Android Studio

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

Kotlin

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

0グッド

1クリップ

投稿2021/01/16 06:10

編集2021/01/16 09:57

前提・実現したいこと

seekbarとedittextでバイブレーションの振動の強さと振動の継続時間を調整した後、startボタンを押したらバイブレーションが実行されるアプリを作ろうとしています。
start.setOnClickListenerのループで一定時間振動させた後、一定時間静止させる。さらにそれを繰り返すということを行いたいです。
repeat文の使い方が間違っているのかと思うのですが改善方法がわかりません。

発生している問題・エラーメッセージ

startボタンを押してバイブレーションが実行されるまではいいのですがその後アプリが落ちてしまいます。 あとおそらく静止させる部分のループがうまく作動していません。

該当のソースコード

kotlin

1import android.content.Context 2import android.os.Build 3import android.os.Bundle 4import android.os.VibrationEffect 5import android.os.Vibrator 6import android.view.KeyEvent 7import android.view.View 8import android.widget.EditText 9import android.widget.SeekBar 10import android.widget.TextView 11import androidx.annotation.RequiresApi 12import androidx.appcompat.app.AppCompatActivity 13import kotlinx.android.synthetic.main.activity_main.* 14 15class MainActivity : AppCompatActivity(), Runnable, TextView.OnEditorActionListener, View.OnFocusChangeListener, SeekBar.OnSeekBarChangeListener { 16 17 var gTime:Double = 0.5 18 var gHz = 100 19 var eTime: EditText? = null 20 var eHz: EditText? = null 21 var sTime: SeekBar? = null 22 var sHz: SeekBar? = null 23 24 @RequiresApi(Build.VERSION_CODES.O) 25 override fun onCreate(savedInstanceState: Bundle?) { 26 super.onCreate(savedInstanceState) 27 setContentView(R.layout.activity_main) 28 29 eTime = this.findViewById(R.id.eTime) as EditText? 30 sTime = this.findViewById(R.id.sTime) as SeekBar? 31 eTime!!.setOnEditorActionListener(this) 32 eTime!!.onFocusChangeListener = this 33 sTime!!.setOnSeekBarChangeListener(this) 34 eHz = this.findViewById(R.id.eHz) as EditText? 35 sHz = this.findViewById(R.id.sHz) as SeekBar? 36 eHz!!.setOnEditorActionListener(this) 37 eHz!!.onFocusChangeListener = this 38 sHz!!.setOnSeekBarChangeListener(this) 39 40 setupSeekBart() 41 setupSeekBarh() 42 43 start.setOnClickListener { 44 val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator 45 repeat(100) {//ここから 46 repeat(10) { 47 val vibrationEffect = VibrationEffect.createOneShot(gTime.toLong(), gHz) 48 vibrator.vibrate(vibrationEffect) 49 } 50 repeat(10){ 51 val vibrationEffect = VibrationEffect.createOneShot(gTime.toLong(), 0) 52 vibrator.vibrate(vibrationEffect) 53 } 54 }//ここまで 55 } 56 } 57 58 override fun onEditorAction(v: TextView, actionId: Int, event: KeyEvent?): Boolean { 59 try { 60 var value = v.text.toString().toInt() 61 value = 0.coerceAtLeast(100000.coerceAtMost(value)) 62 when (v.id) { 63 R.id.eTime -> sTime!!.progress = value 64 R.id.eHz -> sHz!!.progress = value 65 else -> return false 66 } 67 } catch (e: Exception) { 68 } 69 return false 70 } 71 72 override fun onFocusChange(v: View, hasFocus: Boolean) { 73 try { 74 var value = (v as TextView).text.toString().toInt() 75 value = 0.coerceAtLeast(10000.coerceAtMost(value)) 76 when (v.getId()) { 77 R.id.eTime -> sTime!!.progress = value 78 R.id.eHz -> sHz!!.progress = value 79 else -> return 80 } 81 } catch (e: Exception) { 82 } 83 } 84 85 override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { 86 } 87 override fun onStartTrackingTouch(seekBar: SeekBar) { 88 } 89 override fun onStopTrackingTouch(seekBar: SeekBar) { 90 } 91 92 private fun setupSeekBart() 93 { 94 sTime?.setOnSeekBarChangeListener( 95 object : SeekBar.OnSeekBarChangeListener { 96 override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { 97 when (seekBar.id) { 98 R.id.sTime -> eTime!!.setText(String.format("%1$d", progress)) 99 else -> return 100 } 101 gTime = eTime!!.text.toString().toDouble() 102 gTime/=1000 103 } 104 105 override fun onStartTrackingTouch(seekBar: SeekBar) { 106 } 107 108 override fun onStopTrackingTouch(seekBar: SeekBar) { 109 } 110 }) 111 } 112 113 114 115 private fun setupSeekBarh() 116 { 117 sHz?.setOnSeekBarChangeListener( 118 object : SeekBar.OnSeekBarChangeListener { 119 override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { 120 when (seekBar.id) { 121 R.id.sHz -> eHz!!.setText(String.format("%1$d", progress)) 122 else -> return 123 } 124 gHz = eHz!!.text.toString().toInt() 125 } 126 127 override fun onStartTrackingTouch(seekBar: SeekBar) { 128 } 129 130 override fun onStopTrackingTouch(seekBar: SeekBar) { 131 } 132 }) 133 } 134 135 override fun run() { 136 TODO("Not yet implemented") 137 } 138}

試したこと

ここからここまでと書いてあるところを
val vibrationEffect = VibrationEffect.createOneShot(gTime.toLong(), gHz)
vibrator.vibrate(vibrationEffect)
に変えた場合はアプリが落ちませんでした。
落ちた原因はわからなくて困っています。

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

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

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

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

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

1T2R3M4

2021/01/16 07:59

落ちる原因とか調べたことを追記していただけませんか。
guest

回答1

0

自己解決

Stopボタンを追加してここからここまでと書いてある部分を次のように変更して手を打ちました。

kotlin

1start.setOnClickListener { 2 val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator 3 val vibrationEffect = VibrationEffect.createWaveform(longArrayOf(gTime.toLong(), gTime.toLong()), intArrayOf(gHz, 0), 0) 4 vibrator.vibrate(vibrationEffect) 5 } 6 stop.setOnClickListener{ 7 val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator 8 vibrator.cancel() 9 }

投稿2021/01/17 08:33

ryu-sei

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問