2019年5月5日日曜日

Kotlin メモ : useLines

Reader.useLines
  1. public inline fun <T> Reader.useLines(block: (Sequence<String>) -> T): T =  
  2.     buffered().use { block(it.lineSequence()) }  
  1. val reader: Reader = ...  
  2.   
  3. reader.buffered().use {  
  4.     val sequence : Sequence<String> = it.lineSequence()  
  5.     ...  
  6. }  
  1. val reader: Reader = ...  
  2.   
  3. reader.useLines {  
  4.     val sequence : Sequence<String> = it  
  5.     ...  
  6. }  


2019年5月3日金曜日

AndroidX Preference の SummaryProvider

以下は「TechBoosterプログラミングブック ~0から学ぶ最新技術とアプリ開発テクニック~【C95新刊】」に寄稿した内容を元にしています。

-------------------

AndroidX で Preference のライブラリもアップデートされました。この Preference ライブラリを使うと、Material Design に沿った設定画面を簡単に作ることができます。

API Level 1 からある android.preference.PreferenceActivity は今では使用しません。 また、API Level 11 で追加された android.preference.PreferenceFragment は API level 28 で deprecated になっています。

設定

androidx.preference release note

最新のバージョンは 1.1.0-alpha04、stable のバージョンは 1.0.0 です。
  1. dependencies {  
  2.     ...  
  3.     // stable は 1.0.0  
  4.     implementation "androidx.preference:preference:1.1.0-alpha04"  
  5. }  


基本的な使い方

androidx.preference.PreferenceFragmentCompat を使います。

preference 階層を設定する方法として次の3つの方法があります。
  • XML で指定する
  • Activity の meta-data として XML を指定する
  • PreferenceScreen オブジェクトを指定する
XML で preference 階層を設定するには setPreferencesFromResource() または addPreferencesFromResource() を使います。
  1. class SettingFragment : PreferenceFragmentCompat() {  
  2.   
  3.     override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {  
  4.         setPreferencesFromResource(R.xml.pref, rootKey)  
  5.     }  
  6. }  
1.0.0 で PreferenceThemeOverlay がデフォルトで適用されるようになったため、カスタマイズしない場合 Preference のテーマの指定をしなくてもよくなりました。また、PreferenceThemeOverlay.v14 およびPreferenceThemeOverlay.v14.Material テーマは deprecated になっています。

Summary 機能

1.1.0-alpha01 で Summary に関係する機能が入りました。

app:useSimpleSummaryProvider

ListPreference と EditTextPreference で app:useSimpleSummaryProvider という属性を指定できるようになりました。
この属性に true を指定すると、preference の値が変わったときにその値(ListPreference の場合は対応する android:entries または android:entryValues の値)が Summary に表示されます。値が保存されていないときは "Not Set" と表示されます。
  1. <EditTextPreference  
  2.     ...  
  3.     app:useSimpleSummaryProvider="true" />  
  4.   
  5. <ListPreference  
  6.     ...  
  7.     app:useSimpleSummaryProvider="true" />  

SummaryProvider

SummaryProvider を使うと、任意の Preference で値が変わったときに Summary を更新できます。

app:useSimpleSummaryProvider="true" を指定した ListPreference では ListPreference.SimpleSummaryProvider が、EditTextPreference では EditTextPreference.SimpleSummaryProvider が SummaryProvider として利用されます。

CheckBoxPreference に SummaryProvider をセットすると、チェックの状態の応じて Summary が変わるようにすることができます。
  1. findPreference("check").setSummaryProvider {  
  2.     if ((it as CheckBoxPreference).isChecked) "する!" else "しない..."  
  3. }  
いままでは以下のように起動時に Summary をセットし、さらに PreferenceChangeListener を登録して値変更時に Summary をセットするような処理が必要だったので、SummaryProvider を使うととてもシンプルにかけます。
  1. with(findPreference("check") as CheckBoxPreference) {  
  2.     summary = if (isEnabled) "する!" else "しない..."  
  3.     setOnPreferenceChangeListener { preference, newValue ->  
  4.         preference.summary = if ((newValue as Boolean)) "する!" else "しない..."  
  5.         true  
  6.     }  
  7. }