Java 在Android中从静态DateDialogFragment中更新活动字段
我正在尝试实现一个Java 在Android中从静态DateDialogFragment中更新活动字段,java,android,android-fragments,Java,Android,Android Fragments,我正在尝试实现一个EditText字段,单击该字段将显示一个日期选择器。根据我所读的内容,推荐使用DateDialogFragment作为现代解决方案 为了简单起见,我从活动中删除了不相关的代码: public class EditStepCountEntryActivity extends AppCompatActivity { private EditText mChangeDateField; private static DateTimeFormatter dateFor
EditText
字段,单击该字段将显示一个日期选择器。根据我所读的内容,推荐使用DateDialogFragment
作为现代解决方案
为了简单起见,我从活动中删除了不相关的代码:
public class EditStepCountEntryActivity extends AppCompatActivity
{
private EditText mChangeDateField;
private static DateTimeFormatter dateFormat = DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG);
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_step_count_entry);
initViews();
}
private void initViews()
{
mChangeDateField = findViewById(R.id.changeDateField);
mChangeDateField.setInputType(InputType.TYPE_NULL);
mChangeDateField.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
onChangeDateButtonClicked();
}
});
}
public void onChangeDateButtonClicked()
{
DateDialogFragment datePicker = new DateDialogFragment();
datePicker.show(getSupportFragmentManager(), "showDate");
}
public class DateDialogFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener
{
@Override
public Dialog onCreateDialog(Bundle savedInstanceState)
{
LocalDate date = LocalDate.parse(mStepCountDate.getText(), dateFormat);
int year = date.getYear();
int month = date.getMonthValue();
int day = date.getDayOfMonth();
return new DatePickerDialog(getActivity(), this, year, month, day);
}
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth)
{
showSetDate(LocalDate.of(year, monthOfYear, dayOfMonth));
}
}
public void showSetDate(LocalDate date)
{
String dateText = date.format(dateFormat);
mStepCountDate.setText(dateText);
}
}
单击编辑文本时,出现以下错误:
java.lang.IllegalStateException:片段
com.example.android.keepfitapp.EditStepCountEntryActivity.DateDialogFragment
必须是公共静态类才能从实例正确地重新创建
状态
位于androidx.fragment.app.FragmentTransaction.doAddOp(FragmentTransaction.java:249)
位于androidx.fragment.app.backbackbackrecord.doAddOp(backbackbackrecord.java:180)
在androidx.fragment.app.FragmentTransaction.add(FragmentTransaction.java:171)
位于androidx.fragment.app.DialogFragment.show(DialogFragment.java:174)
在com.example.android.keepfitapp.EditStepCountEntryActivity.onChangeDateButtonClicked上(EditStepCountEntryActivity.java:187)
该错误说明片段必须是静态的,但是如果片段
是静态的,我将无法再访问活动
编辑文本
我可能会将日期以捆绑方式传递给片段
,但如何将输入的新日期返回到活动
?嗨,我也遇到了同样的问题。我就是这样解决的:
步骤1使您的活动实现DatePickerDialog.OnDateSetListener(并将其从DialogFragment中删除)
步骤2,将创建对话框中的代码替换为:
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);
// Activity needs to implement this interface
DatePickerDialog.OnDateSetListener listener = (DatePickerDialog.OnDateSetListener) getActivity();
DatePickerDialog q = new DatePickerDialog(getActivity(), listener, year, month, day);
return q;
步骤3,在活动中重写onDateSet方法(并将其从DialogFragment中删除),并在设置日期时更新文本字段
希望它能回答你的问题:)
完整的工作示例:(为了便于理解:):
public class MainActivity extends AppCompatActivity implements DatePickerDialog.OnDateSetListener {
TextView mChangeDateField;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mChangeDateField = findViewById(R.id.changeDateField);
}
public void setDateText(View view){
ClientChooseDateFragment newFragment =
new ClientChooseDateFragment();
newFragment.show(getSupportFragmentManager(),
"datePicker");
}
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
mChangeDateField.setText("-- " + year + "--- Month" +month);
}
public static class ClientChooseDateFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current time as the default values for 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);
// Activity needs to implement this interface
DatePickerDialog.OnDateSetListener listener = (DatePickerDialog.OnDateSetListener) getActivity();
DatePickerDialog q = new DatePickerDialog(getActivity(), listener, year, month, day);
return q;
}
}}