実現したいこと
ここに実現したいことを箇条書きで書いてください。
- 他のEditTextのキーボドが立ち上がったまま、DatePickerを立ち上げるとキーボードがさがらないです。同じ動作をNumberPickerで行うとキーボードは下がるので、その違いが知りたいです。
前提
ユーザーの入力画面で、
EditTextに
・DatePicker
・EditText
・NumberPicker
の順で並べています。
EditTextから入力するとキーボードが立ち上がり、
その後DatePickerをタップするとDatePickerが立ち上がりますが、
最初に開いたキーボードが立ち上がったままになってしまいます。
同じように、EditTextから入力しキーボードが立ち上がった状態で
NumberPickerを開くとキーボードは下がります。
一応解決策として、
DatePickerをクリック時にキーボードを非表示にする処理を書くとキーボードは消えるのですが、何故NumberPickerの時はキーボードが勝手に下がり、DatePickerだと下がらないのか気になってしまい、調べてもわからなかったので質問いたしました。
該当のソースコード
DatePicerもNumberPickerも、ともに DialogFragment()を継承しています。
・DatePicker
Kotlin
1class DatePickerDialogFragment(private val editText: EditText) : DialogFragment(), DatePickerDialog.OnDateSetListener { 2 3 var setYear = 0 4 var setMonth = 0 5 var setDay = 0 6 7 8 9 override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { 10 val calendar = Calendar.getInstance() 11 val year = calendar.get(Calendar.YEAR) 12 val month = calendar.get(Calendar.MONTH) 13 val day = calendar.get(Calendar.DAY_OF_MONTH) 14 15 16 return DatePickerDialog( 17 requireContext(), 18 R.style.DatePicker, 19 this, 20 year, 21 month, 22 day, 23 ) 24 } 25 26 override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) { 27 28 val setLocalDate = LocalDate.of(year,month+1,dayOfMonth) 29 val format = DateTimeFormatter.ofPattern("yyyy年M月d日(E)") 30 val date =setLocalDate.format(format) 31 32 setYear = year 33 setMonth = month 34 setDay = dayOfMonth 35 editText.setText(date) 36 37 } 38}
・NumberPicker
Kotlin
1lass NumberPickerDialogFragment:DialogFragment(){ 2 3 private lateinit var dialogView: View 4 5 private lateinit var listener: NoticeDialogListener 6 private var selectedYearItem by Delegates.notNull<Int>() 7 private var selectedMonthItem by Delegates.notNull<Int>() 8 9 interface NoticeDialogListener { 10 fun onNumberPickerDialogPositiveClick(dialog: DialogFragment, selectedYearItem: Int, selectedMonthItem:Int) 11 fun onNumberPickerDialogNegativeClick(dialog: DialogFragment) 12 } 13 14 15 override fun onAttach(context: Context) { 16 super.onAttach(context) 17 try{ 18 val fragment = parentFragment 19 this.listener = fragment as NoticeDialogListener 20 }catch (e: ClassCastException){ 21 throw ClassCastException("$context must implement NoticeDialogListener") 22 } 23 } 24 25 26 override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { 27 val inflater = requireActivity().layoutInflater 28 dialogView = inflater.inflate(R.layout.dialog_numberpicker,null) 29 val builder = AlertDialog.Builder(requireContext(),R.style.NumberPickerDialog) 30 31 builder.setView(dialogView) 32 builder.setTitle(R.string.month) 33 builder.setMessage(R.string.month_explanation) 34 builder.setIcon(R.drawable.ic_baseline_fact_check_24) 35 36 builder.setPositiveButton(R.string.ok){_,_ -> this.listener.onNumberPickerDialogPositiveClick(this,this.selectedYearItem,selectedMonthItem)} 37 builder.setNegativeButton(R.string.cancel){_,_ -> this.listener.onNumberPickerDialogNegativeClick(this) } 38 39 val current = LocalDateTime.now() 40 41 42 val yearNumberPicker = dialogView.findViewById<NumberPicker>(R.id.yearNumberPicker) 43 yearNumberPicker.setOnValueChangedListener(object :NumberPicker.OnValueChangeListener{ 44 override fun onValueChange(picker: NumberPicker?, old: Int, new: Int) { 45 selectedYearItem = new 46 } 47 }) 48 yearNumberPicker.minValue = current.year-1 49 yearNumberPicker.maxValue = current.year+30 50 yearNumberPicker.value = current.year 51 selectedYearItem = yearNumberPicker.value 52 53 54 val monthNumberPicker = dialogView.findViewById<NumberPicker>(R.id.monthNumberPicker) 55 monthNumberPicker.setOnValueChangedListener(object :NumberPicker.OnValueChangeListener{ 56 override fun onValueChange(picker: NumberPicker?, old: Int, new: Int) { 57 selectedMonthItem = new 58 } 59 }) 60 monthNumberPicker.minValue = 1 61 monthNumberPicker.maxValue = 12 62 monthNumberPicker.value = current.monthValue 63 selectedMonthItem = monthNumberPicker.value 64 65 return builder.create() 66 } 67 68}
・入力画面のxml該当箇所
xml
1 <EditText 2 android:id="@+id/date_edit_text" 3 android:layout_width="wrap_content" 4 android:layout_height="wrap_content" 5 app:layout_constraintTop_toTopOf="@+id/date_input_layout" 6 app:layout_constraintBottom_toBottomOf="@+id/date_input_layout" 7 app:layout_constraintEnd_toEndOf="parent" 8 android:layout_marginEnd="16dp" 9 android:textColor="@color/black" 10 android:textSize="18sp" 11 android:text="@={viewModel.dateEdit}" 12 android:focusable="false" 13 app:theme="@style/EditTextStyle"/> 14 15 <EditText 16 android:id="@+id/month_edit_text" 17 android:layout_width="wrap_content" 18 android:layout_height="wrap_content" 19 android:layout_marginEnd="5dp" 20 android:textColor="@color/black" 21 android:textSize="18sp" 22 android:text="@={viewModel.monthKbnEdit}" 23 app:layout_constraintBottom_toBottomOf="@+id/month_input_layout" 24 app:layout_constraintEnd_toStartOf="@+id/kbn_text" 25 app:layout_constraintTop_toTopOf="@+id/month_input_layout" 26 app:theme="@style/EditTextStyle"/> 27 28 <EditText 29 android:id="@+id/edit_text" 30 android:layout_width="100dp" 31 android:layout_height="wrap_content" 32 app:layout_constraintBottom_toBottomOf="@+id/times_input_layout" 33 app:layout_constraintEnd_toStartOf="@+id/times_text" 34 app:layout_constraintTop_toTopOf="@+id/times_input_layout" 35 android:layout_marginEnd="5dp" 36 android:hint="0" 37 android:gravity="end" 38 android:inputType="number" 39 android:textColor="@color/black" 40 android:textSize="18sp" 41 android:maxLength="4" 42 android:text="@={viewModel.timesEdit}" 43 app:theme="@style/EditTextStyle"/>
・入力画面のDatePicker,
NumberPickerの呼び出し部分
kotlin
1binding.dateEditText.setOnClickListener { 2 3 val datePickerFragment = DatePickerDialogFragment(binding.dateEditText) 4 val fragmentManager = childFragmentManager 5 datePickerFragment.show(fragmentManager,"datePicker") 6 } 7 8binding.monthEditText.setOnClickListener { 9 val numberPicker = NumberPickerDialogFragment() 10 val fragmentManager = childFragmentManager 11 numberPicker.show(fragmentManager,"NumberPickerDialog") 12 }
試したこと
・android:focusable="false"にしましたが効かないです
・requestFocus()で別の場所にフォーカスを当てても変わらないです
・DatePickerタップ時にキーボードを隠す処理で、やりたいことの解決は一応しています
