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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

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

Kotlin

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

Q&A

解決済

1回答

2313閲覧

時計(TimePickerDialog)に前回の時間を入れたい[kotlin]

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

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

Android Studio

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

Kotlin

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

0グッド

1クリップ

投稿2019/09/30 05:50

編集2019/09/30 07:44

実現したいこと

目覚まし時計を課題で作ってます。一通りできたのですが、TimePickerDialogの時間が毎回現時刻に戻って使いにくいので、
「前回設定した時間にする」というのをしようとしています。
元のコードは「はじめてのandroidプログラミング 第4版」(kotlin対応)のchapter11です。

###やろうとした方法とエラー
時間設定時に時間と分をgetSharedPreferencesでキーで保存し、そこからTimePickerDialogへ数字を
入れようとしているのですが、getSharedPreferencesが赤字になってコードが入りません。
(importかと思いましたが、そちら入れてもエラー。別途Dialog.ktのせいでしょうか?)

//===やろうとしてたコード========

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val dataSave: SharedPreferences = getSharedPreferences("dataSave", Context.MODE_PRIVATE)
val editor = dataSave.edit()
val tmpH:Int =dataSave.getInt("TOKEI_H", 0)
val tmpM:Int =dataSave.getInt("TOKEI_M",0)
val hour:Int =tmpH
val minute:Int = tmpM
return TimePickerDialog(context,this,hour,minute,true)
}

//==============================

「前回の時間を入れる」方法をお教えいただけませんでしょうか?

ちなみに書籍のサンプルコードがこちらにあり、zipの中のchapter11の
MyAlarmClockのフォルダに著者のソースファイルが入ってます。
https://www.sbcr.jp/support/15129/

javaのような言語は初めてで、javascirptでwebのもぐら叩きゲーム作る程度の初心者です。
急にハードルあがって参ってますが、お教えいただけたら幸いです。

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

AndroidStudio3.5
API21以上
kotlin
作業OS:win10Home

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

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

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

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

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

guest

回答1

0

ベストアンサー

getSharedPreferencesが赤字になってコードが入りません。
(importかと思いましたが、そちら入れてもエラー。別途Dialog.ktのせいでしょうか?)

getSharedPreferencesContextActivityのメソッドですので、それらから呼び出さなければなりません。Javaなら getContext、あるいはgetActivityメソッドを使いますが、Kotlinですと以下のようになるかと思います。

SharedPreferencesからgetIntして、putIntで保存するサンプルです。質問者さんのコードで実際にどこで保存するかはそれなりにテーマかと思いましたので、読み出しと保存の例に留めておきます。

Kotlin

1// Javaなら getContext().getSharedPreferences() 2// val pref: SharedPreferences? = context?.getSharedPreferences("dataSave", Context.MODE_PRIVATE) 3 4// Javaなら getActivity().getSharedPreferences() 5val pref: SharedPreferences? = 6 activity?.getSharedPreferences("dataSave", Context.MODE_PRIVATE) 7if (pref != null) { 8 val c = Calendar.getInstance() 9 val hour = pref.getInt("TOKEI_H", c.get(Calendar.HOUR_OF_DAY)) 10 val minute = pref.getInt("TOKEI_M", c.get(Calendar.MINUTE)) 11 12 val editor = pref.edit() 13 editor.putInt("TOKEI_H", hour) 14 editor.putInt("TOKEI_M", minute) 15 editor.apply() 16}

尚、Contextを使うべきかActivityを使うべきか実は少しデリケートな部分があるのですが、今回の例では大差無いと判断して Activityを使いました。気に留めておき、余裕ができたら改めて調べてみてください。


追記しました:2019-10-01 11:46

TimePickerDialogの表示で[OK]ボタンを押したときに指定した時:分をもってonTimeSetが呼ばれるので、その時にSharedPreferencesに保存するようにしたコードの例です。

Kotlin

