将 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 文本左对齐的主要内容,如果未能解决你的问题,请参考以下文章

html中怎么将标签左对齐,而文本框右对齐的方法

CSS:如何将列表元素与左对齐文本居中对齐?

CSS:如何将列表元素与左对齐文本居中对齐?

如何将文本左对齐。在反应工具提示中?

将 JMenu 向左展开,同时保留默认文本对齐方式

将字体真棒和文本向左对齐