将 NumberPicker 文本左对齐
Posted
技术标签:
【中文标题】将 NumberPicker 文本左对齐【英文标题】:Align NumberPicker Text to Left 【发布时间】:2013-10-13 16:31:50 【问题描述】:我在 NumberPicker 中使用自定义字符串。问题是文本居中,而我希望它与左侧对齐。
我尝试使用以下代码提取 TextView 并在那里设置重力 -
TextView npTextView = (TextView) numberPicker.getChildAt(1);
npTextView.setGravity(Gravity.LEFT);
但它只设置选定文本的重力。处于滚动位置的文本仍然位于中心。
有没有办法让文字左对齐?
PS:我使用的是 API 级别 15。
【问题讨论】:
这个问题有解决方案吗?我也在寻求解决方案... 这里也一样,NumberPicker 的自定义真的很痛苦 【参考方案1】:自提出问题以来已经过去 8 年,因此您可能拥有超过 8 年的 android 经验,并且可能能够自己开发所需的号码选择器 :)
不管怎样,我遇到了类似的问题,upgraded Android NumberPicker to fulfill my needs。最初的 NumberPicker 远非完美,我的也是,但经过一些调整后,它对我有用。
使用示例:
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View = LinearLayout(requireContext()).apply
isBaselineAligned = false
val divider = ColorDrawable(0xFFDBDBDB.toInt()).apply
// share drawable, don't mind Callback, invalidation etc
setBounds(0, 0, 0, dp2Px(context, 1)) // 1dp dividers
val pad = dp2Px(context, 16)
val selectorWheelPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply
typeface = ResourcesCompat.getFont(context, R.font.roboto_light)
textSize = sp(22f)
val scaleI = TimeInterpolator cos(3.1415926535897932384f / 2f * it)
val alphaI = TimeInterpolator cos(3.1415926535897932384f / 1.5f * it)
val cmPicker = FlexibleNumberPicker(context).apply
minValue = 0
maxValue = 1000 // 10 metres is enough, I hope
value = valueMm / 100
setup(divider, selectorWheelPaint, scaleI, alphaI)
setPadding(0, 0, pad, 0)
val cm = resources.getString(R.string.cm)
setFormatter cm.format(it.toFloat())
wrapSelectorWheel = false
setGravity(Gravity.RIGHT)
addView(cmPicker, LinearLayout.LayoutParams(0, WRAP_CONTENT, 1f))
addView(FlexibleNumberPicker(context).apply
minValue = 0
maxValue = 9
value = valueMm % 100
setup(divider, selectorWheelPaint, scaleI, alphaI)
setPadding(pad, 0, 0, 0)
val mm = resources.getString(R.string.mm)
setFormatter mm.format(it.toFloat())
setOnValueChangedListener(cmPicker.fractionListener)
setGravity(Gravity.LEFT)
, LinearLayout.LayoutParams(0, WRAP_CONTENT, 1f))
private fun FlexibleNumberPicker.setup(
divider: ColorDrawable, paint: Paint,
scaleI: TimeInterpolator, alphaI: TimeInterpolator,
)
setSelectionDivider(divider)
setSelectorWheelPaint(paint)
setWheelItemCount(5)
setDividerOffset(.33f)
setLineHeight(TypedValue.COMPLEX_UNIT_SP, 27f)
solidColor = Color.WHITE
setScaleInterpolator(scaleI)
setAlphaInterpolator(alphaI)
val FlexibleNumberPicker.fractionListener: FlexibleNumberPicker.OnValueChangeListener
get() = FlexibleNumberPicker.OnValueChangeListener picker, oldVal, newVal ->
val min = picker.minValue
val max = picker.maxValue
when
oldVal == min && newVal == max -> changeValueByOne(false)
oldVal == max && newVal == min -> changeValueByOne(true)
【讨论】:
仅供参考,我已经离开了 Android 开发 ;-) 无论如何感谢您的努力,我会等待社区的常规验证,然后再接受它作为答案。【参考方案2】:您不能确定 NumberPicker 的第二个孩子是正确的 TextView,因为 NumberPicker 在不同 API 中的实现是不同的。请尝试使用此代码。
for (int i = 0; i < numberPicker.getChildCount(); i++)
View child = numberPicker.getChildAt(i);
if (child instanceof EditText)
((EditText) child).setGravity(Gravity.LEFT);
break;
【讨论】:
那行不通。它几乎与我的代码相似,只是它可以确保检查。只有选定的文本左对齐,当滚动动画停止时,其余的都保持在中心。以上是关于将 NumberPicker 文本左对齐的主要内容,如果未能解决你的问题,请参考以下文章