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

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

ただいまの
回答率

88.04%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 476

score 3

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

package com.example.calendar;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.DialogFragment;

import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.DatePicker;
import android.widget.TextView;
import android.widget.TimePicker;


import java.util.Calendar;
import java.util.Locale;


public class MainActivity extends AppCompatActivity {
    private TextView textView;
    @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);
                startActivity(intent);
            }
        });
        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);

        }
    }
}
package com.example.calendar;

import androidx.appcompat.app.AppCompatActivity;

import android.app.TimePickerDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.TimePicker;
import android.widget.Toast;

import java.util.Calendar;

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);
                        finish();
                    }
                }, hour, minute, true);
        timePickerDialog.show();
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jimbe

    2020/04/24 01:29

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

    キャンセル

  • hoshi-takanori

    2020/04/24 03:04

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

    キャンセル

  • despaine198

    2020/04/24 14:08

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

    キャンセル

回答 1

checkベストアンサー

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 19: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);

    キャンセル

  • 2020/04/25 20:05

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

    キャンセル

  • 2020/04/25 22:22

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

    キャンセル

  • 2020/04/25 22:26

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

    キャンセル

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

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る