2016-12-03 29 views
0

我想MH在TimePicker onTimeSet not being called的回答了这个问题之后,显示在一个片段不同TextViews不同的日期设置日期,但我没有得到一个片段相同的结果。我的代码是不能工作在多TextViews

我已经加入一个单独的DatePickerFragment类,其中我使用其被用作一个回调方法和在片段类药物被定义的接口类。

我如何在一个片段中设置多个日期选择器?

的DatePickerFragment被写为:

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { 
    private int mId; 
    DatePickerDialogListener mListener; 
    protected static DatePickerFragment newInstance(int id) { 
     Bundle args = new Bundle(); 
     args.putInt("picker_id", id); 
     DatePickerFragment fragment = new DatePickerFragment(); 
     fragment.setArguments(args); 
     return fragment; 
    } 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     // ... omitted 
     final Calendar c = Calendar.getInstance(); 
     int mDay = c.get(Calendar.DAY_OF_MONTH); 
     int mMonth = c.get(Calendar.MONTH); 
     int mYear = c.get(Calendar.YEAR); 
     mId = getArguments().getInt("picker_id"); 
     mListener = getActivity() instanceof DatePickerFragment.DatePickerDialogListener ? (DatePickerFragment.DatePickerDialogListener) getActivity() : null; 
     // Create a new instance of TimePickerDialog and return it 
     return new DatePickerDialog(getActivity(), this, mYear, mMonth, mDay); 
    } 
    @Override 
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { 
     if (mListener != null) mListener.onDateSet(mId, view, year, month, dayOfMonth); 
    } 
    public static interface DatePickerDialogListener { 
     public void onDateSet(int id, DatePicker view, int year, int month, int dayOfMonth); 
    } 
} 

其将利用本datepickerdialog片段类药物有以下代码:

public class Medication extends Fragment implements DatePickerFragment.DatePickerDialogListener { 
    private static final int FIRST_VISIT_ID = 1; 
    private static final int SECOND_VISIT_ID = 2; 
    private static final int THIRD_VISIT_ID = 3; 
    private int mYear; 
    private int mMonth; 
    private int mDay; 
    protected static TextView date1; 
    protected static TextView date2; 
    protected static TextView date3; 
    public Medication() { 
     // Required empty public constructor 
    } 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_medication, container, false); 
     final Calendar c = Calendar.getInstance(); 
     mYear = c.get(Calendar.YEAR); 
     mMonth = c.get(Calendar.MONTH); 
     mDay = c.get(Calendar.DAY_OF_MONTH); 
     date1 =(TextView) view.findViewById(R.id.visit_date1); 
     date2 =(TextView) view.findViewById(R.id.visit_date2); 
     date3 =(TextView) view.findViewById(R.id.visit_date3); 
     date1.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       DialogFragment newFragment = DatePickerFragment.newInstance(FIRST_VISIT_ID); 
       newFragment.show(getFragmentManager(), "timePicker"); 
      } 
     }); 
     date2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       DialogFragment newFragment = DatePickerFragment.newInstance(SECOND_VISIT_ID); 
       newFragment.show(getFragmentManager(), "timePicker"); 
      } 
     }); 
     date3.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       DialogFragment newFragment = DatePickerFragment.newInstance(THIRD_VISIT_ID); 
       newFragment.show(getFragmentManager(), "timePicker"); 
      } 
     }); 
     date1.setText(
      new StringBuilder() 
      // Month is 0 based so add 1 
      .append(mDay).append("/") 
      .append(mMonth + 1).append("/") 
      .append(mYear).append(" ")); 
     date2.setText(
      new StringBuilder() 
      // Month is 0 based so add 1 
      .append(mDay).append("/") 
      .append(mMonth + 1).append("/") 
      .append(mYear).append(" ")); 
     date3.setText(
      new StringBuilder() 
      // Month is 0 based so add 1 
      .append(mDay).append("/") 
      .append(mMonth + 1).append("/") 
      .append(mYear).append(" ")); 
     return view; 
    } 
    @Override 
    public void onDateSet(int id, DatePicker view, int year, int month, int dayOfMonth) { 
     Log.i("DatePicker", "Date picker set from id " + id + "!"); 
     if(id == FIRST_VISIT_ID) 
     { 
      this.date1.setText(
      new StringBuilder() 
      // Month is 0 based so add 1 
      .append(dayOfMonth).append("/") 
      .append(month + 1).append("/") 
      .append(year).append(" ")); 
     } 
     if(id == SECOND_VISIT_ID) 
     { 
      this.date2.setText(
      new StringBuilder() 
      // Month is 0 based so add 1 
      .append(dayOfMonth).append("/") 
      .append(month + 1).append("/") 
      .append(year).append(" ")); 
     } 
     if(id == THIRD_VISIT_ID) 
     { 
      this.date3.setText(
      new StringBuilder() 
      // Month is 0 based so add 1 
      .append(dayOfMonth).append("/") 
      .append(month + 1).append("/") 
      .append(year).append(" ")); 
     } 
    } 
} 

