How to add timePicker using snippet?

I have 4 timePicker in my application. The timePicker dialog timePicker pop up when the user double-clicks on editText . But sometimes, when I accidentally click more than two times, the application crashes and says that the fragment has already been added. How can i fix this? If you double-click on editText, I want the timePicker dialog box to be shown with one click of the editText button.

 public void onClick(View v) { int id = v.getId(); if (id == R.id.editTextTI1) { tp.setFlag(TimePick.FLAG_START_DATE); FragmentTransaction ft = getFragmentManager().beginTransaction(); tp.show(ft, "TimePicker"); } if (id == R.id.editTextTO1) { tp.setFlag(TimePick.FLAG_END_DATE); FragmentTransaction ft = getFragmentManager().beginTransaction(); tp.show(ft, "TimePicker"); } if (id == R.id.editTextTI2) { tp.setFlag(TimePick.FLAG_START_DATE1); FragmentTransaction ft = getFragmentManager().beginTransaction(); tp.show(ft, "TimePicker"); } if (id == R.id.editTextTO2) { tp.setFlag(TimePick.FLAG_END_DATE1); FragmentTransaction ft = getFragmentManager().beginTransaction(); tp.show(ft, "TimePicker"); } if (id == R.id.editTextTI3) { tp.setFlag(TimePick.FLAG_START_DATE2); FragmentTransaction ft = getFragmentManager().beginTransaction(); tp.show(ft, "TimePicker"); } if (id == R.id.editTextTO3) { tp.setFlag(TimePick.FLAG_END_DATE2); FragmentTransaction ft = getFragmentManager().beginTransaction(); tp.show(ft, "TimePicker"); } if (id == R.id.editTextTI4) { tp.setFlag(TimePick.FLAG_START_DATE3); FragmentTransaction ft = getFragmentManager().beginTransaction(); tp.show(ft, "TimePicker"); } if (id == R.id.editTextTO4) { tp.setFlag(TimePick.FLAG_END_DATE3); FragmentTransaction ft = getFragmentManager().beginTransaction(); tp.show(ft, "TimePicker"); } } public static class TimePick extends android.app.DialogFragment implements TimePickerDialog.OnTimeSetListener { public static final int FLAG_START_DATE = 00; public static final int FLAG_END_DATE = 01; public static final int FLAG_START_DATE1 = 10; public static final int FLAG_END_DATE1 = 11; public static final int FLAG_START_DATE2 = 20; public static final int FLAG_END_DATE2 = 21; public static final int FLAG_START_DATE3 = 30; public static final int FLAG_END_DATE3 = 31; private int flag = 00; @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Calendar c = Calendar.getInstance(); int hour = c.get(Calendar.HOUR_OF_DAY); int minute = c.get(Calendar.MINUTE); return new TimePickerDialog(getActivity(), this, hour, minute, DateFormat.is24HourFormat(getActivity())); } public void setFlag(int i) { flag = i; } @Override public void onTimeSet(TimePicker view, int hourofDay, int minute) { if (flag == FLAG_START_DATE) { start.setText(Integer.toString(hourofDay) + ":" + Integer.toString(minute)); b = start.getText().toString(); } if (flag == FLAG_END_DATE) { end.setText(Integer.toString(hourofDay) + ":" + Integer.toString(minute)); c = end.getText().toString(); } if (flag == FLAG_START_DATE1) { start1.setText(Integer.toString(hourofDay) + ":" + Integer.toString(minute)); d = start1.getText().toString(); } if (flag == FLAG_END_DATE1) { end1.setText(Integer.toString(hourofDay) + ":" + Integer.toString(minute)); e1 = end1.getText().toString(); } if (flag == FLAG_START_DATE2) { start2.setText(Integer.toString(hourofDay) + ":" + Integer.toString(minute)); f = start2.getText().toString(); } if (flag == FLAG_END_DATE2) { end2.setText(Integer.toString(hourofDay) + ":" + Integer.toString(minute)); g = end2.getText().toString(); } if (flag == FLAG_START_DATE3) { start3.setText(Integer.toString(hourofDay) + ":" + Integer.toString(minute)); h = start3.getText().toString(); } if (flag == FLAG_END_DATE3) { end3.setText(Integer.toString(hourofDay) + ":" + Integer.toString(minute)); i = end3.getText().toString(); } 

LogCat Error

 10-15 12:53:17.113 7943-7943/com.example.project.project E/AndroidRuntime﹕ FATAL EXCEPTION: main Process: com.example.project.project, PID: 7943 java.lang.IllegalStateException: Fragment already added: TimePick{7c7eb96 #0 TimePicker} at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1219) at android.app.BackStackRecord.run(BackStackRecord.java:715) at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535) at android.app.FragmentManagerImpl$1.run(FragmentManager.java:482) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) 
+5
source share
2 answers

Your code is so hard-coded and not easy to distribute that it can lead to numerous errors in the future. You should encapsulate the general logic as much as possible, so in the current case:

  public void onClick(View v) { EditText editText = (EditText) v; if (tp==null || !tp.isAdded()){ FragmentTransaction ft = getFragmentManager().beginTransaction(); tp = new TimePick(editText); tp.show(ft, "TimePicker"); } } @Override public void onStop() { super.onStop(); if (tp.isAdded()) tp.dismiss(); } public static class TimePick extends android.app.DialogFragment implements TimePickerDialog.OnTimeSetListener { private EditText editText; public TimePick(EditText editText) { this.editText = editText; } @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Calendar c = Calendar.getInstance(); int hour = c.get(Calendar.HOUR_OF_DAY); int minute = c.get(Calendar.MINUTE); return new TimePickerDialog(getActivity(), this, hour, minute, DateFormat.is24HourFormat(getActivity())); } @Override public void onTimeSet(TimePicker view, int hourofDay, int minute) { editText.setText(Integer.toString(hourofDay) + ":" + Integer.toString(minute)); } } 

this code will not try to create a new timer if it is on the screen. You can pass the target text to a timePicker fragment. When you need values ​​from these edittexts (your variables a, b, c, d ...), you can read them when necessary, and not in onTimeSetMethod.

onStop has been provided to handle leisure events. Here I just hide the active timer.

+2
source

You add the same DialogFragment instance twice to fix this, check if TimePicker added using getFragmentManager.findFragmentByTag("TimePicker") .

+1
source

Source: https://habr.com/ru/post/1233783/


All Articles