Android PreferenceScreen заголовок в две строки - PullRequest
11 голосов
/ 10 февраля 2012

У меня есть PreferenceScreen с длинным заголовком, особенно на некоторых языках.Я могу установить заголовок из нескольких строк для CheckBoxPreference или ListPreference с этим: Сводка настроек Android.Как установить 3 строки в итоге? , но как установить 2-строчный заголовок для PreferenceScreen?Я могу изменить стиль следующим образом: Как изменить размер шрифта в PreferenceScreen , но это не выглядит идеально, и это не соответствует стилю предпочтений (шрифт, размер ...).!

Ответы [ 3 ]

18 голосов
/ 29 ноября 2013

По умолчанию заголовок установлен в одну строку.Вам нужно расширить 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);
      }
  }
}
4 голосов
/ 03 января 2018

Используйте метод setSingleLineTitle (false)

Это было добавлено в API 26, поэтому вы должны иметь возможность использовать версию библиотеки поддержки для старых устройств

1 голос
/ 17 апреля 2019

Если вы хотите использовать только один параметр, используйте 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))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...