package com.github.jjobes.slidedaytimepicker; import android.content.Context; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.EditText; import android.widget.NumberPicker; import android.widget.NumberPicker.OnValueChangeListener; /** * The fragment for the first page in the ViewPager that holds * the {@link CustomNumberPicker} for displaying the days. * * @author jjobes * */ public class DayFragment extends Fragment { /** * Used to communicate back to the parent fragment as the user * is changing the day spinner so we can dynamically update * the tab text. */ public interface DayChangedListener { void onDayChanged(int day); } private DayChangedListener mCallback; public DayFragment() { // Required empty public constructor for fragment. } /** * Cast the reference to {@link SlideDayTimeDialogFragment} to a * {@link DayChangedListener}. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { mCallback = (DayChangedListener) getTargetFragment(); } catch (ClassCastException e) { throw new ClassCastException("Calling fragment must implement " + "DayFragment.DayChangedListener interface"); } } /** * Return an instance of DayFragment with its bundle filled with the * constructor arguments. The values in the bundle are retrieved in * {@link #onCreateView()} below to properly initialize the DatePicker. * * @param theme * @param initialDay * @param isCustomDaysArraySpecified * @param customDaysArray * @return an instance of DayFragment */ public static final DayFragment newInstance( int theme, int initialDay, boolean isCustomDaysArraySpecified, String[] customDaysArray) { DayFragment f = new DayFragment(); Bundle b = new Bundle(); b.putInt("theme", theme); b.putInt("initialDay", initialDay); b.putBoolean("isCustomDaysArraySpecified", isCustomDaysArraySpecified); b.putStringArray("customDaysArray", customDaysArray); f.setArguments(b); return f; } /** * Create and return the user interface view for this fragment. */ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { int initialDay = getArguments().getInt("initialDay"); boolean isCustomDaysArraySpecified = getArguments().getBoolean("isCustomDaysArraySpecified"); String[] daysArray; if (isCustomDaysArraySpecified) { daysArray = getArguments().getStringArray("customDaysArray"); } else { daysArray = getResources().getStringArray(R.array.days_array); } // Unless we inflate using a cloned inflater with a Holo theme, // on Lollipop devices the TimePicker will be the new-style // radial TimePicker, which is not what we want. So we will // clone the inflater that we're given but with our specified // theme, then inflate the layout with this new inflater. int theme = getArguments().getInt("theme"); Context contextThemeWrapper = new ContextThemeWrapper( getActivity(), theme == SlideDayTimePicker.HOLO_DARK ? android.R.style.Theme_Holo : android.R.style.Theme_Holo_Light); LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper); View v = localInflater.inflate(R.layout.fragment_day, container, false); CustomNumberPicker dayPicker = (CustomNumberPicker) v.findViewById(R.id.dayPicker); // remove blinking cursor from NumberPicker enableNumberPickerEditing(dayPicker, false); // block keyboard popping up on touch dayPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS); dayPicker.setMinValue(0); dayPicker.setMaxValue(daysArray.length - 1); dayPicker.setDisplayedValues(daysArray); dayPicker.setValue(initialDay); dayPicker.setOnValueChangedListener(new OnValueChangeListener() { @Override public void onValueChange(NumberPicker picker, int oldVal, int newVal) { mCallback.onDayChanged(newVal); } }); return v; } /** * Enable or disable NumberPicker editing. We use this to turn * off editing and this has the effect of removing the blinking * cursor that is shown by default. */ private void enableNumberPickerEditing(NumberPicker numberPicker, boolean enable) { int childCount = numberPicker.getChildCount(); for (int i = 0; i < childCount; i++) { View childView = numberPicker.getChildAt(i); if (childView instanceof EditText) { EditText editText = (EditText) childView; editText.setFocusable(enable); return; } } } }