めちゃくちゃ参考にさせてもらったサイト
https://github.com/material-components/material-components-android/blob/master/lib/java/com/google/android/material/datepicker/MaterialDatePicker.java
https://developer.android.com/reference/com/google/android/material/datepicker/MaterialDatePicker
https://developer.android.com/guide/topics/resources/string-resource?hl=ja
https://material.io/components/date-pickers/android#using-date-pickers
https://stackoverflow.com/questions/49551461/how-can-i-convert-a-long-value-to-date-time-and-convert-current-time-to-long-kot
中身
import android.app.Activity
import android.content.Context
import android.widget.EditText
import androidx.fragment.app.FragmentActivity
import androidx.fragment.app.FragmentManager
import com.google.android.material.datepicker.MaterialDatePicker
import java.text.SimpleDateFormat
import java.util.*
class MDatePicker {
fun showDatePickerDialog(item: EditText,calendar:Calendar,activity:Activity){
Locale.setDefault(Locale.JAPAN) //超重要
val today = Calendar.getInstance()
val datePicker =
MaterialDatePicker.Builder.datePicker()
.setTitleText("Select date")
.setSelection(today.timeInMillis)
.build().apply {
addOnPositiveButtonClickListener {
val date = SimpleDateFormat("yyyy.MM.dd",Locale.getDefault()).format(it)
val selectDate = convertLongToTime(selection!!)
item.setText(selectDate)
}
}
datePicker.show((activity as FragmentActivity).supportFragmentManager,"TAG")
}
fun convertLongToTime(time: Long): String {
val date = Date(time)
val format = SimpleDateFormat("yyyy/MM/dd HH:mm")
return format.format(date)
}
}下の Long から String への変換関数は StackOverFlow のやつそのまま。
Calendar 引数はいらない感あり。
呼び出し
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.View.NOT_FOCUSABLE
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import java.util.*
class SomeActivity:AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_some)
val datePicker = MDatePicker()
val calendar = Calendar.getInstance()
val editText:EditText = findViewById(R.id.editText)
editText.setOnClickListener(){
datePicker.showDatePickerDialog(editText,calendar,this)
}
}
}今回は MaterialText 使ってるけど中身 EditText で注意されてるけど放置。
まだまだ融通がきかない。
あとは strings.xml 内で上書きできる値いろいろ頑張って調べた。
<string name="mtrl_picker_range_header_unselected" tools:override="true">選択されていません</string> <string name="mtrl_picker_range_header_only_start_selected" tools:override="true">%s 開始</string> <string name="mtrl_picker_range_header_only_end_selected" tools:override="true">締切 %s</string> <string name="mtrl_picker_text_input_date_range_start_hint" tools:override="true">Дата начала</string> <string name="mtrl_picker_text_input_date_range_end_hint" tools:override="true">Дата начала</string> <string name="mtrl_picker_text_input_date_format" tools:override="true">yyyy.MM.dd</string> <string name="mtrl_picker_out_of_range" tools:override="true">選択範囲外です</string> <string name="mtrl_picker_invalid_format" tools:override="true">不正な形式です</string> <string name="mtrl_picker_save" tools:override="true">保存</string> <string name="mtrl_picker_date_header_title" tools:override="true">日付選択</string> <string name="mtrl_picker_date_header_unselected" tools:override="true">選択されていません</string> <string name="mtrl_picker_text_input_date_hint" tools:override="true">日付</string> <string name="mtrl_picker_text_input_year_abbr" tools:override="true">年</string> <string name="mtrl_picker_text_input_month_abbr" tools:override="true">月</string> <string name="mtrl_picker_text_input_day_abbr" tools:override="true">日</string> <string name="mtrl_picker_invalid_range" tools:override="true">不正な範囲です</string> <string name="mtrl_picker_invalid_format_use" tools:override="true">入力形式: %1$s</string> <string name="mtrl_picker_invalid_format_example" tools:override="true">入力例: 12/31/00</string>
変数名とかで何となくわかると思う。気に入らなかったらここで上書きしたい。
正直Locale を設定するだけでわざわざ上書きしなくていい。たった一行で大きく変わるので忘れないようにしたい。Material系統めっちゃこういうのありそう。
Locale.setDefault(Locale.JAPAN)
もし日本以外の日付フォーマットにしたい場合はLocaleをいじってから他を日本語で上書きするとか?
画像例(Locale設定Japan)


エラーがおかしいのは上のstrings.xml で上書きをしてしまっているため。

画像例(Locale設定なし)
まずはカレンダー入力の見た目。本当は Feburary から 2月とかにしたいところ。あと曜日も気になる。たぶんどっかに元があるので上書きできると思っている。

次にペンマークを押したときの見た目。ここが一番問題。月/日/年とかいうフォーマットになってるし、エラーもそれに従ってでてくるから困る。

エラーを出した時の見た目。西暦の下二桁を書くのは絶望的に日本人に合っていないと思う。和暦があるのもあって混乱を生む。
