Android Kotlin:自定义视图子类化导致各种现有视图(EditText、SeekBar...)变灰和无法聚焦的行为

问题描述 投票:0回答:1

我正在将旧的 Java 代码更新到 Kotlin,并且我遇到了 Kotlin 中的自定义 EditText 和 SeekBar 视图的问题,而使用 Java 时不会发生这种情况。

我创建了一个具有基本布局的新 Android Kotlin 项目,并将默认的

TextView
替换为
EditText
。最初,效果很好。但是当我制作了
EditText
的简单子类而不添加任何其他内容时:

import android.content.Context
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatEditText

class CustomEditText @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : AppCompatEditText(context, attrs, defStyleAttr)

并更新了 XML 布局,如下所示:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.my_package.name.CustomEditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

EditText
变成灰色并且无法对焦。奇怪的是,当我用
SeekBar
尝试同样的操作时,问题又发生了:

import android.content.Context
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatSeekBar

class CustomSeekBar @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : AppCompatSeekBar(context, attrs, defStyleAttr)

在Java中,它运行得很好。

import android.content.Context;
import android.util.AttributeSet;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatSeekBar;

public class CustomSeekBarJava extends AppCompatSeekBar {

    public CustomSeekBarJava(@NonNull Context context) {
        super(context);
    }

    public CustomSeekBarJava(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomSeekBarJava(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

}

我对可能导致此问题的原因感到困惑。任何有关解决此问题的帮助或建议都会非常有帮助。

java android kotlin android-custom-view
1个回答
1
投票

问题在于

@JvmOverloads

它确实通过将所有 3 个构造函数压缩为一个来使代码整洁,但是 android studio 生成的默认值是幼稚且不正确的。

您必须手动检查父类的源代码以查看应该提供什么默认值,但在搜索栏的情况下我认为应该是:

import android.content.Context
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatSeekBar

class CustomSeekBar @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = androidx.appcompat.R.attr.seekBarStyle
) : AppCompatSeekBar(context, attrs, defStyleAttr)
© www.soinside.com 2019 - 2024. All rights reserved.