Заголовок Android PreferenceScreen в двух строках
У меня есть PreferenceScreen с длинным заголовком, особенно на некоторых языках. Я могу установить несколько заголовков строк для CheckBoxPreference или ListPreference следующим образом:
Android. Как установить 3 строки в целом?, но как установить 2-строчный заголовок для PreferenceScreen? Я могу изменить стиль, как здесь: Как изменить размер шрифта в PreferenceScreen, но это не выглядит идеально и не соответствует стилю предпочтения (шрифт, размер...).
спасибо!
Ответы
Ответ 1
По умолчанию заголовок устанавливается в одну строку.
Вам нужно расширить Preference и получить текстовое представление заголовка и установить для отдельной строки значение 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);
}
}
}
Ответ 2
Используйте метод setSingleLineTitle (false)
Это было добавлено в API 26, поэтому вы можете использовать версию поддерживающей библиотеки для более старых устройств
Ответ 3
Если вы хотите только для одного предпочтения, используйте 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))
}