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

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

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

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

Q&A

解決済

2回答

1615閲覧

Android アラーム 画面遷移

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2018/09/19 07:34

編集2018/10/29 01:35
public static final String ALARM_TIME = "alarm_time"; Button button; ToggleButton alarmButton; Calendar alarmCalendar = Calendar.getInstance(); PreferenceUtil pref; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button sendButton = findViewById(R.id.nextButton); sendButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(getApplication(), SubActivity.class); startActivity(intent); } }); pref = new PreferenceUtil(this); setupViews(); setListeners(); } private void setupViews() { button = (Button) findViewById(R.id.button); alarmButton = (ToggleButton) findViewById(R.id.AlarmButton); long alarmTime = pref.getLong(ALARM_TIME); if (alarmTime != 0) { DateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH:mm"); Date date = new Date(alarmTime); button.setText(df.format(date)); alarmButton.setChecked(true); } }

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

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

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

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

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

guest

回答2

0

ベストアンサー

おそらく、AlarmCheckActivityと言うのが2番目の画像のActivityでAlarmManagerによって指定した時間がくるとその画面に飛ばすような仕組みになっているようですかね?

AlarmCheckActivityでどのように難易度を設定させて問題を出しているのかはわかりませんが、値をSharedPreferencesに持たせてそれによって難易度を判定すると良いかと思います。

SharedPreferencesとはアプリ内に値を保持しておくような仕組みです(設定値などを保存しておくのに使うので今回のケースでもそれが良いと思います)
ファイルに値を保存するものなので画面間で特に値をやり取りなどする必要がなく、どこからでもその値を参照・保存できます。

今回のアプリで言うと、SubActivityで難易度をSharedPreferencesに保存して、AlarmCheckActivityでその値を参照するようにすれば良いかと思います。

SharedPreferencesについては検索すると使い方や仕組みなどが色々と出てくるのとそこまで難しくはないので大丈夫だと思います。
基本的なSharedPreferencesの使い方

難易度については大丈夫そうかな?と思いますが、スヌーズについてはどのように実装しているのかがわからないので(AlarmManagerにそのようなものがある?自前実装?)また別の問題が発生しそうであればコメントください。

また上記、具体的な実装方法などがわからない場合には同じくコメントください。
(MainActivity以外にも全体のコードがあると回答しやすいです。全体コードを貼ると長くなりそうであればgithubなどにソースをあげるでも良いかと思います。)

======コメントへの回答追記

参考用に書かせていただいたサイトに保存と読み出し両方とも書かれているのでそのまま流用させていただきます。

まず、保存についてですが設定画面で難易度を選ぶとSharedPreferencesに値が保存されるようにします。
難易度のチェックマークが押されたときに保存か、もしくはセットボタンなどを用意してそれが押されたときに保存でも良いと思います。

SubActivity

1// 例えばチェックマーク低が押されたとき 2SharedPreferences data = getSharedPreferences("DataSave", Context.MODE_PRIVATE); 3SharedPreferences.Editor editor = data.edit(); 4editor.putInt("LevelSave", 1); // 1:低、2:中、3:高の3段階があるとする。 5editor.apply();

次に取得について、AlarmCheckActivityで実際に問題が設定される場所でSharedPreferencesから値を取得します。

AlarmCheckActivity

1// onCreateなどで値を取得する 2SharedPreferences data = getSharedPreferences("DataSave", Context.MODE_PRIVATE); 3int Level = data.getInt("LevelSave", 1); // 第2引数は値がなかったときのデフォルト 4 5// レベル別で設定する問題を変える 6// 分岐の書き方は好きなかんじで。 7if(level == 1){ 8 // 低の問題 9} 10 11if(level == 2){ 12 // 中の問題 13} 14 15if(level == 3){ 16 // 高の問題 17}

上記でわからなさそうであればまたコメントください。

======コメントへの回答追記2

例えば今、

Random rand = new Random(); randnum = rand.nextInt(10);

としてランダムに10問の中から選んでますよね。これを

randnum = Level;

としてやると、低、中、高によってそれぞれの問題に変わると思います。
さらに言うと低、中、高の問題をどのように定義してあげたいのかがわからないので例えばになってしまいますが

Random rand = new Random(); randnum = rand.nextInt(10); if(level == 1){ // 低の問題 if(randnum==0){ textView.setText("11×11"); }else if(randnum==1){ textView.setText("22×22"); } // 問題省略 } if(level == 2){ // 中の問題 if(randnum==0){ textView.setText("111×111"); }else if(randnum==1){ textView.setText("222×222"); } // 問題省略 } if(level == 3){ // 高の問題 if(randnum==0){ textView.setText("1111×1111"); }else if(randnum==1){ textView.setText("2222×2222"); } // 問題省略 }

このようにすると低、中、高によってランダムな10問が変わるようなものになるかと思います。

問題をどのように設定したいか?によって変わってくると思いますので
とりあえずはSharedPreferencesに設定した値を読み込んで、出てくる問題が変わると言う部分に主眼を置いて書かせていただきました。

手法がわかればあとどのように書くかは個人の主観によるものであると思いますので本件では具体的な話はしないでおきます。(もちろん、良い書き方と言うのは存在すると思いますが、この質問に対する本質ではないので必要であれば別途質問をあげるか、もしくは勉強を進めると良いと思います。私個人は書き方に対して正しいと意見するほどの能力はないと考えていますので差し控えさせていただきます。)

======コメントへの回答追記3
SubActivityの「// 例えばチェックマーク低が押されたとき」と言うのはあくまでも例えの話だったのでそのまま書けば良いわけではなく、チェックマーク低ボタンがあるとしたときに、そのonClickに書いて欲しいと言う意味でした。今のままのコードだと画面が表示されたときに必ず1が保存されるだけとなります。
サンプルとして「row_button、normal_button、high_button」があったときに、それぞれのonClickで1,2,3が保存されるように書いてみました。
OnClickListenerについてはその上の方のreturnButton(戻るボタン)で実装していると思いますので理解しているものと思っています。

不明点あればコメントください。

======回答修正 2018/10/17 17:00
取り急ぎ、SubActivityのバグを修正しました(私のコードのせいでした)
コピペしていたので、rowButton、normaroButton、highButtonにsetOnClickListenerしようとするべきであった部分が全てreturnButtonへのsetOnClickListenerになってしまっていましたので下記コードを修正しました。

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sub); Button returnButton = findViewById(R.id.return_button); returnButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); // 低ボタンが押された時 Button rowButton = findViewById(R.id.row_button); rowButton.setOnClickListener(new View.OnClickListener() { // returnButtonになっていた @Override public void onClick(View v) { SharedPreferences data = getSharedPreferences("DataSave", Context.MODE_PRIVATE); SharedPreferences.Editor editor = data.edit(); editor.putInt("LevelSave", 1); // 1:低、2:中、3:高の3段階があるとする。 editor.apply(); } }); // 中ボタンが押された時 Button normalButton = findViewById(R.id.normal_button); normalButton.setOnClickListener(new View.OnClickListener() { // returnButtonになっていた @Override public void onClick(View v) { SharedPreferences data = getSharedPreferences("DataSave", Context.MODE_PRIVATE); SharedPreferences.Editor editor = data.edit(); editor.putInt("LevelSave", 2); // 1:低、2:中、3:高の3段階があるとする。 editor.apply(); } }); // 高ボタンが押された時 Button highButton = findViewById(R.id.high_button); highButton.setOnClickListener(new View.OnClickListener() { // returnButtonになっていた @Override public void onClick(View v) { SharedPreferences data = getSharedPreferences("DataSave", Context.MODE_PRIVATE); SharedPreferences.Editor editor = data.edit(); editor.putInt("LevelSave", 3); // 1:低、2:中、3:高の3段階があるとする。 editor.apply(); } }); }

PlaySoundActivityで問題が出ない件については、ランダムで問題を出すように以下のように書いたと思いますが
このままだとどこにも入らなかった場合にはsetTextされないので何も表示されていない状態になります。

if(Level == 1){ // 低の問題 if(randnum==0){ textView.setText("11×11"); }else if(randnum==1){ textView.setText("22×22"); } // 問題省略 }

とりあえず、きちんとした問題のロジックを考えるまでは暫定的に以下のようにしておくと良いかと思います。

if(Level == 1){ // 低の問題 if(randnum==0){ textView.setText("11×11"); }else if(randnum==1){ textView.setText("22×22"); }else{ textView.setText("33×33"); } } if(Level == 2){ // 低の問題 if(randnum==0){ textView.setText("111×111"); }else if(randnum==1){ textView.setText("222×222"); }else{ textView.setText("333×333"); } } if(Level == 3){ // 低の問題 if(randnum==0){ textView.setText("1111×1111"); }else if(randnum==1){ textView.setText("2222×2222"); }else{ textView.setText("3333×3333"); } }

以上でいただいた問題については解決するかと思います。
不明点あればコメントください。

投稿2018/10/04 06:41

編集2018/10/17 08:15
razuma

総合スコア1313

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

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

退会済みユーザー

退会済みユーザー

2018/10/05 01:39

回答ありがとうございます。 はい、その通りです。時間を設定し、その時間がきたらAlarmCheckActivityに移動します。計算式は、自分で作成した10問をif文でランダムで出題するようにしています。 SharedPreferencesで参考してやってみます。 GitHubでまとめるように、やってみたいと思います。
razuma

2018/10/05 01:42

とりあえず手を動かせる状態になったのであれば幸いです。 不明点などが出てにっちもさっちもいかなくなったらコメントくださいませ。
退会済みユーザー

退会済みユーザー

2018/10/05 04:35 編集

設定画面で、難易度を選び、計算式の難易度によって出題する問題を変えたいですが、どんなコードを書くと適切ですか? SharedPreferencesをネットで調べたんですが、ほぼ値を保存するばかりで理解できませんでした。
退会済みユーザー

退会済みユーザー

2018/10/08 01:20 編集

SharedPreferences data = getSharedPreferences("DataSave", Context.MODE_PRIVATE); int Level = data.getInt("LevelSave", 1); // 第2引数は値がなかったときのデフォルト randnum = Level; if(Level == 1){ // 低の問題 if(randnum==0){ textView.setText("11×11"); }else if(randnum==1){ textView.setText("22×22"); } // 問題省略 } if(Level == 2){ // 中の問題 if(randnum==0){ textView.setText("111×111"); }else if(randnum==1){ textView.setText("222×222"); } // 問題省略 } if(Level == 3){ // 高の問題 if(randnum==0){ textView.setText("1111×1111"); }else if(randnum==1){ textView.setText("2222×2222"); } // 問題省略 } stop = (Button) findViewById(R.id.stop); stop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (randnum == 0 && editText.getText().toString().equals("121")) { stopsound(); textView3.setText("正解!!"); finish(); } else if (randnum == 1 && editText.getText().toString().equals("484")) { stopsound(); textView3.setText("正解!!"); finish(); } } }); SubActivityにSharedPreferencesを書き、Alarmcheckで難易度ごとに計算式を出そうと書きました。しかし、activity_sub.xml(レイアウト画面)で例えば、難しいのradiobuttonを押しても、簡単の計算式が出題してしまいます。原因わかりますか? 調べて、考えてみたんですが、解決できなかったので改めて質問しました。 差し支えなければ、ご教示お願い致します。
razuma

2018/10/16 01:38

難しいのチェックボックスを押した時にSharedPreferencesにきちんと「3」が保存されるようになっていますでしょうか?SubActivityにて設定値を保存してる箇所のコードを見せていただきたいです。
退会済みユーザー

退会済みユーザー

2018/10/17 00:50

SubActivity @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sub); Button returnButton = findViewById(R.id.return_button); returnButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); // 例えばチェックマーク低が押されたとき SharedPreferences data = getSharedPreferences("DataSave", Context.MODE_PRIVATE); SharedPreferences.Editor editor = data.edit(); editor.putInt("LevelSave", 1); // 1:低、2:中、3:高の3段階があるとする。 editor.apply(); } SubActivityは以上のコードで書きました
退会済みユーザー

退会済みユーザー

2018/10/17 03:20

SharedPreferences data = getSharedPreferences("DataSave", Context.MODE_PRIVATE); final int Level = data.getInt("LevelSave", 1); // 第2引数は値がなかったときのデフォルト randnum = Level; textView3 = findViewById(R.id.textView3); textView = findViewById(R.id.textView2); editText=findViewById(R.id.editText); if(Level == 1){ // 低の問題 if(randnum==0){ textView.setText("11×11"); }else if(randnum==1){ textView.setText("22×22"); } // 問題省略 } if(Level == 2){ // 中の問題 if(randnum==0){ textView.setText("111×111"); }else if(randnum==1){ textView.setText("222×222"); } // 問題省略 } if(Level == 3){ // 高の問題 if(randnum==0){ textView.setText("1111×1111"); }else if(randnum==1){ textView.setText("2222×2222"); } // 問題省略 } final Intent intent = new Intent(this, SubActivity.class); if(count==10){ stopsound(); } stop = (Button) findViewById(R.id.stop); stop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if(Level == 1) { // 低の問題 if (randnum == 0 && editText.getText().toString().equals("121")) { stopsound(); textView3.setText("正解!!"); finish(); } else if (randnum == 1 && editText.getText().toString().equals("484")) { stopsound(); textView3.setText("正解!!"); finish(); } if(Level == 2) { // 低の問題 if (randnum == 0 && editText.getText().toString().equals("121")) { stopsound(); textView3.setText("正解!!"); finish(); } else if (randnum == 1 && editText.getText().toString().equals("484")) { stopsound(); textView3.setText("正解!!"); finish(); } } } } }); } SubActivityは、教えていただいた通りに書きました。しかし、実行してみるとSubActivityで書いたreturnButtonをクリックしても戻れなくなり、AlramCheckActivityで上記のように書きましたが、計算式が出てこなくなりました。原因特定するように直してみますが、もしわかるようでしたらぜひ力になってほしいです。
razuma

2018/10/17 04:38

コードを大量に書くときは一気に書くのではなく、動く状態を保ちながら書くようにしましょう。 とりあえず、正常に動く状態まで戻してそこに少しづつコードを足していくような感じで書くと良いと思います。 プロジェクト全体のソースがないのでどこが悪いのか特定するのが難しいので解決できなさそうであればまたコメントください。(または、githubなど全てが見られる場所にソースをあげていただけるのであればデバッグします)
退会済みユーザー

退会済みユーザー

2018/10/17 07:28 編集

Githubにまとめました。 こんな感じでよろしいでしょうか。 https://github.com/kimukou1205/MyAlarm4 一行丁寧にやってみます。 *** 追記:すみません。間違って余計なActivityが入っているのをアップロードしてしましました。AlarmCheckActivity.javaとMainActivityとPlaySoundActivityとPlaySoundServiceとSecondActivityとSubActivityのみです。
razuma

2018/10/17 08:19

githubへのアップありがとうございます。 内容について確認して回答させていただきましたのでご確認をお願いいたします。
退会済みユーザー

退会済みユーザー

2018/10/18 00:28

解決できました!本当にありがとうございます!
razuma

2018/10/18 00:31

はい。アプリ作りがんばってください。
退会済みユーザー

退会済みユーザー

2018/10/18 01:27

すみません。問題が起きてしまいました。例えば、 if(Level == 1){ // 低の問題 if(randnum==0){ textView.setText("11×11"); }else if(randnum==1){ textView.setText("22×22"); } ですと、Level==1だからかrandom==1の問題しか表示されず、ランダムな計算式が出題できないですが、原因わかりますか?
razuma

2018/10/18 02:15

今暫定的に //Random rand = new Random(); // randnum = rand.nextInt(10); randnum = Level; としてしまっていると思いますので、コメントアウトの部分を元に戻してrandnumをランダムにしてあげてください。 Random rand = new Random(); randnum = rand.nextInt(10); // randnum = Level;
退会済みユーザー

退会済みユーザー

2018/10/18 02:26

なるほど!無事解決できました。 また今後もよろしくお願いします。
guest

0

質問の書き方についてであり、回答ではありません、、、申し訳ないです。
自分が質問をして回答をもらえる時のことを参考までに記載します。

〇何を聞きたいかが明確
ふわっとした質問をした時は、答えてもらえないことが多い。
さらにはマイナス評価までつけられてしまうことがあります。
【アラーム解除の計算式の難易度を変更】とありますが、具体的にどのような仕様にしたいかを記載したほうがよろしいかと思われます、、、

〇コードを記載するときは下図の機能を用いて挿入
イメージ説明

投稿2018/09/30 08:51

akawo

総合スコア23

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

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

退会済みユーザー

退会済みユーザー

2018/10/01 00:30

指摘ありがとうございます。初心者ですので教えていただき、感謝しています。 難易度の件は、画像のイメージのほうを参考して作成したいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問