我有带有长标题的 PreferenceScreen,尤其是在某些语言中。我可以使用以下方法为 CheckBoxPreference 或 ListPreference 设置多行标题: Android 偏好摘要。如何在摘要中设置 3 行?,但是如何为 PreferenceScreen 设置 2 行标题?我可以在这里更改样式:如何更改 PreferenceScreen 中的字体大小,但这看起来并不完美,并且与偏好样式(字体、大小...)不一致。
谢谢!
我有带有长标题的 PreferenceScreen,尤其是在某些语言中。我可以使用以下方法为 CheckBoxPreference 或 ListPreference 设置多行标题: Android 偏好摘要。如何在摘要中设置 3 行?,但是如何为 PreferenceScreen 设置 2 行标题?我可以在这里更改样式:如何更改 PreferenceScreen 中的字体大小,但这看起来并不完美,并且与偏好样式(字体、大小...)不一致。
谢谢!
默认情况下,标题设置为单行。您需要扩展 Preference 并获取标题 textview 并将单行设置为 false。使用此类而不是常规的 PreferenceScreen:
public class TwoLinePreference extends Preference {
public TwoLinePreference(Context ctx, AttributeSet attrs, int defStyle) {
super(ctx, attrs, defStyle);
}
public TwoLinePreference(Context ctx, AttributeSet attrs) {
super(ctx, attrs);
}
public TwoLinePreference(Context ctx) {
super(ctx);
}
@Override
protected void onBindView(View view) {
super.onBindView(view);
TextView textView = (TextView) view.findViewById(android.R.id.title);
if (textView != null) {
textView.setSingleLine(false);
}
}
}
这是在 API 26 中添加的,因此您应该能够为旧设备使用支持库版本
如果您只想要一个首选项,请使用setSingleLineTitle或app:singleLineTitle="false"
在 XML 文件中。
如果您希望将其应用于所有首选项,则可以在扩展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))
}
androidx.preferece
默认情况下,库在标题和摘要中不再有单行。