簡體   English   中英

Android OnClickListener 僅在第二次點擊時觸發

[英]Android OnClickListener only triggered on second click

我的 OnClickListener 只會在第二次點擊時被調用。 同一 View 的 OnLongClickListener 按預期工作。 我嘗試使用 OnTouchListener 代替,但在滑動時顯然會觸發。

我的偵聽器是我在活動中實現的接口的抽象方法:

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

我在我的 RecyclerViewAdapter 類中像這樣設置我的視圖的偵聽器:

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
}

我的視圖的 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" />

視圖的父級及其父級未聲明為android:focusable="true"android:clickable="true"

在我的 AndroidManifest.xml 中,我為我的活動設置了android:windowSoftInputMode="stateHidden"以防止 SoftInput 在活動開始時出現。

我做錯了什么,或者為什么 OnClickListener 只在第二次點擊時被調用? 有沒有人有我如何解決問題的想法?

第一次單擊時未觸發 OnClickListener

您必須將編輯文本可聚焦屬性設為 false,因為其默認值為 auto,這意味着框架確定它必須為 true 和 false。當您第一次觸摸時為 true 時,它​​已被鍵盤聚焦。

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

我能夠通過使用 OnTouchListener 而不是 OnClickListener 來實現所需的行為,如下所示:

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
}

在我之前嘗試用 touchListener 替換我的 clickListener 時,我忘記檢查(event.action == MotionEvent.ACTION_UP)所以我的代碼在滑動時也被執行(我不想要)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM