android - 在 fragment 中添加日期选择器 fragment

标签 android android-fragments

我正在尝试在 fragment 内创建日期选择器对话框。

主要 fragment :

public class DataFragment extends Fragment implements 
DatePickerDialog.OnDateSetListener
{
private Button addNew;

@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {

    String date = String.format("%02d", dayOfMonth) + "/" + String.format("%02d", monthOfYear + 1) + "/" + String.format("%02d", year);
    Log.d("DTAG", "date: "+date);
    }
}

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{
    View RootView = inflater.inflate(R.layout.fragment_data, container, false);
    addNew = RootView.findViewById(R.id.button_add);

    addNew.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            showDatePickerDialog(view);
        }
    });

    return RootView;
}

public void showDatePickerDialog(View v) 
{
    DialogFragment newFragment = new DatePickerFragment();
    newFragment.show(getFragmentManager(), "datePicker");

}

}

日期选择器 fragment :

public class DatePickerFragment extends DialogFragment {

private DatePickerDialog.OnDateSetListener mListener;
private Context context;

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    this.context = context;

    try {
        mListener = (DatePickerDialog.OnDateSetListener) context;
    } catch (ClassCastException e) {
        throw new ClassCastException(context.toString() + " must implement OnDateSetListener");
    }
}

@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);

    // Create a new instance of DatePickerDialog and return it
   return new DatePickerDialog(context, mListener, year, month, day);
}

但我得到一个异常(exception):

FATAL EXCEPTION: main
 Process: michlind.com.workcalendar, PID: 4951
 java.lang.ClassCastException: michlind.com.workcalendar.views.MainActivity@a20fbb7 must implement OnDateSetListener
     at michlind.com.workcalendar.views.DatePickerFragment.onAttach(DatePickerFragment.java:29)
     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1220)
     at android.app.FragmentManagerImpl.addAddedFragments(FragmentManager.java:2415)
     at android.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2194)
     at android.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2148)
     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2049)
     at android.app.FragmentManagerImpl$1.run(FragmentManager.java:718)
     at android.os.Handler.handleCallback(Handler.java:789)
     at android.os.Handler.dispatchMessage(Handler.java:98)
     at android.os.Looper.loop(Looper.java:164)
     at android.app.ActivityThread.main(ActivityThread.java:6541)
     at java.lang.reflect.Method.invoke(Native Method)
     at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

最佳答案

您正在尝试通过 mListener 将数据从一个 fragment 传递到另一个 fragment ,但是 context 代表您的 Activity

因此第二个 fragment 的onAttach错误

michlind.com.workcalendar.views.MainActivity@a20fbb7 must implement OnDateSetListener

因为您的 MainActivity 没有实现 OnDateSetListener

解决方案:您需要 implement callback mechanism在哪里

DialogFragment -> 使用接口(interface)回调将日期发送到MainActivity

MainActivity -> 通过调用参数为日期的函数,使用 fragment 实例将数据发送到 fragment 一


DatePickerFragment

  • 创建接口(interface)(将由activity实现)并在onAttach中初始化
  • 通过回调将日期值发送到 mainactivity

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener{

    private DatePickerFragment.OnDateReceiveCallBack mListener;
    private Context context;

    public interface OnDateReceiveCallBack {
        public void onDateReceive(int dd ,int mm, int yy);
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        this.context = context;

        try {
            mListener = (DatePickerFragment.OnDateReceiveCallBack) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + " must implement OnDateSetListener");
        }
    }

    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        mListener.onDateReceive(dayOfMonth,monthOfYear,year);
    }

    @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);

        // Create a new instance of DatePickerDialog and return it
       return new DatePickerDialog(context, this, year, month, day);
    }

}

主 Activity

  • 实现接口(interface)回调
  • 使用函数将数据传递给dataFragmentObject

public class MainActivity ....implements DatePickerFragment.OnDateReceiveCallBack{

    // implement callback
    public void onDateReceive(int dd ,int mm, int yy){
        dataFragmentObject.displaydate(dd,mm,yy);
    }

}

数据 fragment

  • 创建接收数据的方法并使用它

public class DataFragment extends Fragment 
{
    private Button addNew;

    public void displaydate(int year, int monthOfYear, int dayOfMonth) {

        String date = String.format("%02d", dayOfMonth) + "/" + String.format("%02d", monthOfYear + 1) + "/" + String.format("%02d", year);
        Log.d("DTAG", "date: "+date);
        }
    }

    //..code oncreateview

    public void showDatePickerDialog(View v) 
    {
        DialogFragment newFragment = new DatePickerFragment();
        newFragment.show(getFragmentManager(), "datePicker");

    }

}

关于android - 在 fragment 中添加日期选择器 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47740237/

相关文章:

android - fragment 进入和退出转换不会同时执行

java - 热图未以 fragment 形式显示

android - 随机 fragment 问题

android - 在 JellyBean 上使用 LogCat

java - Spring 安卓客户端 : get request returning more complexe JSON objects

android - 带有滑动菜单和操作栏的动态 UI

java - ViewPager 不更新 fragment

android - 将自定义 JSON 序列化程序与 firebase 结合使用

android - Jetpack Compose - 用图案绘制弧线

android - Ionic 3 暂停和恢复事件在 Android 中触发多次