2017-12-10 5 views
1

フラグメント内に日付ピッカーダイアログを作成しようとしています。フラグメント内に日付ピッカーフラグメントを追加します。

主なフラグメント:

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

} 

} 

DatePickerFragment:

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: [email protected] 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) 

答えて

2

あなたは一つの断片からのデータを渡すためにしようとしています別のvにIA mListenerしかしcontextは、したがって

第2のフラグメントのonAttach

michlind.com.workcalendar.viewsにエラーあなたの活動を表しています。あなたのMainActivityOnDateSetListener

ソリューションを実装していないので、MainActivity @ a20fbb7 OnDateSetListener

を実装する必要があります:あなたは

DialogFragmentimplement callback mechanismに必要 - >インタフェースのコールバックに

を使用してMainActivityに日付を送信MainActivity - >フラグメントのインスタンスを使用してフラグメントのデータを送信します。日付などのパラメータを使用してnction


DatePickerFragment

  • インターフェースを作成し(アクティビティによって実装される)及びコールバックを介しmainactivityにonAttach
  • 送信日付値で初期化

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{ 

    public void onADateReceive(int dd ,int mm, int yy){ 
     dataFragmentObject.displaydate(dd,mm,yy); 
    } 

} 

DataFragme NT

  • がデータを受信し、それを

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

    } 

} 
を使用する方法を作成します。
関連する問題