Как передать дату от одного занятия другому? - PullRequest
0 голосов
/ 25 апреля 2018

Я работаю над приложением бронирования автобусов.

Это моя домашняя страница:

В любом месте, нажав на макет JournyDate, откроется эта страница:

По сути, мне нужно установить выбранную дату в макете JournyDate.

Для календаря я использую эту библиотеку .

Домашний фрагмент

datelayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(getContext(), DateChooser.class);
            startActivityForResult(intent, 11);
        }
    });

 @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK && requestCode == 11) {
        Date date = new Date(data.getExtras().getString("Date"));
        txtDate.setText((CharSequence) date);
    }
}

DateChooser Activity

public class DateChooser extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_date_chooser);

    MaterialCalendarView calendarView = (MaterialCalendarView) findViewById(R.id.calendarView);

    CalendarDay calendarDay = calendarView.getCurrentDate();
    calendarView.setCurrentDate(calendarDay);
    Date date = calendarDay.getDate();

    calendarView.setOnDateChangedListener(new OnDateSelectedListener() {
        @Override
        public void onDateSelected(@NonNull MaterialCalendarView widget, @NonNull CalendarDay date, boolean selected) {
            Intent result = new Intent();
            result.putExtra("Date", date);
            setResult(RESULT_OK, result);
            finish();
        }
    });
}
}

Error

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.smiles.bus, PID: 19691
              java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=65547, result=-1, data=Intent { (has extras) }} to activity {com.smiles.bus/com.smiles.bus.MainActivity}: java.lang.IllegalArgumentException: The string argument is null
                  at android.app.ActivityThread.deliverResults(ActivityThread.java:4998)
                  at android.app.ActivityThread.handleSendResult(ActivityThread.java:5041)
                  at android.app.ActivityThread.access$1600(ActivityThread.java:229)
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1875)
                  at android.os.Handler.dispatchMessage(Handler.java:102)
                  at android.os.Looper.loop(Looper.java:148)
                  at android.app.ActivityThread.main(ActivityThread.java:7325)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
               Caused by: java.lang.IllegalArgumentException: The string argument is null
                  at java.util.Date.parse(Date.java:384)
                  at java.util.Date.<init>(Date.java:157)
                  at com.smiles.bus.Home.onActivityResult(Home.java:129)
                  at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:156)
                  at android.app.Activity.dispatchActivityResult(Activity.java:7165)
                  at android.app.ActivityThread.deliverResults(ActivityThread.java:4994)
                  at android.app.ActivityThread.handleSendResult(ActivityThread.java:5041) 
                  at android.app.ActivityThread.access$1600(ActivityThread.java:229) 
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1875) 
                  at android.os.Handler.dispatchMessage(Handler.java:102) 
                  at android.os.Looper.loop(Looper.java:148) 
                  at android.app.ActivityThread.main(ActivityThread.java:7325) 
                  at java.lang.reflect.Method.invoke(Native Method) 
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

Ответы [ 4 ]

0 голосов
/ 25 апреля 2018

Используйте DialogFragment вместо Activity.

Попробуйте добавить это MyDatePickerFragment в ваш MainActivity или что-то еще.

public class MyDatePickerFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);
        DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), dateSetListener, year, month, day);
        datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis());
        return datePickerDialog;
    }

    private DatePickerDialog.OnDateSetListener dateSetListener =
            new DatePickerDialog.OnDateSetListener() {
                public void onDateSet(DatePicker view, int year, int month, int day) {
                    String selectedDate = view.getDayOfMonth() + "/" + (view.getMonth() + 1) + "/" + view.getYear();
                    txtDate.setText(selectedDate);
                }
            };
}

И вызвать фрагмент из вашего onclick ()

DialogFragment newFragment = new MyDatePickerFragment();
newFragment.show(getFragmentManager(), "date picker");
0 голосов
/ 25 апреля 2018

Используйте это. мы можем передавать данные в любое место без использования намерения и ActivityResult

* 1004 Отто *

образец образец проекта

0 голосов
/ 25 апреля 2018

, когда вы выбираете любую дату, переводите эту дату в строковую переменную, как показано ниже.

конвертировать строку объекта даты, как это ..

String selectedDate=date.toString();

       Intent result = new Intent(currentclassName.this,NextActivity.class);// if you finish then no need to define parameters into intent.
        result.putExtra("Date", selectedDate);
        setResult(RESULT_OK, result);
        finish();

если передать во фрагмент, то использовать аргумент для передачи данных.

0 голосов
/ 25 апреля 2018

Если вы хотите, чтобы DateChooser запускался как действие, запустите его с:

Intent intent = new Intent(this, DateChooser.class);
startActivityForResult(intent, REQUEST_DATE);

и выполните реакцию на результат:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  if (resultCode == RESULT_OK && requestCode == REQUEST_DATE) {
     Date date = new Date(data.getExtras().getString(EXTRA_DATE));
     ...
  }
}

Верните результат в DateChooser какследующее:

Intent result = new Intent();
result.putExtra(EXTRA_DATE, date);
setResult(RESULT_OK, result);
finish();

Определить EXTRA_DATE как строковую константу и REQUEST_DATE как целую константу.

Я не проверял правильное преобразование значения даты.Должно быть просто вдохновение.

...