我的 ListFragment 和 DatePickerDialog 的问题

Problems with my ListFragment and DatePickerDialog

我是 Android 开发新手,我的 ListFragment 有问题。 我正在尝试使用按钮启动 DatePickerDialog。 我的 ListFragment 中的代码如下:

    @Override
    public void onActivityCreated(final Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        b = (Button) getView().findViewById(R.id.button_set_date);
        et = (EditText) getView().findViewById(R.id.editText_choose_date);
        b.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                DialogFragment picker = new DatePickerFragment();
                picker.show(getActivity().getSupportFragmentManager(), "datePicker");
            }
        });



    @Override
    public void returnDate(String date) {
        et.setText(date);
    }

这是我的 DatePickerFragment:

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {

    TheListener listener;

    public interface TheListener {
        public void returnDate(String date);
    }

    @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);
        listener = (TheListener) getActivity();

        return new DatePickerDialog(getActivity(), this, year, month, day);
    }

    @Override
    public void onDateSet(DatePicker view, int year, int month, int day){
        Calendar c = Calendar.getInstance();
        c.set(year, month, day);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String formattedDate = sdf.format(c.getTime());
        if (listener != null){
            listener.returnDate(formattedDate);
        }
    }

}

点击按钮后,出现以下错误:

java.lang.ClassCastException: MainActivity 无法转换为 DatePickerFragment$TheListener

代码在 "standard" 片段内有效。

在寻找解决方案后,我测试了一些可能性:

1.) 而不是 getSupportFragmentManager,使用 getFragmentManager --> “无法解析方法 'show(android.app.FragmentManager.java.lang.String)'

2.) 而不是 'getActivity().getSupportFragmentManager()',仅使用 'getFragmentManager()' --> 同样是点击按钮后,出现如下错误:

java.lang.ClassCastException: MainActivity 无法转换为 DatePickerFragment$TheListener

3.) 我尝试将导入 import android.support.v4.app.ListFragment; 更改为 android.app.ListFragment; 同样在我的另外两个 "standard" 片段中,我将导入更改为 'android.app.Fragment'

--> 我的 MainActivity 出现问题,因为这部分:

        @Override
        public Fragment getItem(int position) {
            // getItem is called to instantiate the fragment for the given page.
            // Return a PlaceholderFragment (defined as a static inner class below).

            switch (position){
                case 0: return TestListFragment.newInstance("a", "b");
                case 1: return TestFragment.newInstance("a","b");
                case 2: return TestFragment2.newInstance("a", "b");
                default: return PlaceholderFragment.newInstance(position + 1);
            }
        }

显然我的 MainActivity 无法与 'import android.app.Fragment;' 一起使用并崩溃。

希望你能帮帮我!

你的 ListFragment 的父 Activity 似乎没有实现 TheListener.

当你打电话给

listener = (TheListener) getActivity();

您正在将 ListFragment 的父级 activity 转换为 TheListener

顺便说一下,你要小心这个。如果您旋转屏幕,Activity 将被重新创建,您的 DatePickerFragment 将被分离并重新连接一个新的。旧的 getActivity 方法将 return null.

您应该检查 ListFragmentonCreate(View) 方法以查看 DatePickerFragment 的实例是否已经存在(通过标签查找),如果存在,您可以想要重新显示该片段的侦听器并将其重新连接到您的新 activity 而不是创建一个新片段。

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {

    TheListener listener = null;

    public interface TheListener {
        public void returnDate(String date);
    }

    public void onDateSetListener(TheListener listener){
        this.listener = listener;
    }

    @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(), this, year, month, day);
    }

    @Override
    public void onDateSet(DatePicker view, int year, int month, int day){
        Calendar c = Calendar.getInstance();
        c.set(year, month, day);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String formattedDate = sdf.format(c.getTime());
        if (listener != null){
            listener.returnDate(formattedDate);
        }
    }

}

当您调用 DatepickerDialog 时:

 DatePickerFragment picker = new DatePickerFragment();
 picker.onDateSetListener(this);
 picker.show(getActivity().getSupportFragmentManager(), "datePicker");

因此您需要实现 TheListener 接口,并且需要在那个特定的 Class:

上覆盖 returnDate 方法
@Override
public void returnDate(String date) {
    et.setText(date);
}