onDateChanged方法似乎不工作 [英] onDateChanged method does not seem to work

查看:148
本文介绍了onDateChanged方法似乎不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的第一篇文章,我想创建一个非常简单的应用程序塔斯克但是我有问题(似乎是)的onDateChanged方法。看来,它并没有执行这些改变即使对话框弹出正常。有日志中没有错误,我仔细检查了各种解决方案,类似的功能,但我无法找到相关的东西。 (minSDK 16,目标21)

非常感谢事先我很抱歉,如果这是明显的东西。

公共类DatePickerFragment扩展DialogFragment {     公共静态最后弦乐EXTRA_DATE =thanoschatz.com.annastodolist.date;     私人日期mDate;     公共静态DatePickerFragment的newInstance(日期mDate){         捆绑的args =新包();         args.putSerializable(EXTRA_DATE,mDate);         DatePickerFragment片段=新DatePickerFragment();         fragment.setArguments(参数);         返回片段;     }     @覆盖     公共对话onCreateDialog(包savedInstanceState){         mDate =(日期)getArguments()getSerializable(EXTRA_DATE)。         台历挂历= Calendar.getInstance();         calendar.setTime(mDate);         INT年= calendar.get(Calendar.YEAR);         INT月= calendar.get(Calendar.MONTH);         INT天= calendar.get(Calendar.DAY_OF_MONTH);         视图V = getActivity()getLayoutInflater()膨胀(R.layout.dialog_date,空)。         DatePicker的日期选择器=(DatePicker的)v.findViewById(R.id.dialog_date_datepicker);         datePicker.init(年,月,日,新DatePicker.OnDateChangedListener(){             @覆盖             公共无效onDateChanged(DatePicker的观点,年整型,诠释monthOfYear,诠释DAYOFMONTH){                 mDate =新的GregorianCalendar(年,monthOfYear,DAYOFMONTH).getTime();                 。getArguments()putSerializable(EXTRA_DATE,mDate);             }         });         返回新AlertDialog.Builder(getActivity())                 .setView(ⅴ)//                 .setTitle(R.string.date_picker_title)//                 .setPositiveButton(android.R.string.ok,新DialogInterface.OnClickListener(){                     @覆盖                     公共无效的onClick(DialogInterface对话,诠释它){                         sendResult(Activity.RESULT_OK);                     }                 })                 。创建();     }     私人无效sendResult(INT结果code){         如果(getTargetFragment()== NULL)返回;         意向意图=新的意图();         intent.putExtra(EXTRA_DATE,mDate);         getTargetFragment()onActivityResult(getTargetRequest code(),因此code,意图)。     } }

公共类ToDoFragment扩展片段{     公共静态最后弦乐EXTRA_TODO_ID =thanoschatz.com.annastodolist.todo_id;     私有静态最后弦乐DIALOG_DATE =日期;     私有静态最终诠释REQUEST_DATE = 0;     私人待办事项mToDo;     私人的EditText mTitleField;     私人按钮mDateButton;     私人复选框mDoneCheckBox;     @覆盖     公共无效的onCreate(包savedInstanceState){         super.onCreate(savedInstanceState);         setHasOptionsMenu(真正的);         UUID toDoId =(UUID)getArguments()getSerializable(EXTRA_TODO_ID)。         。mToDo = ToDoLab.get(getActivity())getToDo(toDoId);     }     @覆盖     公共查看onCreateView(LayoutInflater充气,容器的ViewGroup,捆绑savedInstanceState){         查看查看= inflater.inflate(R.layout.fragment_todo,集装箱,假);         wireTitleField(视图);         wireDateButton(视图);         wireSolvedCheckBox(视图);         返回查看;     }     @覆盖     公共无效onActivityResult(INT申请code,INT结果code,意图意图){         如果(结果code!= Activity.RESULT_OK){             返回;         }         如果(要求code == REQUEST_DATE){             日期mDate =(日期)intent.getSerializableExtra(DatePickerFragment.EXTRA_DATE);             mToDo.setDate(mDate);                     }     }     公共ToDoFragment(){     }          公共静态ToDoFragment的newInstance(UUID MID){         捆绑的args =新包();         args.putSerializable(EXTRA_TODO_ID,MID);         ToDoFragment片段=新ToDoFragment();         fragment.setArguments(参数);         返回片段;     }        私人无效wireDateButton(查看视图){         SimpleDateFormat的dateFormatter = getSimpleDateFormat();         mDateButton =(按钮)view.findViewById(R.id.toDo_date);         updateDate(dateFormatter);         mDateButton.setOnClickListener(新View.OnClickListener(){             公共无效的onClick(视图查看){                 FragmentManager fragmentManager = getFragmentManager();                 DatePickerFragment日期选择器= DatePickerFragment.newInstance(mToDo.getDate());                 datePicker.setTargetFragment(ToDoFragment.this,REQUEST_DATE);                 datePicker.show(fragmentManager,DIALOG_DATE);             }         });     } }

解决方案

也有另一种方式来获得它在5.0工作,并保持你的DatePicker日历模式。你可以做的是一套,听取对话框中点击修改,并更新最新的参考。万一你收对话框处理程序注意到最后一个按钮被点击取消则根本不理会改变......

 私人字符串dateString; //最后日期保存。
    私人字符串clickedDate; //最后日期点击的DatePicker
    私人的DatePicker日期选择器;

@覆盖
    保护无效onDialogClosed(布尔shouldSave){
        如果(shouldSave&安培;&安培;!this.clickedDate = NULL){
            updateDate(this.clickedDate);
            this.clickedDate = NULL;
        }
    }

@覆盖
    公共无效onDateChanged(DatePicker的观点,年整型,INT月,日整型){
        日历选择=新的GregorianCalendar(年,月,日);
        。this.clickedDate =格式器()格式(selected.getTime());
    }

    @覆盖
    公共无效的onClick(DialogInterface对话,诠释它){
        super.onClick(对话框,其中);
        datePicker.clearFocus();
        onDateChanged(日期选择器,datePicker.getYear(),datePicker.getMonth()
                datePicker.getDayOfMonth());
        onDialogClosed(其中== DialogInterface.BUTTON_NEGATIVE);
    }

私人无效updateDate(String s)将{
dateString =秒;
}
 

这是那里的想法来自<一个href="https://github.com/bostonandroid/Date$p$pference/blob/master/Date$p$pference/src/org/bostonandroid/date$p$pference/Date$p$pference.java" rel="nofollow">https://github.com/bostonandroid/Date$p$pference/blob/master/Date$p$pference/src/org/bostonandroid/date$p$pference/Date$p$pference.java

this is my first post and I am trying to create a very simple tasker app, however I am having issues with (what seems to be) the onDateChanged method. It seems that it does not implement the changes even though the dialog pops up normally. There are no errors in the log and i double checked various solutions with similar functionalities, but i could not find something relevant. (minSDK 16, Target 21)

Thanks a lot in advance and I am sorry if it is something obvious.

 
public class DatePickerFragment extends DialogFragment {

    public static final String EXTRA_DATE = "thanoschatz.com.annastodolist.date";

    private Date mDate;

    public static DatePickerFragment newInstance(Date mDate) {
        Bundle args = new Bundle();
        args.putSerializable(EXTRA_DATE, mDate);

        DatePickerFragment fragment = new DatePickerFragment();
        fragment.setArguments(args);

        return fragment;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        mDate = (Date) getArguments().getSerializable(EXTRA_DATE);


        Calendar calendar = Calendar.getInstance();
        calendar.setTime(mDate);
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);

        View v = getActivity().getLayoutInflater().inflate(R.layout.dialog_date, null);

        DatePicker datePicker = (DatePicker) v.findViewById(R.id.dialog_date_datepicker);
        datePicker.init(year, month, day, new DatePicker.OnDateChangedListener() {
            @Override
            public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {

                mDate = new GregorianCalendar(year, monthOfYear, dayOfMonth).getTime();


                getArguments().putSerializable(EXTRA_DATE, mDate);
            }
        });

        return new AlertDialog.Builder(getActivity())
                .setView(v) //
                .setTitle(R.string.date_picker_title) //
                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        sendResult(Activity.RESULT_OK);
                    }
                })
                .create();
    }

    private void sendResult(int resultCode) {
        if (getTargetFragment() == null) return;

        Intent intent = new Intent();
        intent.putExtra(EXTRA_DATE, mDate);

        getTargetFragment().onActivityResult(getTargetRequestCode(), resultCode, intent);
    }
}

 

