Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Android中从静态DateDialogFragment中更新活动字段_Java_Android_Android Fragments - Fatal编程技术网

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