If you want just for a single preference, using setSingleLineTitle or app:singleLineTitle="false"
in the XML file.
If you wish to apply it on all preferences, you can do it in multiple ways, when extending PreferenceFragmentCompat :
1.going over all preferences and setting it:
override fun setPreferenceScreen(preferenceScreen: PreferenceScreen?) {
if (preferenceScreen != null)
setAllPreferencesToHaveMultiLineTitles(preferenceScreen)
super.setPreferenceScreen(preferenceScreen)
}
private fun setAllPreferencesToHaveMultiLineTitles(preference: Preference) {
preference.isSingleLineTitle = false
if (preference is PreferenceGroup)
for (i in 0 until preference.preferenceCount)
setAllPreferencesToHaveMultiLineTitles(preference.getPreference(i))
}
2.Doing the same in the adapter, but not recommended as it might not work some day (reaches hidden API of the library) :
override fun onCreateAdapter(preferenceScreen: PreferenceScreen?): RecyclerView.Adapter<*> {
return object : PreferenceGroupAdapter(preferenceScreen) {
@SuppressLint("RestrictedApi")
override fun getItem(position: Int): Preference {
val item = super.getItem(position)
item.isSingleLineTitle = false
return item
}
}
}
3.Similar, but without using isSingleLineTitle
(but again not recommended for the same reason) :
override fun onCreateAdapter(preferenceScreen: PreferenceScreen?): RecyclerView.Adapter<*> {
return object : PreferenceGroupAdapter(preferenceScreen) {
@SuppressLint("RestrictedApi")
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PreferenceViewHolder {
val holder = super.onCreateViewHolder(parent, viewType)
setPreferenceTitleTextViewToHaveMultipleLines(holder.itemView)
return holder
}
}
}
fun setPreferenceTitleTextViewToHaveMultipleLines(v: View) {
if (v is TextView && v.getId() == android.R.id.title)
return v.setSingleLine(false)
if (v is ViewGroup)
for (i in 0 until v.childCount)
setPreferenceTitleTextViewToHaveMultipleLines(v.getChildAt(i))
}