我在这里关注教程: http://developer.android.com/guide/topics/ui/controls/pickers.html
我让事情发挥作用,而日期选择器出现了。但是,当用户设置日期时,我仍然坚持如何采取行动。
我看到他们有这种方法:
public void onDateSet(DatePicker view, int year, int month, int day) {
// Do something with the date chosen by the user
}
但如果我在其中添加任何代码,则无效。
我不熟悉Java,所以我不确定需要哪些额外的代码来更新所选日期的textview。
我确实添加了这段代码:
private DatePickerDialog.OnDateSetListener mDateListener =
new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year, int month, int day) {
updateDate(year, month, day);
}
};
public void updateDate(int year, int month, int day) {
TextView bdate = (TextView)findViewById(R.id.birthDate);
Date chosenDate = new Date(year, month, day);
java.text.DateFormat dateFormat = DateFormat.getDateFormat(getApplicationContext());
bdate.setText(dateFormat.format(chosenDate));
}
但这没有任何作用。
我确实发现了这个几乎完全正确的问题: Get date from datepicker using dialogfragment
但是在该解决方案中不会使用(EditSessionActivity)将DatePickerFragment类限制为仅使用EditSessionActivity?
答案 0 :(得分:9)
您应该使用静态工厂将参数传递给DialogFragment。来自docs,
“每个片段必须有一个空构造函数,因此可以在恢复其活动状态时进行实例化。强烈建议子类没有其他带参数的构造函数,因为当片段重新生成时,不会调用这些构造函数实例化;相反,参数可以由调用者使用setArguments(Bundle)提供,稍后由Fragment使用getArguments()检索。“
类似地,Fragment子类应该是静态的,以便它可以在不依赖父活动或Fragment的情况下重新实例化自身。如果您不遵守这些准则,则在Fragment尝试恢复时有时会出现崩溃或错误。
从Android的docs构建DialogFragment的推荐方法是使用静态工厂方法。这是一个日期选择器片段的示例,它接受一个初始日期和一个OnDateChangedListener:
public static class DatePickerFragment extends DialogFragment{
private OnDateSetListener onDateSetListener;
static DatePickerFragment newInstance(Date date, OnDateSetListener onDateSetListener) {
DatePickerFragment pickerFragment = new DatePickerFragment();
pickerFragment.setOnDateSetListener(onDateSetListener);
//Pass the date in a bundle.
Bundle bundle = new Bundle();
bundle.putSerializable(MOVE_IN_DATE_KEY, date);
pickerFragment.setArguments(bundle);
return pickerFragment;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
super.onCreateDialog(savedInstanceState);
Date initialDate = (Date) getArguments().getSerializable(MOVE_IN_DATE_KEY);
int[] yearMonthDay = ymdTripleFor(initialDate);
DatePickerDialog dialog = new DatePickerDialog(getActivity(), onDateSetListener, yearMonthDay[0], yearMonthDay[1],
yearMonthDay[2]);
return dialog;
}
private void setOnDateSetListener(OnDateSetListener listener) {
this.onDateSetListener = listener;
}
private int[] ymdTripleFor(Date date) {
Calendar cal = Calendar.getInstance(Locale.US);
cal.setTime(date);
return new int[]{cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)};
}
}
然后,您可以按如下方式创建其中一个对话框片段:
DatePickerFragment.newInstance(yourDate, yourOnDateSetListener);
答案 1 :(得分:2)
我相信可以在这里使用DialogFragments:
DialogFragment newFragment = new DatePickerFragment();
newFragment.show(getSupportFragmentManager(), "datePicker");
定义DatePickerFragment并实现下面的方法
public void onDateSet(DatePicker view, int year, int month, int day) {
// Do something with the date chosen by the user
DateEdit.setText(day + "/" + (month + 1) + "/" + year);
}
答案 2 :(得分:1)
根据我的经验,这段代码完美无缺!我使用的是win10 Android Studio 2.2 ......
import android.app.Dialog;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.app.DatePickerDialog;
import android.widget.DatePicker;
import android.widget.EditText;
import java.util.Calendar;
public class MainActivity extends AppCompatActivity implements DatePickerDialog.OnDateSetListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);}
public void datePicker(View view){
DatePickerFragment fragment_date = new DatePickerFragment();
fragment_date.show(getSupportFragmentManager(),"datePicker");}
@Override
public void onDateSet(DatePicker view, int year, int month, int day) {
String day_x = ""+ day ,month_x = ""+(month+1);
if (day < 9 ){ day_x = "0" + day_x;}
if (month < 9 ){ month_x = "0" + month_x;}
((EditText) findViewById(R.id.txtDate)).setText(day_x + "/" + month_x + "/" + year);}
public static class DatePickerFragment 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);
return new DatePickerDialog(getActivity() ,(DatePickerDialog.OnDateSetListener)this,day,month,year);}}
}
我是&#34; textView txtDate&#34;以及带有onclick = datePicker&#34;
的&#34;按钮