【问题标题】:Problems with my ListFragment and DatePickerDialog我的 ListFragment 和 DatePickerDialog 的问题
【发布时间】:2015-05-04 17:35:16
【问题描述】:

我是 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);
        }
    }

}

点击Button后,出现如下错误:

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

代码在“标准”片段中运行。

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

1.) 代替getSupportFragmentManager,使用getFragmentManager --> "无法解析方法'show(android.app.FragmentManager.java.lang.String)'

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

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

3.) 我尝试将我的导入 import android.support.v4.app.ListFragment; 更改为 android.app.ListFragment; 同样在我的另外两个“标准”片段中,我将导入更改为“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;”并崩溃。

希望你能帮帮我!

【问题讨论】:

    标签: android android-fragments android-studio android-listfragment android-datepicker


    【解决方案1】:
    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 接口并且需要在那个特定的类上重写returnDate 方法:

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

    【讨论】:

    • 非常感谢!我编辑我的 DatePickerFragment 和我的 ListFragment。这里我实现了监听器:public classTestListFragment extends ListFragment implements DatePickerFragment.TheListener 但是“picker.onDateSetListener(this)”这行会出现问题..“Cannot resolve method('onDateSetListener)”,虽然我实现了监听器
    • 我认为你需要使用picker.onDateSetListener(TestListFragment.this);
    • 哇!! DatePickerDialog 在那里,我可以选择一个日期!谢谢达瓦尔·帕特尔!! :-) 我在 EditTextField 中看不到选择的日期,但没关系!我将在代码中搜索问题。 :)
    • 很高兴为您提供帮助:-)
    【解决方案2】:

    您的ListFragment 的父级Activity 似乎没有实现TheListener

    当你打电话时

    listener = (TheListener) getActivity();
    

    您将ListFragment 的父活动投射到TheListener

    顺便说一句,你会想要小心这个。如果您旋转屏幕,Activity 将被重新创建,您的DatePickerFragment 将被分离并重新附加一个新的。老的getActivity方法会返回null。

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

    【讨论】:

    • 感谢您的解释!在我的 onCreate(View) 中不是 DatePickerFragment 的实例。但我会尝试改变它。 :-)
    猜你喜欢
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多