如果你只想针对单个偏好设置,可以使用setSingleLineTitle或在XML文件中使用app:singleLineTitle="false"
。
如果你想将其应用于所有偏好设置,有多种方法可供选择,当扩展PreferenceFragmentCompat时:
1.遍历所有偏好设置并进行设置:
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. 在适配器中做相同的操作,但不建议这样做,因为它可能在某一天无法正常工作(访问了库的隐藏API):
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.类似,但不使用isSingleLineTitle
(同样的原因也不建议这么做):
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))
}
TwoLinePreference 无法转换为android.preference.GenericInflater$Parent
。 - Katedral Pillon