Android OnClickListener仅在第二次点击时触发

时间:2018-07-13 15:11:04

标签: java android kotlin android-edittext onclicklistener

我的OnClickListener仅在第二次点击时被调用。同一View的OnLongClickListener可以正常工作。 我尝试改用OnTouchListener,但是在滑动时显然会触发该事件。

我的侦听器是我在活动中实现的接口的抽象方法:

--tag "Yet, the problem re-occurs"

我在RecyclerViewAdapter类中这样设置View的侦听器:

[]string{"Yet"," the problem re-occrus"}

我的活动中监听器的实现如下:

stringArray

我的视图的XML如下:

interface OnVocableFlashcardFragmentInteractionListener {
    fun onEditTextLongClick(view: View): Boolean
    fun onEditTextClick(view: View)
}

该视图的父级及其父级父级未声明为init{ setHasStableIds(true) mEditTextOnClickListener = View.OnClickListener { mListener.onEditTextClick(it) } mEditTextOnLongClickListener = View.OnLongClickListener { mListener.onEditTextLongClick(it) } } override fun onBindViewHolder(holder: FlashcardViewHolder, position: Int) { ... editText.let { it.tag = it.keyListener; it.keyListener = null; } editText.setOnClickListener(mEditTextOnClickListener) editText.setOnLongClickListener(mEditTextOnLongClickListener) ... } override fun onEditTextClick(view: View) { //-- only show toast if view is not editable (becomes editable on LongClick) if ((view as EditText).keyListener == null) { if (mToast != null) { mToast!!.cancel() } //-- inform user to long press to edit entry mToast = Toast.makeText(this, resources.getString(R.string.long_click_to_edit), Toast.LENGTH_LONG) mToast!!.show() } } override fun onEditTextLongClick(view: View): Boolean { //-- I saved the KeyListener in the editTexts tag attribute //-- to make it clickable again when needed (view as EditText).keyListener = view.getTag() as KeyListener showSoftKeyboard(view) return true }

在我的AndroidManifest.xml中,我为活动设置了 <EditText android:id="@+id/et_vocable_word" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="8dp" android:background="@null" android:textStyle="bold" android:hint="@string/enter_word" android:imeOptions="actionNext" android:inputType="textNoSuggestions" android:maxLines="1" android:singleLine="true" /> ,以防止活动开始时显示SoftInput。

我做错什么了吗?为什么OnClickListener仅在第二次点击时被调用?有谁知道我该如何解决问题?

OnClickListener not triggered on first click

2 个答案:

答案 0 :(得分:0)

您必须将编辑文本的可聚焦属性设置为false,因为其默认值是auto,这意味着框架确定它必须为true和false。当您第一次触摸该属性为true时,它已经被键盘聚焦。

https://developer.android.com/reference/android/R.styleable#View_focusable

答案 1 :(得分:0)

我能够通过使用OnTouchListener而不是OnClickListener来实现所需的行为,

<svg xmlns="http://www.w3.org/2000/svg" width="92" height="63" viewBox="0 0 92 63" fill="none">
<g>
    <path d="M90.6668 0H0L49.9325 61.7586L90.6668 0Z" fill="#6F7800" />
</g>
</svg>

在我以前用touchListener替换clickListener的尝试中,我忘了检查override fun onEditTextTouch(editText: EditText, event: MotionEvent): Boolean { //-- if the pressed gesture has finished if (event.action == MotionEvent.ACTION_UP) //-- only show toast if view is not editable (becomes editable on LongClick) if (editText.keyListener == null) { if (mToast != null) { mToast!!.cancel() } //-- inform user to long press to edit entry mToast = Toast.makeText(this, resources.getString(R.string.long_click_to_edit), Toast.LENGTH_LONG) mToast!!.show() } return false } ,因此在刷卡(我不想要)时也执行了我的代码