代码之家  ›  专栏  ›  技术社区  ›  algorhythm

在Android中从静态DateDialogFragment中更新活动字段

  •  0
  • algorhythm  · 技术社区  · 6 年前

    我正在尝试实现一个 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);
        }
    }
    

    当我点击 编辑文本 我得到以下错误:

    JAVAlang.IllegalStateException:片段 通用域名格式。实例安卓keepfitapp。EditStepCountEntryActivity。DateDialogFragment 必须是公共静态类才能从实例正确地重新创建 状态 在androidx。碎片应用程序。零碎的交易。doAddOp(FragmentTransaction.java:249) 在androidx。碎片应用程序。背景记录。doAddOp(backbackrecord.java:180) 在androidx。碎片应用程序。零碎的交易。添加(FragmentTransaction.java:171) 在androidx。碎片应用程序。对话片段。show(DialogFragment.java:174) 在com上。实例安卓keepfitapp。EditStepCountEntryActivity。onChangeDateButtonClicked(EditStepCountEntryActivity.java:187)

    错误表明 Fragment 必须是静态的,但是如果 碎片 如果是静态的,我将无法再访问 Activity 编辑文本 .

    我可能会把日期传给 碎片 但是我怎样才能把新的日期输入到 活动 ?

    0 回复  |  直到 6 年前
        1
  •  1
  •   Ben    6 年前

    嗨,我也有同样的问题。我就是这样解决的:

    第一步 让你的活动实现DatePickerDialog。OnDateSetListener(并将其从DialogFragment中删除)。

    第二步 ,替换源代码 onCreateDialog 致:

        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;
    

    第三步 ,在 活动 (并将其从DialogFragment中删除)并在设置日期时更新文本字段。

    希望它能回答你的问题:)


    A. 满的 工作示例:(为了便于理解:):

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