Android PreferenceScreen标题分为两行

Mir*_*lec 11 android preference

我的PreferenceScreen有很长的标题,特别是在某些语言中.我可以使用以下方法为CheckBoxPreference或ListPreference设置多行标题: Android首选项摘要.如何总结3行?,但如何为PreferenceScreen设置2行标题?我可以改变这里的样式:如何在PreferenceScreen中更改字体大小但这看起来并不完美,并且它与首选项样式(字体,大小......)不一致.

谢谢!

Cod*_*s12 18

默认情况下,标题设置为单行.您需要扩展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);
      }
  }
}
Run Code Online (Sandbox Code Playgroud)


Ram*_*h K 6

使用方法setSingleLineTitle(false)

这是在 API 26 中添加的,因此您应该能够使用旧设备的支持库版本


and*_*per 6

如果您只需要单个首选项,请使用setSingleLineTitleapp: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))
}
Run Code Online (Sandbox Code Playgroud)

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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))
}
Run Code Online (Sandbox Code Playgroud)