繁体   English   中英

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

[英]How do I extract the hours and minutes of two time picker dialogs in the same onTimeSet()?

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

这是我的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();

    }

这是我的Work片段:

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的两个实例可以通过一些自定义接口向托管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;
    }
    // ...
}

...这将通过“正常”的实施被称为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可以有一个标签(可以是任何类型的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;
    }
    // ...
}


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

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

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

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

我不确定我是否理解这个问题。

您是否尝试过类似的操作(不确定确切的语法):

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

您还可以向TimePicker_Fragment构造函数添加一个侦听器,以在更新时获取新的小时和分钟。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM