Один из вариантов - изменить архитектуру вашего приложения:
Поскольку TimePickerFragment
- единственный параметр, который может иметь смысл для параметра TimePicker
в onTimeSet()
, это логический выбор дляреализация TimePickerDialog.OnTimeSetListener
.
Два экземпляра TimePicker_Fragment
могут сообщать хосту WorkFragment
(и в конечном итоге Activity
) через некоторый пользовательский интерфейс (ы).Используйте какое-то уникальное значение (String
или перечисление), чтобы идентифицировать их в вашей пользовательской версии onTimeSet()
.
Например, ваша деятельность может реализовать метод следующим образом:
@Override
void onCustomTimeSet(String timePickerId, int hour, int minutes){
switch(timePickerId){
case "TIME_PICKER":
// code for time picker 1 here
break;
case "TIME_PICKER_2":
// code for time picker 1 here
break;
}
// ...
}
... который будет вызван реализацией "normal" onTimeSet(TimePicker, int, int)
в TimePicker_Fragment
@Override
void onTimeSet(TimePicker timePicker, int i, int i2){
((CustomTimePickerListener)getActivity()).onCustomTimeSet("TIME_PICKER_1", i, i2)
}
Другой вариант - воспользоваться тем фактом, что TimePicker
- это View
, а View
s может иметь тег (который может быть любымтип Object
, см. View.setTag () ).
Таким образом, вы можете TimePicker_Fragment
установить тег в TimePicker
.
Поскольку TimePicker
является частью TimePickerDialog
, самый простой способ установить тег , по-видимому, состоит в том, чтобы (снова) TimePicker_Fragment
реализовать TimePickerDialog.OnTimeSetListener
.Но на этот раз Activity
может реализовать тот же интерфейс:
Код в TimePicker_Fragment
void onTimeSet(TimePicker timePicker, int i, int i2){
timePicker.setTag("TIME_PICKER");
((TimePickerDialog.OnTimeSetListener)getActivity()).onTimeSet(timePicker, i, i2);
}
Код в Activity
void onTimeSet(TimePicker timePicker, int i, int i2){
String tag = (String)timePicker.getTag();
switch(tag){
case "TIME_PICKER":
// code for time picker 1 here
break;
case "TIME_PICKER_2":
// code for time picker 2 here
break;
}
// ...
}
Код, реализующий второе решение для трех соответствующих компонентов:
MainActivity.java
public class MainActivity extends AppCompatActivity implements TimePickerDialog.OnTimeSetListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, new Work()).commit();
}
public void onTimeSet(TimePicker timePicker, int i, int i1){
String tag = (String)timePicker.getTag();
switch(tag){
case TIME_PICKER:
TextView textView = (TextView)findViewById(R.id.textstart);
textView.setText("Start Hour: "+ i + " Minutes: "+ i1);
break;
case TIME_PICKER_2:
TextView textView2 = (TextView)findViewById(R.id.textend);
textView2.setText("Start Hour: "+ i + " Minutes: "+ i1);
break;
}
}
}
Work.java
public class Work extends Fragment {
public static final String TIME_PICKER = "TIME_PICKER";
public static final String TIME_PICKER_2 = "TIME_PICKER_2";
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.frag_work, container, false);
getActivity().setTitle("Work");
Button timeButton = (Button) view.findViewById(R.id.btn1);
timeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DialogFragment timePicker = TimePicker_Fragment.instance(TIME_PICKER);
timePicker.show(getFragmentManager(), "Time Picker");
}
});
Button timeButton2 = (Button) view.findViewById(R.id.btn2);
timeButton2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DialogFragment timePicker2 =TimePicker_Fragment.instance(TIME_PICKER_2);
timePicker2.show(getFragmentManager(), "Time Picker 2");
}
});
return view;
}
}
TimePicker_Fragment.java
public class TimePicker_Fragment extends DialogFragment implements TimePickerDialog.OnTimeSetListener {
private static final String KEY_TIMEPICKER_TAG = "KEY_TIMEPICKER_TAG";
/**
*
* @param timePickerTag the tag by which you can identify a TimePicker.
* Will be set as tag to the TimePicker View in onTimeSet()
* @return x
*/
public static TimePicker_Fragment instance(String timePickerTag){
TimePicker_Fragment fragment = new TimePicker_Fragment();
Bundle b = new Bundle();
b.putString(KEY_TIMEPICKER_TAG, timePickerTag);
fragment.setArguments(b);
return fragment;
}
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
Calendar c = Calendar.getInstance();
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
Context ctx = getContext();
return new TimePickerDialog(ctx, this, hour, minute, DateFormat.is24HourFormat(ctx));
}
public void onTimeSet(TimePicker timePicker, int i, int i2){
Bundle b = getArguments();
assert b != null;
timePicker.setTag(b.getString(KEY_TIMEPICKER_TAG));
((TimePickerDialog.OnTimeSetListener)getActivity()).onTimeSet(timePicker, i, i2);
}
}