Android Studio:Material Date Picker を使うメモ Locale重要

めちゃくちゃ参考にさせてもらったサイト

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月とかにしたいところ。あと曜日も気になる。たぶんどっかに元があるので上書きできると思っている。

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

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

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA