Ellen Spertus
05/09/2022, 1:40 AMdialpad_0_holder.setOnClickListener { dialpadPressed('0', it) }
dialpad_9_holder.setOnClickListener { dialpadPressed('9', it) }
If the flag tremor
is true
, I would like to call setOnLongClickListener
instead of setOnClickListener
.
Is it possible to do something like this?
val f = if (tremor) RelativeLayout.onLongClickListener else RelativeLayout.onClickListener
dialpad_0_holder.f { dialpadPressed('0', it) }
dialpad_9_holder.f { dialpadPressed('9', it) }
ephemient
05/09/2022, 1:49 AMval f = if (tremor) View::setOnLongClickListener else View::setOnClickListener
f(dialpad_0_holder) { dialpadPressed('0', it) }
but it doesn't work with View
because the functions here take two different types, View.OnLongClickListener
versus View.OnClickListener
Ellen Spertus
05/09/2022, 1:50 AMephemient
05/09/2022, 1:52 AMval views = listOf(dialpad_0_holder, ..., dialpad_9_holder)
for ((i, view) in views.withIndex()) {
if (tremor) {
view.setOnLongClickListener { ddialpadPressed('0' + i, it }
} else {
view.setOnClickListener { dialpadPressed('0' + i, it }
}
}
orEllen Spertus
05/09/2022, 1:52 AMprivate fun setNumberPress(tremor: Boolean) {
val children = dialpad_holder.children.toList()
val digitRange = CharRange('0', '9')
children.zip(digitRange).forEach { pair ->
if (tremor) {
pair.first.setOnLongClickListener { dialpadPressed(pair.second, it); true }
} else {
pair.first.setOnClickListener { dialpadPressed(pair.second, it) }
}
}
}
ephemient
05/09/2022, 1:53 AMEllen Spertus
05/09/2022, 1:53 AMephemient
05/09/2022, 1:54 AMval views = mapOf(
dialpad_0_holder to '0',
...
)
if (tremor) {
val listener = View.OnLongClickListener {
dialpadPressed(views.getValue(it), it)
}
for (view in views.keys) view.setOnLongClickListener(listener)
} else {
// ditto with View.OnClickListener
ephemient
05/09/2022, 1:59 AMsetOnLongClick
and setOnClick
cases,
val listener = object : View.OnLongClickListener, View.OnClickListener {
override fun onLongClick(view: View): Boolean = ...
override fun onClick(view: View)...
}
but I wouldn't bother. if the duplicated code gets too complicated I'd rather pull it out into another function instead that both listener types can call intoEllen Spertus
05/09/2022, 2:01 AMfun onAction(view: View) {
if (tremor) {
onLongClick(view)
} else {
onClick(view)
}
}
ephemient
05/09/2022, 2:05 AMfun View.setClickListener(tremor: Boolean, action: (View) -> Boolean) {
if (tremor) {
view.setOnLongClickListener { action() }
} else {
view.setOnClickListener { action() }
}
}
dialpad_0_holder.setOnClickListener(tremor) { dialpadPressed('0', it) }
does create a bunch of lambda objects that then get wrapped in other listeners, but it's fine in practice