gpt4 book ai didi

java - 如何在同一个 onTimeSet() 中提取两个时间选择器对话框的小时和分钟?

转载 作者:行者123 更新时间:2023-11-29 23:01:53 25 4
gpt4 key购买 nike

我已经在 fragment 中实现了按钮按下时的时间选择器(工作)但是我如何提取两个对话框的小时和分钟以仅使用一个 onTimeSet() 来分隔变量, 它位于 MainActivity?

这是我的 MainActivity 中的 onTimeSet():

    public void onTimeSet(TimePicker timePicker, int i, int i1) {
TextView textView = (TextView)findViewById(R.id.textstart);
textView.setText("Hour: "+ i + " Minutes: "+ i1);

getSupportFragmentManager().getFragments();

}

这是我的工作 fragment :

Button timeButton = (Button) view.findViewById(R.id.timeButton);
timeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DialogFragment timePicker = new TimePicker_Fragment();
timePicker.show(getFragmentManager(), "Time Picker");
}
});

Button timeButton2 = (Button) view.findViewById(R.id.timeButton2);
timeButton2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DialogFragment timePicker2 = new TimePicker_Fragment();
timePicker2.show(getFragmentManager(), "Time Picker 2");
}
});

return view;
}

最佳答案

一种选择是更改应用程序的架构:

由于 TimePickerFragment 是唯一可以理解 onTimeSet() 中的 TimePicker 参数的,因此它是合乎逻辑的选择实现 TimePickerDialog.OnTimeSetListener

TimePicker_Fragment 的两个实例可以通过一些自定义接口(interface)向托管 WorkFragment(最终是 Activity)报告。使用一些唯一值(String 或枚举)在您的 onTimeSet() 自定义版本中识别它们。

例如,您的 Activity 可以实现如下方法:

@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;
}
// ...
}

...这将由 TimePicker_Fragment 中的“正常”onTimeSet(TimePicker, int, int) 的实现调用

@Override
void onTimeSet(TimePicker timePicker, int i, int i2){
((CustomTimePickerListener)getActivity()).onCustomTimeSet("TIME_PICKER_1", i, i2)
}

另一种选择是利用 TimePicker 是一个 View 这一事实,View 可以有一个 标签(可以是任何类型的 Object,请参阅 View.setTag())。

所以您可以让 TimePicker_FragmentTimePicker 设置一个标签

由于 TimePickerTimePickerDialog 的一部分,设置 tag 的最简单方法似乎是(再次)TimePicker_Fragment 实现TimePickerDialog.OnTimeSetListener。但这一次,Activity 可以实现相同的接口(interface):

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;
}
// ...
}


为三个相关组件实现第二种解决方案的代码:

主 Activity .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;
}
}
}

工作.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);
}
}

关于java - 如何在同一个 onTimeSet() 中提取两个时间选择器对话框的小时和分钟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56876162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com