【问题标题】:Add date picker fragment inside fragment在片段内添加日期选择器片段
【发布时间】:2018-09-26 19:32:06
【问题描述】:

我正在尝试在片段中创建日期选择器对话框。

主要片段:

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

}

}

日期选择器片段:

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

}

但我得到一个例外:

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)

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    您正试图通过mListener 将数据从一个片段传递到另一个片段,但context 代表您的活动

    因此第二个片段的onAttach 中的错误

    michlind.com.workcalendar.views.MainActivity@a20fbb7 必须实现 OnDateSetListener

    因为你的MainActivity 没有实现OnDateSetListener

    解决办法:你需要implement callback mechanism在哪里

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

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


    DatePickerFragment

    • 创建接口(将由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);
        }
    
    }
    

    MainActivity

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

    public class MainActivity ....implements DatePickerFragment.OnDateReceiveCallBack{
    
        // implement callback
        public void onDateReceive(int dd ,int mm, int yy){
            dataFragmentObject.displaydate(dd,mm,yy);
        }
    
    }
    

    数据片段

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多