Android/Java - 如何使用日期选择器更新 mapfragment?
Android/Java - How to update mapfragment with datepicker?
应用程序中的地图使用部分取决于数据日期的叠加层,默认情况下我希望它显示当前日期的数据,并且用户可以点击日期以调出日期选择器。到目前为止这是有效的,但由于我设法让日期选择器工作的唯一方法是在 MainActivity
中创建一个 static class
它无法访问外部 class 中的任何内容,因此不能使用 getMapAsync
。用户选择日期后,应用程序如何使用 OnMapReady
?
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener, OnMapReadyCallback, OnDateSetListener{
static Calendar calendar = Calendar.getInstance();
static SimpleDateFormat sysFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
static String sysDate = sysFormat.format(calendar.getTime());
static DateFormat userFormat = (DateFormat.getDateInstance());
static String userDate = userFormat.format(calendar.getTime());
...
@Override
protected void onCreate(Bundle savedInstanceState) {
TextView displayDate = (TextView)findViewById(R.id.displayDate);
displayDate.setText(userDate);
displayDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DialogFragment datePicker = new DatePickerFragment();
datePicker.show(getSupportFragmentManager(), "datePicker");
}
});
}
...
@Override
public void onMapReady(GoogleMap googleMap) {
//sysDate used in overlay link
}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
//if possible I would like this to be called rather than the one below
}
public static class DatePickerFragment extends DialogFragment implements OnDateSetListener{
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current date as the default date in the picker
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);
// Create a new instance of DatePickerDialog and return it
return new DatePickerDialog(getActivity(), this, year, month, day);
}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
calendar.set(Calendar.YEAR,year);
calendar.set(Calendar.MONTH,monthOfYear);
calendar.set(Calendar.DAY_OF_MONTH,dayOfMonth);
userDate = userFormat.format(calendar.getTime());
sysDate = sysFormat.format(calendar.getTime());
}
}
}
解决了,感觉很傻。
制作了重新加载地图的方法
public void reloadMap(){
SupportMapFragment supportMapFragment = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);
supportMapFragment.getMapAsync(this);
}
然后使用 getActivity()
调用它
public static class DatePickerFragment extends DialogFragment implements OnDateSetListener{
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {...}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
calendar.set(Calendar.YEAR,year);
calendar.set(Calendar.MONTH,monthOfYear);
calendar.set(Calendar.DAY_OF_MONTH,dayOfMonth);
userDate = userFormat.format(calendar.getTime());
sysDate = sysFormat.format(calendar.getTime());
TextView displayDate = (TextView)getActivity().findViewById(R.id.displayDate);
displayDate.setText(userDate);
((MainActivity)getActivity()).reloadMap();
}
应用程序中的地图使用部分取决于数据日期的叠加层,默认情况下我希望它显示当前日期的数据,并且用户可以点击日期以调出日期选择器。到目前为止这是有效的,但由于我设法让日期选择器工作的唯一方法是在 MainActivity
中创建一个 static class
它无法访问外部 class 中的任何内容,因此不能使用 getMapAsync
。用户选择日期后,应用程序如何使用 OnMapReady
?
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener, OnMapReadyCallback, OnDateSetListener{
static Calendar calendar = Calendar.getInstance();
static SimpleDateFormat sysFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
static String sysDate = sysFormat.format(calendar.getTime());
static DateFormat userFormat = (DateFormat.getDateInstance());
static String userDate = userFormat.format(calendar.getTime());
...
@Override
protected void onCreate(Bundle savedInstanceState) {
TextView displayDate = (TextView)findViewById(R.id.displayDate);
displayDate.setText(userDate);
displayDate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DialogFragment datePicker = new DatePickerFragment();
datePicker.show(getSupportFragmentManager(), "datePicker");
}
});
}
...
@Override
public void onMapReady(GoogleMap googleMap) {
//sysDate used in overlay link
}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
//if possible I would like this to be called rather than the one below
}
public static class DatePickerFragment extends DialogFragment implements OnDateSetListener{
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current date as the default date in the picker
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);
// Create a new instance of DatePickerDialog and return it
return new DatePickerDialog(getActivity(), this, year, month, day);
}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
calendar.set(Calendar.YEAR,year);
calendar.set(Calendar.MONTH,monthOfYear);
calendar.set(Calendar.DAY_OF_MONTH,dayOfMonth);
userDate = userFormat.format(calendar.getTime());
sysDate = sysFormat.format(calendar.getTime());
}
}
}
解决了,感觉很傻。
制作了重新加载地图的方法
public void reloadMap(){
SupportMapFragment supportMapFragment = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);
supportMapFragment.getMapAsync(this);
}
然后使用 getActivity()
public static class DatePickerFragment extends DialogFragment implements OnDateSetListener{
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {...}
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
calendar.set(Calendar.YEAR,year);
calendar.set(Calendar.MONTH,monthOfYear);
calendar.set(Calendar.DAY_OF_MONTH,dayOfMonth);
userDate = userFormat.format(calendar.getTime());
sysDate = sysFormat.format(calendar.getTime());
TextView displayDate = (TextView)getActivity().findViewById(R.id.displayDate);
displayDate.setText(userDate);
((MainActivity)getActivity()).reloadMap();
}