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

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

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

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

Q&A

解決済

1回答

2169閲覧

TimePickerで時間設定した時間をMainActivityで表示させるには

despaine198

総合スコア7

Android

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

0グッド

0クリップ

投稿2020/04/23 12:28

カレンダーアプリを作っていまして、時間の入力をTimePickerを使っています。
そのTimePickerで入力した時間を保存して、MainActivityで表示させると言った処理がどうしても上手くいきません。時間入力をする部分は、MainAcitivity.javaからSchedule.javaに画面遷移するように処理しています。
どなたかわかる方いらっしゃいましたらご回答よろしくお願いいたします。

MainActivity.java

1package com.example.calendar; 2 3import androidx.appcompat.app.AppCompatActivity; 4import androidx.fragment.app.DialogFragment; 5 6import android.app.DatePickerDialog; 7import android.app.TimePickerDialog; 8import android.content.Intent; 9import android.content.SharedPreferences; 10import android.os.Bundle; 11import android.view.View; 12import android.widget.DatePicker; 13import android.widget.TextView; 14import android.widget.TimePicker; 15 16 17import java.util.Calendar; 18import java.util.Locale; 19 20 21public class MainActivity extends AppCompatActivity { 22 private TextView textView; 23 @Override 24 protected void onCreate(Bundle savedInstanceState) { 25 super.onCreate(savedInstanceState); 26 setContentView(R.layout.activity_main); 27 TextView TimeLabel = findViewById(R.id.TimeLabel); 28 29 30 31 32 Calendar cal = Calendar.getInstance(); 33 int year = cal.get(Calendar.YEAR); //西暦を取得 34 int month = cal.get(Calendar.MONTH); //何月かを取得 35 int day = cal.get(Calendar.DAY_OF_MONTH);//何日かを取得 36 37 int hour=cal.get(Calendar.HOUR_OF_DAY); 38 int minute=cal.get(Calendar.MINUTE); 39 40 DatePicker datePicker = findViewById(R.id.datePicker1); 41 datePicker.init(year, month,day , new DatePicker.OnDateChangedListener() { 42 @Override 43 public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 44 // 日付を選択した時に実行される部分 45 Intent intent = new Intent(MainActivity.this, Schedule.class); 46 startActivity(intent); 47 } 48 }); 49 int day_Hour = getIntent().getIntExtra("HOUR", hour); 50 //int day_Minute = getIntent().getIntExtra("MINUTE", minute); 51 52 SharedPreferences sharedPreferences = getSharedPreferences("HOUR", MODE_PRIVATE); 53 int TimeSet = sharedPreferences.getInt("HOUR", 0); 54 55 if(day_Hour>=0) { 56 TimeLabel.setText("始まる時刻-"+ day_Hour); 57 58 SharedPreferences.Editor editor = sharedPreferences.edit(); 59 editor.putInt("HOUR", day_Hour); 60 editor.apply(); 61 62 } else { 63 //TimeLabel.setText("始まる時刻-" + hour+":"+minute); 64 65 } 66 } 67} 68

Schedule.java

1package com.example.calendar; 2 3import androidx.appcompat.app.AppCompatActivity; 4 5import android.app.TimePickerDialog; 6import android.content.Intent; 7import android.content.SharedPreferences; 8import android.os.Bundle; 9import android.view.View; 10import android.widget.TimePicker; 11import android.widget.Toast; 12 13import java.util.Calendar; 14 15public class Schedule extends AppCompatActivity { 16 17 @Override 18 protected void onCreate(Bundle savedInstanceState) { 19 super.onCreate(savedInstanceState); 20 setContentView(R.layout.activity_schedule); 21 22 23 24 final Calendar calendar=Calendar.getInstance(); 25 final int hour=calendar.get(Calendar.HOUR_OF_DAY); 26 final int minute=calendar.get(Calendar.MINUTE); 27 28 final TimePickerDialog timePickerDialog = new TimePickerDialog(this, 29 new TimePickerDialog.OnTimeSetListener() { 30 @Override 31 public void onTimeSet(TimePicker view, int hourOfDay, int minuteOfDay) { 32 Intent intent = new Intent(getApplicationContext(), MainActivity.class); 33 intent.putExtra("HOUR",hourOfDay); 34 //intent.putExtra("MINUTE", minuteOfDay); 35 finish(); 36 } 37 }, hour, minute, true); 38 timePickerDialog.show(); 39 } 40} 41

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

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

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

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

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

jimbe

2020/04/23 16:29

> どうしても上手くいきません どうすれば良いと考えてどのようなコードを書きどのような結果になって「どうしても」となったのでしょうか.
hoshi-takanori

2020/04/23 18:04

MainActivity から別の Activity を呼び出して、結果を受け取りたいなら、startActivity じゃなくて startActivityForResult を使って onActivityResult で結果を受け取る必要があります。 もっとも、カレンダーアプリってことは、時刻をひとつだけ受け取れば済むわけじゃなくて、複数の予定を管理したいのではありませんか?
despaine198

2020/04/24 05:08

ご回答ありがとうございます。 最終的には複数個の予定できるようにと考えていますが、今のところ一つだけ試して上手くいければ複数個できるようにしていこうという考えで行っています。
guest

回答1

0

ベストアンサー

質問欄にもありますが、開いたActivityを閉じた時に元Activityで値を受け取りたい場合にはstartActivityForResultを使用します。

startActivityForResultで呼び出すようにし、setResultで値を設定する。
そうするとonActivityResultに入ってくるのでそこで値を受け取って処理をしてやります。

public class MainActivity extends AppCompatActivity { private TextView textView; private static final int REQUESTCODE = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView TimeLabel = findViewById(R.id.TimeLabel); Calendar cal = Calendar.getInstance(); int year = cal.get(Calendar.YEAR); //西暦を取得 int month = cal.get(Calendar.MONTH); //何月かを取得 int day = cal.get(Calendar.DAY_OF_MONTH);//何日かを取得 int hour=cal.get(Calendar.HOUR_OF_DAY); int minute=cal.get(Calendar.MINUTE); DatePicker datePicker = findViewById(R.id.datePicker1); datePicker.init(year, month,day , new DatePicker.OnDateChangedListener() { @Override public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { // 日付を選択した時に実行される部分 Intent intent = new Intent(MainActivity.this, Schedule.class); startActivityForResult(intent, REQUESTCODE); } }); int day_Hour = getIntent().getIntExtra("HOUR", hour); //int day_Minute = getIntent().getIntExtra("MINUTE", minute); SharedPreferences sharedPreferences = getSharedPreferences("HOUR", MODE_PRIVATE); int TimeSet = sharedPreferences.getInt("HOUR", 0); if(day_Hour>=0) { TimeLabel.setText("始まる時刻-"+ day_Hour); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putInt("HOUR", day_Hour); editor.apply(); } else { //TimeLabel.setText("始まる時刻-" + hour+":"+minute); } } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); // 一応、同じリクエストコードであることを確認 if(REQUESTCODE == requestCode){ int hour = data.getIntExtra("HOUR", 0); TextView TimeLabel = findViewById(R.id.TimeLabel); TimeLabel.setText("始まる時刻-"+ hour); } } }
public class Schedule extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_schedule); final Calendar calendar=Calendar.getInstance(); final int hour=calendar.get(Calendar.HOUR_OF_DAY); final int minute=calendar.get(Calendar.MINUTE); final TimePickerDialog timePickerDialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minuteOfDay) { // Intent intent = new Intent(getApplicationContext(), MainActivity.class); // intent.putExtra("HOUR",hourOfDay); // intent.putExtra("MINUTE", minuteOfDay); Intent intent = new Intent(); intent.putExtra("HOUR", hourOfDay); setResult(RESULT_OK, intent); finish(); } }, hour, minute, true); timePickerDialog.show(); } }

「android activity 遷移元 値を受け取る」
などで検索すると色々出てくるかと思います。
不明点等あればコメントください。

参考にしたサイト:https://araramistudio.jimdo.com/2018/02/15/android%E3%81%A7activity%E3%81%8B%E3%82%89%E7%B5%90%E6%9E%9C%E3%82%92%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8B/

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

上手くいかないとはどの部分がうまくいっていないでしょうか?
エラーが出てしまってアプリが落ちてしまっているのであればエラー内容があると原因がわかりやすいです。
AndroidStudioであればLogcatと言う部分でログを見ます。

自分が通って欲しいと思った部分をコードが通っていますでしょうか?
ブレークポイントを貼ってDebug実行するとその部分で処理が止まって流れがわかったり、その時の状態を見ることができます。
AndroidのLogを使ってLog出力することなどもできます。(こちらはLogcatに値が出力されます)

コメントのコードだけで判断するのであればまず

int result=intent.getIntExtra("INPUT_STRING",0); TextView TimeLabel = findViewById(R.id.TimeLabel); // TimeLabel TimeLabel.setText(result);//表示させる

としないとTimeLabelが何かわからないのでコンパイルエラーが出てしまうと思われます。

次にTimeLabelは別の場所で参照できていてコンパイルエラーが出ていない場合であれば
TimeLabel.setText(result);//表示させるはintなのでsetTextしてしまうとエラーになってしまうと思うのでStringに変換してやる必要があるかと思います。

int result=intent.getIntExtra("INPUT_STRING",0); TextView TimeLabel = findViewById(R.id.TimeLabel); // TimeLabel TimeLabel.setText(String.valueOf(result));//表示させる

上手くいかないときにはなるべくどの部分が上手くいっていないかを特定するようにすると質問される側も答えやすいです。また、どこが上手くいっていないかがわかってくると自分でその解決の仕方がわかってくると思います。

投稿2020/04/25 07:59

編集2020/04/25 11:05
razuma

総合スコア1313

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

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

despaine198

2020/04/25 10:09

コメントありがとうございます。 上手くいかないのでもう少し教えていただいてもよろしいでしょうか? protected void onActivityResult( int requestCode, int resultCode,Intent intent) { super.onActivityResult(requestCode, resultCode, intent); int result=intent.getIntExtra("INPUT_STRING",0); TimeLabel.setText(result);//表示させる } MainActivityでこういう風にやったんですけど上手くいかないです。 ちなみに遷移させるファイルのコードは inal TimePickerDialog timePickerDialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minuteOfDay) { Intent intent = new Intent(); intent.putExtra("INPUT_STRING", hourOfDay); setResult(RESULT_OK, intent); finish(); } }, hour, minute, true);
razuma

2020/04/25 11:05

回答追記しました。ご確認をお願いいたします!
despaine198

2020/04/25 13:22

ご丁寧にありがとうございました。 できました!
razuma

2020/04/25 13:26

良かったです。がんばってくださいー。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問