public class ToDoFragment extends Fragment {
    public static final String EXTRA_TODO_ID = "thanoschatz.com.annastodolist.todo_id";
    private static final String DIALOG_DATE = "date";
    private static final int REQUEST_DATE = 0;

    private ToDo mToDo;
    private EditText mTitleField;
    private Button mDateButton;
    private CheckBox mDoneCheckBox;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
        UUID toDoId = (UUID)getArguments().getSerializable(EXTRA_TODO_ID);
        mToDo= ToDoLab.get(getActivity()).getToDo(toDoId);
    }



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_todo, container, false);
        wireTitleField(view);
        wireDateButton(view);
        wireSolvedCheckBox(view);
        return  view;
    }




    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (resultCode != Activity.RESULT_OK) {
            return;
        }
        if (requestCode == REQUEST_DATE) {
            Date mDate = (Date)intent.getSerializableExtra(DatePickerFragment.EXTRA_DATE);
            mToDo.setDate(mDate);
           
        }
    }

    public ToDoFragment(){

    }

    
    public static ToDoFragment newInstance(UUID mId) {
        Bundle args = new Bundle();
        args.putSerializable(EXTRA_TODO_ID, mId);

        ToDoFragment fragment = new ToDoFragment();
        fragment.setArguments(args);

        return fragment;
    }

  

    private void wireDateButton(View view) {
        SimpleDateFormat dateFormatter = getSimpleDateFormat();
        mDateButton = (Button)view.findViewById(R.id.toDo_date);
        updateDate(dateFormatter);

        mDateButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View view) {
                FragmentManager fragmentManager = getFragmentManager();
                DatePickerFragment datePicker = DatePickerFragment.newInstance(mToDo.getDate());
                datePicker.setTargetFragment(ToDoFragment.this, REQUEST_DATE);
                datePicker.show(fragmentManager, DIALOG_DATE);
            }
        });
    }
}