1 override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { 2 val c = Calendar.getInstance() 3 var hour: Int = c.get(Calendar.HOUR_OF_DAY) 4 var minute: Int = c.get(Calendar.MINUTE) 5 val pref: SharedPreferences? = 6 activity?.getSharedPreferences("dataSave", Context.MODE_PRIVATE) 7 if (pref != null) { 8 val c = Calendar.getInstance() 9 hour = pref.getInt("TOKEI_H", hour) 10 minute = pref.getInt("TOKEI_M", minute) 11 Log.d("MyAlarmClock", "onCreateDialog#1: hour=$hour, minute=$minute") 12 } 13 return TimePickerDialog(context, this, hour, minute, true) 14} 15 16override fun onTimeSet(view: TimePicker?, hourOfDay: Int, minute: Int) { 17 Log.d("MyAlarmClock", "onTimeSet#1: hour=$hourOfDay, minute=$minute") 18 19 val pref: SharedPreferences? = 20 activity?.getSharedPreferences("dataSave", Context.MODE_PRIVATE) 21 if (pref != null) { 22 val editor = pref.edit() 23 editor.putInt("TOKEI_H", hourOfDay) 24 editor.putInt("TOKEI_M", minute) 25 editor.apply() 26 27 // 保存できたことを確認してみる 28 // デフォルト値を取得していないことを確認するため、123, 456 をセットしてgetInt 29 val hourTemp = pref.getInt("TOKEI_H", 123) 30 val minuteTemp = pref.getInt("TOKEI_M", 456) 31 Log.d("MyAlarmClock", "onTimeSet#2: saved: hour=$hourTemp, minute=$minuteTemp") 32 } 33 34 listener?.onSelected(hourOfDay, minute) 35}

投稿2019/09/30 10:19

編集2019/10/01 02:53
dodox86

総合スコア9183

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

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

退会済みユーザー

退会済みユーザー

2019/10/01 01:21 編集

ありがとうございます。が、お教えいただいたコードでは動かず、最後の行の}に赤線が出ます。 {}がちゃんとできてないという警告です!?Runさせるとこのとおり -------------- a 'return' expression required in a function with a block body (' ... ') ------------ 自分のコードではなく、まんま書籍のchapter11をはりつけてもダメで、実端末でも同じ状態です。 多少リスクをおかし、if(pref!=null){}を消し、 val hour: Int = pref!!.getInt("TOKEI_H", c.get(Calendar.HOUR_OF_DAY)) val minute: Int = pref!!.getInt("TOKEI_M", c.get(Calendar.MINUTE)) としたりもしたのですが、ビルドは通ってもgetIntが動きません。(デフォルトの現在時刻を入れるのみ) が、別途activityにテストテキスト作って testtext.text="${dataHozon.getInt("TOKEI_H", 0)}" と入れると保存された時間が表示されます。pref.putIntは動いている模様です。 他に解決法ありませんでしょうか?
dodox86

2019/10/01 01:23

どのように適用させたか分からないのですが、ご自分のコード用に修正してもらわないと。{}がちゃんとできていないというのはブロックの対応ができていないのですよね。また、getInt()は取得だけです。putInt、applyしないと。
退会済みユーザー

退会済みユーザー

2019/10/01 02:01 編集

override fun onCreateDialog(savedInstanceState: Bundle?):Dialog { val pref: SharedPreferences? = activity?.getSharedPreferences("dataSave", Context.MODE_PRIVATE) if(pref != null) { val hour:Int = pref.getInt("TOKEI_H", 7) val minute:Int = pref.getInt("TOKEI_M", 0) val editor = pref.edit() editor.putInt("TOKEI_H", hour) editor.putInt("TOKEI_M", minute) editor.apply() } return TimePickerDialog(context, this, hour, minute, true) } --------------------------------- すみません、returnをifの中にに入れていた間違いでした。 で、上記のように書くと、今度はhourとminuteに数値が入らず赤文字エラーが出ます。
dodox86

2019/10/01 02:40

いや、val hour: Int はカッコ内で宣言されているのですからそのカッコ内だけで有効です。それじゃダメです。中身を理解した上で修正していただかないと。
dodox86

2019/10/01 02:48

追記したのでご参照ください。
退会済みユーザー

退会済みユーザー

2019/10/01 04:22 編集

ありがとうございます。知識が「javascirpt」なので目からウロコです。 1.カッコ内で宣言 if構文の中の変数は外で使えずと知らず、override fun...と関数宣言した直下にvar tmphourみたいな感じで作り、その後if構文内でtmphour=hourをしたらビルドとおりました。勉強なりました。が、記録はされませんでした。 2. ご想像通りgetIntのデフォルト値しかでなかったので、タイミングの問題かと思い、あきらめて「アラームをセットする」ボタンでputIntを入れようとしてたのですが、これでキメの細かいアラームの設定ができそうです。 ありがとうございました。
dodox86

2019/10/01 03:55

とりあえずお役に立てたようで良かったです。他のプログラミング言語を知っているとその知識で新しい言語を捉えてしまいがちなので無理からぬことだと思いますが、新しく覚えることが多いと思うので、Kotlinのプログラミング言語としての基本と、Androidプログラミングとは区別して考えると良いと思います。私もKotlinは少ししか使ったことがありませんので、たまに使うとかなりまごつきます。
退会済みユーザー

退会済みユーザー

2019/10/01 04:18

それはそれとして、getSharedPreferencesはActivityのメソッドなのに、?つけたら通るのがちょっと笑ってしまいましたw
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問