From b39572238619cf8c3ecd19583bc07ff57079851a Mon Sep 17 00:00:00 2001 From: Phillip Hsu Date: Wed, 13 Jul 2016 22:03:04 -0700 Subject: [PATCH] Numpad time picker saves instance state, used in edit alarm screen --- .../com/philliphsu/clock2/MainActivity.java | 14 +----- .../clock2/editalarm/EditAlarmActivity.java | 47 +++++++++++++++---- .../clock2/editalarm/GridLayoutNumpad.java | 13 +++++ .../clock2/editalarm/NumpadTimePicker.java | 32 ++++++++----- .../editalarm/NumpadTimePickerDialog.java | 43 +++++++++++------ .../clock2/editalarm/OnTimeSetListener.java | 18 ------- .../clock2/editalarm/TimePicker.java | 27 +++++++++++ .../clock2/util/DateFormatUtils.java | 8 ++++ .../res/layout/activity_edit_alarm_v2.xml | 9 ++-- .../res/layout/dialog_time_picker_numpad.xml | 33 +++++++------ app/src/main/res/values/styles.xml | 2 +- 11 files changed, 158 insertions(+), 88 deletions(-) delete mode 100644 app/src/main/java/com/philliphsu/clock2/editalarm/OnTimeSetListener.java create mode 100644 app/src/main/java/com/philliphsu/clock2/editalarm/TimePicker.java diff --git a/app/src/main/java/com/philliphsu/clock2/MainActivity.java b/app/src/main/java/com/philliphsu/clock2/MainActivity.java index 44c895b..5df54c6 100644 --- a/app/src/main/java/com/philliphsu/clock2/MainActivity.java +++ b/app/src/main/java/com/philliphsu/clock2/MainActivity.java @@ -8,8 +8,6 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.ViewPager; -import android.text.format.DateFormat; -import android.util.Log; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; @@ -17,8 +15,7 @@ import android.view.ViewGroup; import android.widget.TextView; import com.philliphsu.clock2.alarms.AlarmsFragment; -import com.philliphsu.clock2.editalarm.NumpadTimePickerDialog; -import com.philliphsu.clock2.editalarm.OnTimeSetListener; +import com.philliphsu.clock2.editalarm.EditAlarmActivity; import com.philliphsu.clock2.settings.SettingsActivity; import butterknife.Bind; @@ -58,14 +55,6 @@ public class MainActivity extends BaseActivity { mFab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - NumpadTimePickerDialog tpd = NumpadTimePickerDialog.newInstance(new OnTimeSetListener() { - @Override - public void onTimeSet(ViewGroup viewGroup, int hourOfDay, int minute) { - Log.i(TAG, "Time set: " + String.format("%02d:%02d", hourOfDay, minute)); - } - }, 0, 0, DateFormat.is24HourFormat(MainActivity.this)); - tpd.show(getFragmentManager(), "tag"); - /* Intent intent = new Intent(MainActivity.this, EditAlarmActivity.class); // Call Fragment#startActivityForResult() instead of Activity#startActivityForResult() // because we want the result to be handled in the Fragment, not in this Activity. @@ -73,7 +62,6 @@ public class MainActivity extends BaseActivity { // Fragment's onActivityResult() will NOT be called. mSectionsPagerAdapter.getCurrentFragment() .startActivityForResult(intent, AlarmsFragment.REQUEST_CREATE_ALARM); - */ } }); } diff --git a/app/src/main/java/com/philliphsu/clock2/editalarm/EditAlarmActivity.java b/app/src/main/java/com/philliphsu/clock2/editalarm/EditAlarmActivity.java index ac323ca..980a707 100644 --- a/app/src/main/java/com/philliphsu/clock2/editalarm/EditAlarmActivity.java +++ b/app/src/main/java/com/philliphsu/clock2/editalarm/EditAlarmActivity.java @@ -36,6 +36,7 @@ import com.philliphsu.clock2.model.AlarmLoader; import com.philliphsu.clock2.ringtone.RingtoneActivity; import com.philliphsu.clock2.util.AlarmController; import com.philliphsu.clock2.util.AlarmUtils; +import com.philliphsu.clock2.util.DateFormatUtils; import com.philliphsu.clock2.util.LocalBroadcastHelper; import java.util.Date; @@ -50,7 +51,6 @@ import static android.view.View.GONE; import static android.view.View.VISIBLE; import static com.philliphsu.clock2.DaysOfWeek.SATURDAY; import static com.philliphsu.clock2.DaysOfWeek.SUNDAY; -import static com.philliphsu.clock2.util.KeyboardUtils.hideKeyboard; import static com.philliphsu.clock2.util.Preconditions.checkNotNull; /** @@ -59,17 +59,19 @@ import static com.philliphsu.clock2.util.Preconditions.checkNotNull; * The class would have the API for editing the alarm, so move all * the relevant helper methods from here to there. */ -public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyListener, +public class EditAlarmActivity extends BaseActivity implements + AlarmNumpad.KeyListener, // TODO: Deprecated, remove EditAlarmContract.View, // TODO: Remove @Override from the methods AlarmUtilsHelper, SharedPreferencesHelper, LoaderManager.LoaderCallbacks, - OnTimeSetListener { + NumpadTimePicker.OnTimeSetListener { private static final String TAG = "EditAlarmActivity"; public static final String EXTRA_ALARM_ID = "com.philliphsu.clock2.editalarm.extra.ALARM_ID"; public static final String EXTRA_MODIFIED_ALARM = "com.philliphsu.clock2.editalarm.extra.MODIFIED_ALARM"; public static final String EXTRA_IS_DELETING = "com.philliphsu.clock2.editalarm.extra.IS_DELETING"; private static final RelativeSizeSpan AMPM_SIZE_SPAN = new RelativeSizeSpan(0.5f); + private static final String TAG_TIME_PICKER = "time_picker"; private static final int REQUEST_PICK_RINGTONE = 0; private static final int ID_MENU_ITEM = 0; @@ -77,12 +79,14 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi private long mOldAlarmId; private Uri mSelectedRingtoneUri; private Alarm mOldAlarm; + private int mSelectedHourOfDay = -1; + private int mSelctedMinute = -1; @Bind(R.id.main_content) CoordinatorLayout mMainContent; @Bind(R.id.save) Button mSave; @Bind(R.id.delete) Button mDelete; @Bind(R.id.on_off) SwitchCompat mSwitch; - @Bind(R.id.input_time) EditText mTimeText; + @Bind(R.id.input_time) TextView mTimeText; @Bind({R.id.day0, R.id.day1, R.id.day2, R.id.day3, R.id.day4, R.id.day5, R.id.day6}) ToggleButton[] mDays; @Bind(R.id.label) EditText mLabel; @@ -92,7 +96,9 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi @Override public void onTimeSet(ViewGroup viewGroup, int hourOfDay, int minute) { - Log.i(TAG, "Time set: " + String.format("%02d:%02d", hourOfDay, minute)); + mSelectedHourOfDay = hourOfDay; + mSelctedMinute = minute; + showTimeText(DateFormatUtils.formatTime(this, hourOfDay, minute)); } @Override @@ -114,6 +120,19 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi setTimeTextHint(); // TODO: private access } + @Override + protected void onResume() { + super.onResume(); + // Was the time picker in our backstack? It could have been if it was showing + // and the device had rotated. + NumpadTimePickerDialog picker = (NumpadTimePickerDialog) + getFragmentManager().findFragmentByTag(TAG_TIME_PICKER); + if (picker != null) { + // Restore the callback + picker.setOnTimeSetListener(this); + } + } + @Override public boolean onPrepareOptionsMenu(Menu menu) { // TODO: Snooze menu item when alarm is ringing. @@ -206,6 +225,7 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi showTimeTextPostBackspace(""); } + /* // TODO: remove @OnTouch(R.id.input_time) boolean touch(MotionEvent event) { if (event.getActionMasked() == MotionEvent.ACTION_UP) { @@ -220,6 +240,7 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi } return true; } + */ @OnClick(R.id.ringtone) void ringtone() { @@ -336,6 +357,12 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi */ } + @OnClick(R.id.input_time) + void openTimePicker() { + NumpadTimePickerDialog picker = NumpadTimePickerDialog.newInstance(EditAlarmActivity.this); + picker.show(getFragmentManager(), TAG_TIME_PICKER); + } + private void setWeekDaysText() { for (int i = 0; i < mDays.length; i++) { int weekDay = DaysOfWeek.getInstance(this).weekDayAt(i); @@ -488,13 +515,14 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi } else { mTimeText.setText(formattedInput); } - mTimeText.setSelection(mTimeText.length()); +//TODO:delete mTimeText.setSelection(mTimeText.length()); } + @Deprecated // TODO: Remove @Override public void showTimeTextPostBackspace(String newStr) { mTimeText.setText(newStr); - mTimeText.setSelection(mTimeText.length()); +//TODO:delete mTimeText.setSelection(mTimeText.length()); if (!mNumpad.checkTimeValid() && mSwitch.isChecked()) { mSwitch.setChecked(false); } @@ -519,7 +547,7 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi if (focused) { mTimeText.requestFocus(); // Move cursor to end - mTimeText.setSelection(mTimeText.length()); +//TODO:delete mTimeText.setSelection(mTimeText.length()); } else { mTimeText.clearFocus(); // TODO: not cleared! focus needs to go to a neighboring view. } @@ -581,7 +609,8 @@ public class EditAlarmActivity extends BaseActivity implements AlarmNumpad.KeyLi // TODO default values showTimeTextFocused(true); showRingtone(""); // gets default ringtone - showNumpad(true); + // TODO: Show the dialog instead + //showNumpad(true); } } } diff --git a/app/src/main/java/com/philliphsu/clock2/editalarm/GridLayoutNumpad.java b/app/src/main/java/com/philliphsu/clock2/editalarm/GridLayoutNumpad.java index 7e318d1..26c2a71 100644 --- a/app/src/main/java/com/philliphsu/clock2/editalarm/GridLayoutNumpad.java +++ b/app/src/main/java/com/philliphsu/clock2/editalarm/GridLayoutNumpad.java @@ -90,6 +90,15 @@ public abstract class GridLayoutNumpad extends GridLayout implements View.OnClic return mInput[index]; } + /** + * @return a defensive copy of the internal array of inputted digits + */ + protected final int[] getDigits() { + int[] digits = new int[mInput.length]; + System.arraycopy(mInput, 0, digits, 0, mInput.length); + return digits; + } + /** * @return the number of digits inputted */ @@ -184,10 +193,14 @@ public abstract class GridLayoutNumpad extends GridLayout implements View.OnClic * with the String value of those digits. */ protected final void insertDigits(int... digits) { + if (digits == null) + return; String newDigits = ""; for (int d : digits) { if (mCount == mInput.length) break; + if (d == UNMODIFIED) + continue; mInput[mCount++] = d; newDigits += d; } diff --git a/app/src/main/java/com/philliphsu/clock2/editalarm/NumpadTimePicker.java b/app/src/main/java/com/philliphsu/clock2/editalarm/NumpadTimePicker.java index 94cde07..6d83d40 100644 --- a/app/src/main/java/com/philliphsu/clock2/editalarm/NumpadTimePicker.java +++ b/app/src/main/java/com/philliphsu/clock2/editalarm/NumpadTimePicker.java @@ -19,7 +19,7 @@ import butterknife.OnClick; /** * Created by Phillip Hsu on 7/12/2016. */ -public class NumpadTimePicker extends GridLayoutNumpad { +public class NumpadTimePicker extends GridLayoutNumpad implements TimePicker { // Time can be represented with maximum of 4 digits private static final int MAX_DIGITS = 4; @@ -101,8 +101,7 @@ public class NumpadTimePicker extends GridLayoutNumpad { mFormattedInput.delete(mFormattedInput.indexOf(" "), len); // No digit was actually deleted, but we have to notify the // listener to update its output. - /*TOneverDO: remove super*/super.onDigitDeleted( - mFormattedInput.toString()); +/*TOneverDO: remove super*/super.onDigitDeleted(mFormattedInput.toString()); updateNumpadStates(); } else { super.delete(); @@ -110,9 +109,10 @@ public class NumpadTimePicker extends GridLayoutNumpad { } /** Returns the hour of day (0-23) regardless of clock system */ - public int getHours() { + @Override + public int hourOfDay() { if (!checkTimeValid()) - throw new IllegalStateException("Cannot call getHours() until legal time inputted"); + throw new IllegalStateException("Cannot call hourOfDay() until legal time inputted"); int hours = count() < 4 ? valueAt(0) : valueAt(0) * 10 + valueAt(1); if (hours == 12) { switch (mAmPmState) { @@ -130,9 +130,10 @@ public class NumpadTimePicker extends GridLayoutNumpad { return hours + (mAmPmState == PM ? 12 : 0); } - public int getMinutes() { + @Override + public int minute() { if (!checkTimeValid()) - throw new IllegalStateException("Cannot call getMinutes() until legal time inputted"); + throw new IllegalStateException("Cannot call minute() until legal time inputted"); return count() < 4 ? valueAt(1) * 10 + valueAt(2) : valueAt(2) * 10 + valueAt(3); } @@ -179,6 +180,7 @@ public class NumpadTimePicker extends GridLayoutNumpad { amPmState = HRS_24; } + /* // Convert the hour and minutes into text form, so that // we can read each digit individually. // Only if on 24-hour clock, zero-pad single digit hours. @@ -192,8 +194,14 @@ public class NumpadTimePicker extends GridLayoutNumpad { for (int i = 0; i < textDigits.length(); i++) { digits[i] = Character.digit(textDigits.charAt(i), BASE_10); } - insertDigits(digits); + */ + + if (is24HourFormat() || hours > 9) { + insertDigits(hours / 10, hours % 10, minutes / 10, minutes % 10); + } else { + insertDigits(hours, minutes / 10, minutes % 10); + } mAmPmState = amPmState; if (mAmPmState != HRS_24) { @@ -236,15 +244,17 @@ public class NumpadTimePicker extends GridLayoutNumpad { mFormattedInput.append(' ').append(altBtn.getText()); mAmPmState = mAltButtons[0] == altBtn ? AM : PM; // Digits will be shown for you on insert, but not AM/PM - /*TOneverDO: remove super*/super.onDigitInserted( - mFormattedInput.toString()); +/*TOneverDO: remove super*/super.onDigitInserted(mFormattedInput.toString()); } else { CharSequence text = altBtn.getText(); int[] digits = new int[text.length() - 1]; // charAt(0) is the colon, so skip i = 0. // We are only interested in storing the digits. for (int i = 1; i < text.length(); i++) { - digits[i] = Character.digit(text.charAt(i), BASE_10); + // The array and the text do not have the same lengths, + // so the iterator value does not correspond to the + // array index directly + digits[i - 1] = Character.digit(text.charAt(i), BASE_10); } // Colon is added for you insertDigits(digits); diff --git a/app/src/main/java/com/philliphsu/clock2/editalarm/NumpadTimePickerDialog.java b/app/src/main/java/com/philliphsu/clock2/editalarm/NumpadTimePickerDialog.java index 1901848..ff73d5c 100644 --- a/app/src/main/java/com/philliphsu/clock2/editalarm/NumpadTimePickerDialog.java +++ b/app/src/main/java/com/philliphsu/clock2/editalarm/NumpadTimePickerDialog.java @@ -28,12 +28,17 @@ public class NumpadTimePickerDialog extends DialogFragment private static final String KEY_HOUR_OF_DAY = "hour_of_day"; private static final String KEY_MINUTE = "minute"; private static final String KEY_IS_24_HOUR_VIEW = "is_24_hour_view"; + private static final String KEY_DIGITS_INPUTTED = "digits_inputted"; - private OnTimeSetListener mCallback; + private TimePicker.OnTimeSetListener mCallback; private int mInitialHourOfDay; private int mInitialMinute; private boolean mIs24HourMode; + /** + * The digits stored in the numpad from the last time onSaveInstanceState() was called + */ + private int[] mInputtedDigits; @Bind(R.id.backspace) ImageButton mBackspace; @Bind(R.id.input) EditText mInputField; @@ -46,14 +51,23 @@ public class NumpadTimePickerDialog extends DialogFragment } // TODO: We don't need to pass in an initial hour and minute for a new instance. - public static NumpadTimePickerDialog newInstance(OnTimeSetListener callback, + // TODO: Delete is24HourMode? + @Deprecated + public static NumpadTimePickerDialog newInstance(TimePicker.OnTimeSetListener callback, int hourOfDay, int minute, boolean is24HourMode) { NumpadTimePickerDialog ret = new NumpadTimePickerDialog(); ret.initialize(callback, hourOfDay, minute, is24HourMode); return ret; } - public void initialize(OnTimeSetListener callback, + public static NumpadTimePickerDialog newInstance(TimePicker.OnTimeSetListener callback) { + NumpadTimePickerDialog ret = new NumpadTimePickerDialog(); + ret.setOnTimeSetListener(callback); + return ret; + } + + @Deprecated + public void initialize(TimePicker.OnTimeSetListener callback, int hourOfDay, int minute, boolean is24HourMode) { mCallback = callback; mInitialHourOfDay = hourOfDay; @@ -61,18 +75,15 @@ public class NumpadTimePickerDialog extends DialogFragment mIs24HourMode = is24HourMode; } - public void setOnTimeSetListener(OnTimeSetListener callback) { + public void setOnTimeSetListener(TimePicker.OnTimeSetListener callback) { mCallback = callback; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (savedInstanceState != null && savedInstanceState.containsKey(KEY_HOUR_OF_DAY) - && savedInstanceState.containsKey(KEY_MINUTE) - && savedInstanceState.containsKey(KEY_IS_24_HOUR_VIEW)) { - mInitialHourOfDay = savedInstanceState.getInt(KEY_HOUR_OF_DAY); - mInitialMinute = savedInstanceState.getInt(KEY_MINUTE); + if (savedInstanceState != null) { + mInputtedDigits = savedInstanceState.getIntArray(KEY_DIGITS_INPUTTED); mIs24HourMode = savedInstanceState.getBoolean(KEY_IS_24_HOUR_VIEW); } } @@ -81,12 +92,14 @@ public class NumpadTimePickerDialog extends DialogFragment public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE); + View view = inflater.inflate(R.layout.dialog_time_picker_numpad, container, false); ButterKnife.bind(this, view); - mNumpad.setOnInputChangeListener(this); - //mNumpad.setTime(mInitialHourOfDay, mInitialMinute); - // TODO: Write numpad method set24HourMode() and use mIs24HourMode + mNumpad.setOnInputChangeListener(this); + mNumpad.insertDigits(mInputtedDigits); // TOneverDO: before mNumpad.setOnInputChangeListener(this); + // TODO: Disabled color + updateInputText(""); // Primarily to disable 'OK' return view; } @@ -94,8 +107,7 @@ public class NumpadTimePickerDialog extends DialogFragment @Override public void onSaveInstanceState(Bundle outState) { if (mNumpad != null) { - outState.putInt(KEY_HOUR_OF_DAY, mNumpad.getHours()); - outState.putInt(KEY_MINUTE, mNumpad.getMinutes()); + outState.putIntArray(KEY_DIGITS_INPUTTED, mNumpad.getDigits()); outState.putBoolean(KEY_IS_24_HOUR_VIEW, mIs24HourMode); //outState.putBoolean(KEY_DARK_THEME, mThemeDark); } @@ -125,7 +137,7 @@ public class NumpadTimePickerDialog extends DialogFragment void ok() { if (!mNumpad.checkTimeValid()) return; - mCallback.onTimeSet(mNumpad, mNumpad.getHours(), mNumpad.getMinutes()); + mCallback.onTimeSet(mNumpad, mNumpad.hourOfDay(), mNumpad.minute()); dismiss(); } @@ -142,5 +154,6 @@ public class NumpadTimePickerDialog extends DialogFragment private void updateInputText(String inputText) { mInputField.setText(inputText); + mOkButton.setEnabled(mNumpad.checkTimeValid()); } } diff --git a/app/src/main/java/com/philliphsu/clock2/editalarm/OnTimeSetListener.java b/app/src/main/java/com/philliphsu/clock2/editalarm/OnTimeSetListener.java deleted file mode 100644 index 5b475ec..0000000 --- a/app/src/main/java/com/philliphsu/clock2/editalarm/OnTimeSetListener.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.philliphsu.clock2.editalarm; - -import android.view.ViewGroup; - -/** - * Created by Phillip Hsu on 7/12/2016. - * - * The callback interface used to indicate the user is done filling in - * the time (they clicked on the 'Set' button). - */ -public interface OnTimeSetListener { - /** - * @param viewGroup The view associated with this listener. - * @param hourOfDay The hour that was set. - * @param minute The minute that was set. - */ - void onTimeSet(ViewGroup viewGroup, int hourOfDay, int minute); -} diff --git a/app/src/main/java/com/philliphsu/clock2/editalarm/TimePicker.java b/app/src/main/java/com/philliphsu/clock2/editalarm/TimePicker.java new file mode 100644 index 0000000..ff48a96 --- /dev/null +++ b/app/src/main/java/com/philliphsu/clock2/editalarm/TimePicker.java @@ -0,0 +1,27 @@ +package com.philliphsu.clock2.editalarm; + +import android.view.ViewGroup; + +/** + * Created by Phillip Hsu on 7/12/2016. + * + * The callback interface used to indicate the user is done filling in + * the time (they clicked on the 'Set' button). + */ +public interface TimePicker { + int hourOfDay(); + int minute(); + + /** + * The callback interface used to indicate the user is done filling in + * the time (they clicked on the 'Set' button). + */ + interface OnTimeSetListener { + /** + * @param viewGroup The view associated with this listener. + * @param hourOfDay The hour that was set. + * @param minute The minute that was set. + */ + void onTimeSet(ViewGroup viewGroup, int hourOfDay, int minute); + } +} diff --git a/app/src/main/java/com/philliphsu/clock2/util/DateFormatUtils.java b/app/src/main/java/com/philliphsu/clock2/util/DateFormatUtils.java index 488e105..20eb7e0 100644 --- a/app/src/main/java/com/philliphsu/clock2/util/DateFormatUtils.java +++ b/app/src/main/java/com/philliphsu/clock2/util/DateFormatUtils.java @@ -2,6 +2,7 @@ package com.philliphsu.clock2.util; import android.content.Context; +import java.util.Calendar; import java.util.Date; import static android.text.format.DateFormat.getTimeFormat; @@ -16,4 +17,11 @@ public final class DateFormatUtils { public static String formatTime(Context context, long millis) { return getTimeFormat(context).format(new Date(millis)); } + + public static String formatTime(Context context, int hourOfDay, int minute) { + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.HOUR_OF_DAY, hourOfDay); + cal.set(Calendar.MINUTE, minute); + return formatTime(context, cal.getTimeInMillis()); + } } diff --git a/app/src/main/res/layout/activity_edit_alarm_v2.xml b/app/src/main/res/layout/activity_edit_alarm_v2.xml index 57b6ff6..f97bdad 100644 --- a/app/src/main/res/layout/activity_edit_alarm_v2.xml +++ b/app/src/main/res/layout/activity_edit_alarm_v2.xml @@ -85,17 +85,14 @@ android:layout_alignParentEnd="true" android:layout_centerVertical="true"/> - - + android:layout_toStartOf="@id/on_off"/> diff --git a/app/src/main/res/layout/dialog_time_picker_numpad.xml b/app/src/main/res/layout/dialog_time_picker_numpad.xml index ac0fd18..cc5e73b 100644 --- a/app/src/main/res/layout/dialog_time_picker_numpad.xml +++ b/app/src/main/res/layout/dialog_time_picker_numpad.xml @@ -5,8 +5,8 @@ + android:focusableInTouchMode="false" + android:cursorVisible="true"/> + + + + android:layout_below="@id/number_grid">