[英]Kotlin Android onClickListener in getView only works on edge
我是 Kotlin 和 Android 开发的新手。 我创建了一个扩展 BaseAdapter 的自定义适配器,它可以按我的意愿工作,但是一旦我向在 getView 中返回的视图添加一个单击侦听器,它似乎并没有按预期工作。
我到处寻找答案。 我见过人们谈论可点击、重复父状态、可聚焦……但似乎没有任何效果
如果我单击布局 RelativeLayout 的左/右边框,则单击侦听器确实会做出反应,但是我希望在单击时整个 RelativeLayout 做出反应。
我的 XML 中是否缺少某些内容? 或者是否有某种有效的“黑客”。 我有点困惑为什么我的点击监听器没有按预期工作
我的 TokenAdapter(扩展 BaseAdapter)
class TokenAdapter(private val ctx: Context) : BaseAdapter() {
private val tokenPersistence: TokenPersistence = TokenPersistence(ctx)
private val clipboardManager: ClipboardManager =
ctx.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
var seconds: Int
var percentage: Int = 100
var shouldGenerateToken: Boolean = true
init {
seconds = getSecondsUntilRefresh()
}
fun getSecondsUntilRefresh() : Int{
val secondsElapsedInMinute = LocalDateTime.now().second
return if(secondsElapsedInMinute < 30) 30 - secondsElapsedInMinute else 60 - secondsElapsedInMinute
}
override fun getCount(): Int {
return tokenPersistence.length()
}
override fun getItem(position: Int): Token? {
return tokenPersistence.get(position)
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
val v: View = if (convertView == null) {
val inflater: LayoutInflater =
ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
inflater.inflate(R.layout.list_item, parent, false)
} else {
convertView
}
val t: Token = getItem(position)!!
val title: TextView = v.findViewById(R.id.list_item_title)
val code: TextView = v.findViewById(R.id.list_item_subtitle)
title.text = t.getLabel()
if (shouldGenerateToken) {
var generatedCode : String = t.generateCode()
generatedCode = generatedCode.substring(0, 3) + " " + generatedCode.substring(3, generatedCode.length)
code.text = generatedCode
shouldGenerateToken = false
}
val countdown: ProgressBar = v.findViewById(R.id.progress_circular)
val countdownText: TextView = v.findViewById(R.id.progress_circular_text)
countdownText.text = seconds.toString()
countdown.progress = percentage
v.setOnClickListener {
val copyText = code.text.split(' ').joinToString("")
println("===================")
println("Copied: $copyText")
val clip: ClipData = ClipData.newPlainText("2FA Code", copyText)
clipboardManager.setPrimaryClip(clip)
Toast.makeText(ctx, "Copied: $copyText to clipboard", Toast.LENGTH_LONG).show()
}
return v
}
}
list_item XML 布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:id="@+id/list_item_container"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/list_item_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#000000"
android:textSize="16sp"
android:textStyle="bold"
android:paddingHorizontal="8dp"
android:paddingTop="16dp"
android:paddingBottom="0dp"
android:clickable="false"
/>
<TextView
android:id="@+id/list_item_subtitle"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_below="@id/list_item_title"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_toStartOf="@id/progress_circular_container"
android:layout_toLeftOf="@id/progress_circular_container"
android:paddingHorizontal="8dp"
android:paddingTop="0dp"
android:text="123456"
android:textColor="@color/primary"
android:textSize="32sp"
android:textStyle="bold"
android:clickable="false"/>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/progress_circular_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_below="@id/list_item_title"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:clickable="false">
<ProgressBar
android:id="@+id/progress_circular"
android:layout_width="48sp"
android:layout_height="48sp"
android:indeterminateOnly="false"
android:progressDrawable="@drawable/pb_circular_determinative"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:progress="100"/>
<TextView
android:id="@+id/progress_circular_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@android:color/black"
app:layout_constraintBottom_toBottomOf="@+id/progress_circular"
app:layout_constraintEnd_toEndOf="@+id/progress_circular"
app:layout_constraintStart_toStartOf="@+id/progress_circular"
app:layout_constraintTop_toTopOf="@+id/progress_circular"
tools:text="30" />
</androidx.constraintlayout.widget.ConstraintLayout>
</RelativeLayout>
所以我设法解决了我的问题。
我做了两件“主要”的事情,之后我的问题得到了解决:
我使用 LinearLayout 而不是 RelativeLayout 重写了我的 list_item.xml (虽然我怀疑这做了什么)
<LinearLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical"> <TextView android:id="@+id/list_item_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#000000" android:textSize="16sp" android:textStyle="bold" android:paddingHorizontal="8dp" android:paddingTop="16dp" android:paddingBottom="0dp" /> <TextView android:id="@+id/list_item_subtitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingHorizontal="8dp" android:paddingTop="0dp" android:textColor="@color/primary" android:textSize="32sp" android:textStyle="bold" /> </LinearLayout> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"> <ProgressBar android:id="@+id/progress_circular" android:layout_width="48sp" android:layout_height="48sp" android:indeterminateOnly="false" android:progressDrawable="@drawable/pb_circular_determinative" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:progress="100"/> <TextView android:id="@+id/progress_circular_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@android:color/black" app:layout_constraintBottom_toBottomOf="@+id/progress_circular" app:layout_constraintEnd_toEndOf="@+id/progress_circular" app:layout_constraintStart_toStartOf="@+id/progress_circular" app:layout_constraintTop_toTopOf="@+id/progress_circular" tools:text="30" /> </androidx.constraintlayout.widget.ConstraintLayout>
我使用 ListView 上的 setOnItemClickListener 将 ClickListener 从我的 Adapter getView() 移到了 MainActivity
val listview = findViewById<ListView>(R.id.tokenList) listview.setOnItemClickListener { parent: AdapterView<*>, view: View, position: Int, id -> val token = tokenAdapter.getItem(position) if(token != null) { val code = token.generateCode() val clip: ClipData = ClipData.newPlainText("2FA Code", code) clipboardManager.setPrimaryClip(clip) Toast.makeText(this, "Copied: $code", Toast.LENGTH_LONG).show() } }
在我的 Listview 上使用这种方法,我也不必在我的 XML 布局上使用可点击或任何这些类型的属性。 如果有人知道究竟是什么使它起作用,请告诉我。 就我个人而言,我认为 Listener 是一个“OnItemClick”并且它被移动到 MainActivity,尽管不要相信我的话,因为它可能只是我所做的其他随机事件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.