diff --git a/app/src/main/java/com/huanchengfly/tieba/post/activities/NewSearchActivity.kt b/app/src/main/java/com/huanchengfly/tieba/post/activities/NewSearchActivity.kt index 7b9398b1..819d6454 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/activities/NewSearchActivity.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/activities/NewSearchActivity.kt @@ -2,6 +2,7 @@ package com.huanchengfly.tieba.post.activities import android.content.Context import android.os.Bundle +import android.view.KeyEvent import android.view.View import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.WRAP_CONTENT @@ -37,6 +38,7 @@ import com.huanchengfly.tieba.post.ui.common.theme.utils.ColorStateListUtils import com.huanchengfly.tieba.post.utils.AnimUtil import com.huanchengfly.tieba.post.utils.ThemeUtil import com.huanchengfly.tieba.post.utils.anim.animSet +import com.huanchengfly.tieba.post.utils.bindKeyEvent import com.huanchengfly.tieba.post.widgets.MyViewPager import org.litepal.LitePal @@ -64,11 +66,11 @@ class NewSearchActivity : BaseActivity(), TabLayout.OnTabSelectedListener { private var keyword: String? = null set(value) { field = value - if (value != null) { + if (!value.isNullOrBlank()) { SearchHistory(value) .saveOrUpdate("content = ?", value) } - state = if (value == null) { + state = if (value.isNullOrBlank()) { State.INPUT } else { State.SEARCH @@ -115,15 +117,18 @@ class NewSearchActivity : BaseActivity(), TabLayout.OnTabSelectedListener { recyclerView.adapter = delegateAdapter editText.setOnEditorActionListener { v, actionId, _ -> if (actionId == EditorInfo.IME_ACTION_SEARCH) { - KeyboardUtil.hideKeyboard(v) keyword = v.text.toString() + if (!keyword.isNullOrBlank()) KeyboardUtil.hideKeyboard(v) return@setOnEditorActionListener true } return@setOnEditorActionListener false } + editText.bindKeyEvent(listOf(KeyEvent.KEYCODE_ENTER, KeyEvent.KEYCODE_NUMPAD_ENTER)) { + keyword = it.text.toString() + } keyword = intent.getStringExtra(EXTRA_KEYWORD) editText.post { - if (keyword == null) { + if (keyword.isNullOrBlank()) { KeyboardUtil.showKeyboard(editText) } } diff --git a/app/src/main/java/com/huanchengfly/tieba/post/activities/SearchPostActivity.kt b/app/src/main/java/com/huanchengfly/tieba/post/activities/SearchPostActivity.kt index ea9a088e..189d2db7 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/activities/SearchPostActivity.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/activities/SearchPostActivity.kt @@ -2,6 +2,7 @@ package com.huanchengfly.tieba.post.activities import android.graphics.Color import android.os.Bundle +import android.view.KeyEvent import android.view.View import android.view.ViewGroup import android.view.animation.LinearInterpolator @@ -35,6 +36,7 @@ import com.huanchengfly.tieba.post.utils.PopupUtil import com.huanchengfly.tieba.post.utils.ThemeUtil import com.huanchengfly.tieba.post.utils.Util import com.huanchengfly.tieba.post.utils.anim.animSet +import com.huanchengfly.tieba.post.utils.bindKeyEvent import com.scwang.smart.refresh.layout.SmartRefreshLayout import org.litepal.LitePal import retrofit2.Call @@ -256,11 +258,14 @@ class SearchPostActivity : BaseActivity() { } return@setOnEditorActionListener false } + editText.bindKeyEvent(listOf(KeyEvent.KEYCODE_ENTER, KeyEvent.KEYCODE_NUMPAD_ENTER)) { + keyword = it.text.toString() + } editText.hint = getString(R.string.hint_search_in_ba, forumName) } fun refresh() { - if (keyword == null || keyword == null) { + if (keyword.isNullOrBlank()) { refreshLayout.finishRefresh(false) return } @@ -284,7 +289,7 @@ class SearchPostActivity : BaseActivity() { } private fun loadMore() { - if (keyword == null || keyword == null) { + if (keyword.isNullOrBlank()) { refreshLayout.finishLoadMore(false) return } diff --git a/app/src/main/java/com/huanchengfly/tieba/post/fragments/SearchForumFragment.kt b/app/src/main/java/com/huanchengfly/tieba/post/fragments/SearchForumFragment.kt index 468bce78..e5ffb939 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/fragments/SearchForumFragment.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/fragments/SearchForumFragment.kt @@ -87,7 +87,8 @@ class SearchForumFragment : BaseFragment(), ISearchFragment, } private fun refresh() { - if (keyword == null) { + if (keyword.isNullOrBlank()) { + refreshLayout?.finishRefresh() return } getInstance().searchForum(keyword!!).enqueue(object : Callback { diff --git a/app/src/main/java/com/huanchengfly/tieba/post/fragments/SearchThreadFragment.kt b/app/src/main/java/com/huanchengfly/tieba/post/fragments/SearchThreadFragment.kt index 2d08282e..912b3808 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/fragments/SearchThreadFragment.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/fragments/SearchThreadFragment.kt @@ -145,7 +145,7 @@ class SearchThreadFragment : BaseFragment(), ISearchFragment, NewSearchActivity. } private fun refresh() { - if (keyword == null) { + if (keyword.isNullOrBlank()) { return } page = 1 diff --git a/app/src/main/java/com/huanchengfly/tieba/post/fragments/SearchUserFragment.kt b/app/src/main/java/com/huanchengfly/tieba/post/fragments/SearchUserFragment.kt index 92995d3d..1e4a31ab 100644 --- a/app/src/main/java/com/huanchengfly/tieba/post/fragments/SearchUserFragment.kt +++ b/app/src/main/java/com/huanchengfly/tieba/post/fragments/SearchUserFragment.kt @@ -126,7 +126,8 @@ class SearchUserFragment : BaseFragment(), ISearchFragment, } private fun refresh() { - if (keyword == null) { + if (keyword.isNullOrBlank()) { + mRefreshLayout?.finishRefresh() return } TiebaApi.getInstance().searchUser(keyword!!).enqueue(object : Callback { diff --git a/app/src/main/java/com/huanchengfly/tieba/post/utils/KeyEventManager.kt b/app/src/main/java/com/huanchengfly/tieba/post/utils/KeyEventManager.kt new file mode 100644 index 00000000..87762708 --- /dev/null +++ b/app/src/main/java/com/huanchengfly/tieba/post/utils/KeyEventManager.kt @@ -0,0 +1,60 @@ +package com.huanchengfly.tieba.post.utils + +import android.view.KeyEvent +import android.view.View + +private class KeyEventManager : View.OnKeyListener { + private val keyEventMapping = mutableMapOf Unit)>() + + override fun onKey(v: View, keyCode: Int, event: KeyEvent?): Boolean { + if (event?.action == KeyEvent.ACTION_UP && keyEventMapping.containsKey(keyCode)) { + keyEventMapping[keyCode]?.invoke(v as V) + return true + } + return false + } + + fun bindKeyEvent(keyCode: Int, action: (V) -> Unit) { + keyEventMapping[keyCode] = action + } +} + +fun V.bindKeyEvent(keyCode: Int, action: (V) -> Unit) { + val keyEventManager: KeyEventManager + if (onKeyListener !is KeyEventManager<*>) { + keyEventManager = KeyEventManager() + setOnKeyListener(keyEventManager) + } else { + keyEventManager = onKeyListener as KeyEventManager + } + keyEventManager.bindKeyEvent(keyCode, action) +} + +fun V.bindKeyEvent(keyCodes: List, action: (V) -> Unit) { + val keyEventManager = getKeyEventManager() + keyCodes.forEach { + keyEventManager.bindKeyEvent(it, action) + } +} + +private val View.onKeyListener: View.OnKeyListener? + get() { + return runCatching { + val viewClazz = View::class.java + val listenerInfoClazz = Class.forName("android.view.View.ListenerInfo") + val getListenerInfoMethod = viewClazz.getDeclaredMethod("getListenerInfo") + val mOnKeyListenerField = listenerInfoClazz.getDeclaredField("mOnKeyListener") + getListenerInfoMethod.isAccessible = true + mOnKeyListenerField.isAccessible = true + val listenerInfo = getListenerInfoMethod.invoke(this) + mOnKeyListenerField.get(listenerInfo) as View.OnKeyListener? + }.getOrNull() + } + +private fun V.getKeyEventManager(): KeyEventManager { + return if (onKeyListener !is KeyEventManager<*>) { + KeyEventManager().also { setOnKeyListener(it) } + } else { + onKeyListener as KeyEventManager + } +} \ No newline at end of file