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

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

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

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

Kotlin

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

Q&A

0回答

2275閲覧

kotlin_一番近い曜日を取得_もっとスマートに?

退会済みユーザー

退会済みユーザー

総合スコア0

Android Studio

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

Kotlin

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

0グッド

1クリップ

投稿2019/10/03 02:37

編集2019/10/03 08:24

androidstudioとKotlinでアラームアプリを作っています。
ユーザー側で毎週の曜日指定(複数選択)をするつもりでした。動くようになったのですが、if構文だらけで、forも2回使うようなかなり込み入った形になってしまいました。
これを音が鳴るページにもコピペする形です。しかも音のなるresultActivityでは★の注釈文の通りに多少改変します。
なんかkotlin的なスッキリしたコードが他にあったりしますでしょうか?

var kizonYobiAry:IntArray=IntArrayOf(1,0,0,0,0,0,0,0)//[0]は1回、[1]~[7]は曜日対応 //↑実際はチェックボックス形式・わかりやすく絶対値にしてます。 //-------------------------- var youbiSa:Int=0//今日の曜日と鳴らす曜日の差1~7 btsetAlarm.setOnClickListener {   if (alonFlg == false) { //カレンダー取得 val c: Calendar = Calendar.getInstance() val yearNow: Int = c.get(Calendar.YEAR) val monthNow: Int = c.get(Calendar.MONTH) val dateNow: Int = c.get(Calendar.DAY_OF_MONTH) val youbiNow: Int = c.get(Calendar.DAY_OF_WEEK) val hourNow: Int = c.get(Calendar.HOUR_OF_DAY) val minNow: Int = c.get(Calendar.MINUTE) c.set(yearNow, monthNow, dateNow)//まず本日の日付を設定 //1回しか鳴らさない場合--------- if (kizonYobiAry[0] == 1) { if (hourNow > setHour||hourNow>=23) {//今の時間が大きい 設定時間より(それと夜23時) txtest.text = "明日ならす" c.add(Calendar.DATE, 1)//1日を加算 } else if (hourNow < setHour) {//今時間が小さい 設定時より txtest.text = "今日ならす" } else {//今の時間と設定時間が同じ場合 if (minNow > setMinute) {//今分が大きい 設定分より txtest.text = "明日ならす。同時刻・分少なくて" c.add(Calendar.DATE, 1) }else{ txtest.text="今日ならす。同時刻・分多くて(同分も)" } } }else { //-曜日指定がある場合------------------------------ //まず同じ曜日を引き出す var todayFlg=false for(i in 1..7) {//全曜日チェック if (kizonYobiAry[i] == 1) {//指定曜日発見! youbiSa = i - youbiNow//指定曜日から今日曜日を引く if (youbiSa == 0) {//指定曜日が今日曜日の場合 youbiSa = 7//来週ならすため、曜日差7日加える if (hourNow > setHour || hourNow >= 23) {//今時間が大きい 設定時間より(それと夜23時) c.add(Calendar.DATE, youbiSa)//7日を加算 txtest.text = "${youbiSa}日後ならす" } else if (hourNow < setHour) {//今時間が小さい 設定時より txtest.text = "${youbiSa}日と今日ならす"//★鳴った後はyoubiSaをadd todayFlg=true } else {//今の時間と設定時間が同じ場合 if (minNow > setMinute) {//今分が大きい 設定分より c.add(Calendar.DATE, youbiSa) txtest.text = "7日後ならす。同時刻・分少なくて"//★鳴った後はyoubiSaをadd } else { txtest.text ="${youbiSa}日と今日同時同分"//★鳴った後はyoubiSaをadd todayFlg=true } } onajiYoubiNum = i break//発見した時点でforをやめてOK } } } //------------------------------ //今週と来週で2つforにて検索(todayflgで囲ってるのはfor構文負担の軽減のため) var raisyuFlg=false if(todayFlg==false){//今日以外で for(i in (youbiNow+1)..7) {//今週=今日から土曜までを探す if (kizonYobiAry[i] == 1) {//指定曜日発見 youbiSa = i - youbiNow//指定曜日から今日曜日を引く c.add(Calendar.DATE, youbiSa) txtest.text = "今週の${youbiSa}日後にならす" break//見つけたらforをやめてOK } if(i==7){//見つからない場合は来週探す raisyuFlg=true } } // if(raisyuFlg){ for(i in 1..(youbiNow-1)) {//来週の予定を検索 if (kizonYobiAry[i] == 1) {//指定曜日発見 youbiSa = (7 - youbiNow) + i//(カレンダー的数え方。i=指定日・(土曜-今日曜日)+指定日 c.add(Calendar.DATE, youbiSa) txtest.text = "来週の${youbiSa}日後にならす" break//見つけたらforをやめてOK } } } } } //--↑↑↑↑resultにもコピペ★対応↑↑↑↑-------------------------------------- //↓は[はじめてのAndroidプログラミング 第4版|金田 浩明]のソース↓ dateText.text = android.text.format.DateFormat.format("yyyy/MM/dd", c) val date = ("${dateText.text} ${timeText.text}").toDate()//toDate関数は別途一番下で作る when { date != null -> {        val calendar = Calendar.getInstance() calendar.time = date setAlarmManager(calendar)// //Toast文章の微変更 Toast.makeText(this,"アラームセット",Toast.LENGTH_SHORT ) .show() } else -> { Toast.makeText(this, "設定エラー", Toast.LENGTH_SHORT) .show() } } } }

======
一番近い曜日の日が来たらアラームを鳴らすと同時に、getSharedPreferencesに保存した文字列をIntArray配列にしなおし、再度BroadCastReceiverを継承したアラームのクラスに一番近い曜日を入れて、数珠つなぎで毎週指定曜日を鳴らすようなことを考えています。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問