扩展TextView不显示文本

时间:2019-05-21 14:28:02

标签: android-studio kotlin textview

我想对我的某些OnLongClickListener实现TextView,但是我不想在任何地方重复相同的代码,所以我想扩展TextView并实现OnLongClickListener一次。

class LongClickToCopyTextView : TextView {

    constructor(context: Context) : this(context, null, 0)
    constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

    init {
        setOnLongClickListener {
            val clipboard = context?.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager?
            val clip = ClipData.newPlainText(context?.packageName, text)
            clipboard?.primaryClip = clip
            true
        }
    }
}

使用侦听器的实现是在用户长按时将TextView的文本复制到剪贴板中。

问题是自定义TextView的文本未显示。但是,如果我使用常规的TextView,则文本将正确显示。

XML

<com.dzboot.myips.custom.LongClickToCopyTextView
     android:id="@+id/simNumber"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:textSize="14sp"
     android:text="00"
     app:layout_constraintEnd_toEndOf="parent"
     app:layout_constraintTop_toTopOf="parent" />

1 个答案:

答案 0 :(得分:1)

defStyleAttr设置默认参数的问题是,基类在实际处理样式和状态时可能会做同样的事情。无论如何,您的初始化都会在init {}中进行。

class LongClickToCopyTextView : TextView {
    constructor(context: Context) : super(context)
    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)

    init {
        setOnLongClickListener {
            val clipboard = context?.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager?
            val clip = ClipData.newPlainText(context?.packageName, text)
            clipboard?.primaryClip = clip
            true
        }
    }
}

此外,您可能还想扩展AppCompatTextView。它具有一些向后移植的较新功能。