2016-12-03 6 views
0

この質問のMHの答えに続く別のTextViewsの別の日付をTimePicker onTimeSet not being calledに表示しようとしていますが、フラグメントの結果が一致しません。複数のTextViewsで日付を設定するコードが機能しない

私はコールバックメソッドとして使用され、フラグメントクラスMedicationで定義されているInterfaceクラスを使用している別のDatePickerFragmentクラスを追加しました。

フラグメントに複数の日付ピッカーを設定するにはどうすればよいですか?

DatePickerFragmentは次のように書かれている:私は時間ピッカーに対して複数のピッカを追加するこの方法を試みた

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

:このdatepickerdialogを使用するフラグメントクラスの薬物が、次のコードを有する

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

ダイアログも同様ですが、MedicationクラスのonTimeSetメソッドがここのonDateSetのように呼び出されていないという同じ問題が発生します。

問題は、textViewをクリックするとダイアログが開きますが、日付を変更してもそのtextViewの日付は変更されません。また、のonDateSetメソッドが呼び出されていないため、ログ情報メッセージは表示されません。 このケースでは、mListenerがnullであるかもしれませんが、推測しかできません。 この問題を解決するのを手伝ってください。前もって感謝します。

答えて

0

フラグメントのonDateSetにいくつかのログを追加して、そこに設定されている値とそれがリスナーを呼び出すかどうかを確認してください。今あなたが同じタグ

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

でそれらをマークしているので、私は、なぜコード上記に対する答えは動作しません取得していない

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

と異なる断片に対して異なるタグを入れてみてください、しかし、ネット上でいくつかの検索を行った後、複数のTextViewに日付や時刻を追加するための非常に便利な方法が見つかりました。ここで私は断片的に2つの日付を追加しています。同様のテクニックもアクティビティに適用されます。

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のためのクリッカブル=「true」を、それ以外のTextViewはクリックできません。

他人に役立つことを願っています:)

関連する問題