Android PreferenceScreen 标题分成两行显示

13
4个回答

20

默认情况下,标题被设置为单行显示。您需要扩展Preference并获取标题文本视图,并将单行设置为false。请改用此类而不是常规的PreferenceScreen:

默认情况下,标题被设置为单行显示。您需要扩展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);
      }
  }
}

这真的很糟糕!!!难道不能更简单一些吗?!并且用XML完成吗?感谢代码片段。+1。不过安卓需要解决这个问题。 - Katedral Pillon
1
我遇到了一个异常:TwoLinePreference 无法转换为android.preference.GenericInflater$Parent - Katedral Pillon
工作得很好!然而,在Android世界中,一切似乎都很复杂 :/. - honzakuzel1989

8

我该如何自动设置所有偏好设置? - android developer

6

如果你只想针对单个偏好设置,可以使用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))
}

0

androidx.preference库默认情况下不再在标题和摘要中显示单行。


那不是我的经验... - Slion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接