前提・実現したいこと
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)
に変えた場合はアプリが落ちませんでした。
落ちた原因はわからなくて困っています。
落ちる原因とか調べたことを追記していただけませんか。
回答1件
あなたの回答
tips
プレビュー