我曾尝试添加多个拾取器用于时间选择器的这个方法对话框,但同样的问题发生在Medication类中的onTimeSet方法没有被调用,因为在这里onDateSet。

的问题是,该对话框打开,当我点击一个TextView但之后,我改变日期,该TextView的日期不会改变。此外,日志信息消息未显示为onDateSet方法未被调用。 也许mListener在这种情况下是空的,我只能猜测。 请帮我解决这个问题。提前致谢。

回答

0

尝试在onDateSet添加片段的一些日志,看看有什么值设置那里,如果它调用的监听器。

@Override 
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) { 
    Log.i("Fragment/onDateSet", "Date picker set from id " + mId+ "!"); 
    if (mListener != null) 
     mListener.onDateSet(mId, view, year, month, dayOfMonth); 
    else 
     Log.w("Fragment/onDateSet", "But no listener available!");  
} 

并把它放在不同的片段不同的标签,因为现在你在同一个标​​签

newFragment.show(getFragmentManager(), "timePicker2"); 
0

标记他们,我没有得到答案,为什么上面的代码不起作用但经过网上搜索后,我发现了另一种非常有用的方法,用于在多个TextView中添加日期或时间。在这里,我在片段中添加了两个日期,同样的技术也适用于活动。

public class Medication extends Fragment implements View.OnClickListener{ 

    private DatePickerDialogFragment mDatePickerDialogFragment; 

    protected static TextView date1; 
    protected static TextView date2; 

    @Override 
    public View onCreateView(final LayoutInflater inflater, final ViewGroup  container, 
    Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_medication, container, false); 
    date1 = (TextView) view.findViewById(R.id.date1); 
    date2 = (TextView) view.findViewById(R.id.date2); 

    displayCurrentDate(); // display current date as default in date1 and date2 

    mDatePickerDialogFragment = new DatePickerDialogFragment(); 

    date1.setOnClickListener(this); 
    date2.setOnClickListener(this); 

    } 

    public void displayCurrentDate(){ 

    static Calendar calendar = Calendar.getInstance(); 
    private int year = calendar.get(Calendar.YEAR); // get current year 
    private int month = calendar.get(Calendar.MONTH);// get current month 
    private int day = calendar.get(Calendar.DAY_OF_MONTH); // get current day 

    calendar.set(year, month, day); 
    SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy"); 

    // display Current Date in date1 and date2 

    date1.setText(format.format(calendar.getTime())); 
    date2.setText(format.format(calendar.getTime()));   

    } 

    @Override 
    public void onClick(View v) { 

    int id = v.getId(); 

    if (id == R.id.date1) { 
    mDatePickerDialogFragment.setDateFlag(FLAG_DATE_ONE); 
    mDatePickerDialogFragment.show(getFragmentManager(), "datePicker1"); 
    }else if (id == R.id.date2) { 
    mDatePickerDialogFragment.setDateFlag(FLAG_DATE_TWO); 
    mDatePickerDialogFragment.show(getFragmentManager(), "datePicker2"); 
    } 
    } 

    public static class DatePickerDialogFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener { 
    protected static final int FLAG_DATE_ONE = 1; 
    protected static final int FLAG_DATE_TWO = 2; 
    private int flag = 0; 
    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     Calendar calendar = Calendar.getInstance(); 
     int year = calendar.get(Calendar.YEAR); 
     int month = calendar.get(Calendar.MONTH); 
     int day = calendar.get(Calendar.DAY_OF_MONTH); 

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

    public void setDateFlag(int i) { 
     flag = i; 
    } 

    @Override 
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
     Calendar calendar = Calendar.getInstance(); 
     calendar.set(year, monthOfYear, dayOfMonth); 
     SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy"); 
     if (flag == FLAG_DATE_ONE) { 
      date1.setText(format.format(calendar.getTime())); 
     } else if (flag == FLAG_DATE_TWO) { 
      date2.setText(format.format(calendar.getTime())); 
     } 
    } 
} 

} 

注:请添加机器人:可点击=“真”为使点击操作的XML布局每个TextView的,否则TextView的用户将无法点击。

我希望这会帮助别人:)