【问题标题】:Custom TextView alignment自定义 TextView 对齐
【发布时间】:2021-05-05 15:05:40
【问题描述】:

我编写了一个小的自定义文本视图,以便在列表中使用它。根据我想要的三个状态:

状态 1 -> 只是文本,例如 TEST_TEXT

状态 2 -> 一个可绘制的开始,一个彩色背景和相同的文本 TEST_TEXT

状态 3 -> 不同的可绘制开始,不同的颜色背景和相同的文本 TEST_TEXT

文本始终具有相同的值 (TEST_TEXT)

但是在我的实现中,我失去了对齐方式,结果是状态上的文本 我没有可绘制的开始与具有可绘制的其他人不对齐,如下图所示。我希望它们都开始对齐。

有办法实现吗?

我的自定义文本视图类是:

enum class State {
    STATE_ONE,
    STATE_TWO,
    STATE_THREE
}

class CustomTextView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
): TextView(context, attrs, defStyleAttr) {

    private val PADDING = 4 * resources.displayMetrics.density
    private val ZERO_PADDING = 0 * resources.displayMetrics.density

    var state: State = State.STATE_ONE
        set(value) {
            field = value
            updateTextView()
            invalidate()
        }

    private fun updateTextView() {
        when(state) {
            State.STATE_TWO -> {
                this.setBackgroundResource(R.color.light_red)
                this.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_baseline_message_24, 0, 0, 0)
                this.compoundDrawablePadding = PADDING.toInt()
                this.setPadding(PADDING.toInt(), PADDING.toInt(), PADDING.toInt(), PADDING.toInt())
            }
            State.STATE_THREE -> {
                this.setBackgroundResource(R.color.colorGreenBright)
                this.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_baseline_message_24, 0, 0, 0)
                this.compoundDrawablePadding = PADDING.toInt()
                this.setPadding(PADDING.toInt(), PADDING.toInt(), PADDING.toInt(), PADDING.toInt())
            }
            else -> {
                this.setBackgroundResource(R.color.transparent)
                this.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null)
                this.compoundDrawablePadding = PADDING.toInt()
                this.setPadding(ZERO_PADDING.toInt(), ZERO_PADDING.toInt(), ZERO_PADDING.toInt(), ZERO_PADDING.toInt())

            }
        }
    }
}

我添加它们的布局是这样的:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto">


    <custom.textView.CustomTextView
        android:id="@+id/textViewOne"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TEST_TEXT"
        android:textSize="12sp"
        android:textColor="@color/black"
        android:background="@drawable/drawable_rounded_text_bg"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginTop="30dp"/>

    <custom.textView.CustomTextView
        android:id="@+id/textViewTwo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TEST_TEXT"
        android:textSize="12sp"
        android:textColor="@color/black"
        android:background="@drawable/drawable_rounded_text_bg"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textViewOne"
        android:layout_marginTop="10dp"/>

    <custom.textView.CustomTextView
        android:id="@+id/textViewThree"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TEST_TEXT"
        android:textSize="12sp"
        android:textColor="@color/black"
        android:background="@drawable/drawable_rounded_text_bg"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textViewTwo"
        android:layout_marginTop="10dp"/>

</androidx.constraintlayout.widget.ConstraintLayout>

最后我的活动很简单:

class CustomTextActivity: BaseActivity() {

    private lateinit var binding: ActivityCustomTextBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(getView())
        initLayout()
    }

    override fun getView(): View {
        binding = ActivityCustomTextBinding.inflate(layoutInflater)
        return binding.root
    }

    private fun initLayout() {
        binding.textViewOne.state = State.STATE_ONE
        binding.textViewTwo.state = State.STATE_TWO
        binding.textViewThree.state = State.STATE_THREE
    }
}

【问题讨论】:

    标签: android kotlin textview


    【解决方案1】:

    在我看来,如果你想拥有相同的对齐方式,即使没有内部可绘制对象,你也有两种选择:

    • 右对齐文本
    • 在第一种情况下显示“假可绘制”

    【讨论】:

    • 感谢您的回复。不是最好的解决方案,但由于我没有找到更好的解决方案,我在第一种情况下添加了一个“fake drawable”。
    猜你喜欢
    • 1970-01-01
    • 2012-04-05
    • 2015-11-18
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    相关资源
    最近更新 更多