首页 > 解决方案 > 如何将日期从一项活动传递到另一项活动?

问题描述

我正在开发巴士预订应用程序。

这是我的主页:

在任何地方单击 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 活动

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();
        }
    });
}
}

错误

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) 

标签: androiddatebundle

解决方案


如果您希望 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_DATEint 常量。

我没有测试日期值的正确转换。应该只是一个灵感。


推荐阅读