解决方案

There is also another way to get it to work under 5.0 and keeping your DatePicker in Calendar mode. What you can do is set to listen to the click changes on the dialog, and update your date reference. If by any chance your closing dialog handler notices that the last button clicked was "cancel" then simply ignore the change...

private String dateString; //last date saved.
    private String clickedDate; //last date clicked on DatePicker
    private DatePicker datePicker;

@Override
    protected void onDialogClosed(boolean shouldSave) {
        if (shouldSave && this.clickedDate != null) {
            updateDate(this.clickedDate);
            this.clickedDate = null;
        }
    }

@Override
    public void onDateChanged(DatePicker view, int year, int month, int day)       {
        Calendar selected = new GregorianCalendar(year, month, day);
        this.clickedDate = formatter().format(selected.getTime());
    }

    @Override
    public void onClick(DialogInterface dialog, int which) {
        super.onClick(dialog, which);
        datePicker.clearFocus();
        onDateChanged(datePicker, datePicker.getYear(), datePicker.getMonth(),
                datePicker.getDayOfMonth());
        onDialogClosed(which == DialogInterface.BUTTON_NEGATIVE);
    }

private void updateDate(String s) {
dateString = s;
}

This is where the idea came from https://github.com/bostonandroid/DatePreference/blob/master/DatePreference/src/org/bostonandroid/datepreference/DatePreference.java

这篇关于onDateChanged方法似乎不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