pref: 优化搜索框行为

This commit is contained in:
HuanCheng65 2022-08-05 20:31:05 +08:00
parent a2ac37eacd
commit 41a47806d2
No known key found for this signature in database
GPG Key ID: E9031EF91A805148
6 changed files with 81 additions and 9 deletions

View File

@ -2,6 +2,7 @@ package com.huanchengfly.tieba.post.activities
import android.content.Context import android.content.Context
import android.os.Bundle import android.os.Bundle
import android.view.KeyEvent
import android.view.View import android.view.View
import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.MATCH_PARENT
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT 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.AnimUtil
import com.huanchengfly.tieba.post.utils.ThemeUtil import com.huanchengfly.tieba.post.utils.ThemeUtil
import com.huanchengfly.tieba.post.utils.anim.animSet import com.huanchengfly.tieba.post.utils.anim.animSet
import com.huanchengfly.tieba.post.utils.bindKeyEvent
import com.huanchengfly.tieba.post.widgets.MyViewPager import com.huanchengfly.tieba.post.widgets.MyViewPager
import org.litepal.LitePal import org.litepal.LitePal
@ -64,11 +66,11 @@ class NewSearchActivity : BaseActivity(), TabLayout.OnTabSelectedListener {
private var keyword: String? = null private var keyword: String? = null
set(value) { set(value) {
field = value field = value
if (value != null) { if (!value.isNullOrBlank()) {
SearchHistory(value) SearchHistory(value)
.saveOrUpdate("content = ?", value) .saveOrUpdate("content = ?", value)
} }
state = if (value == null) { state = if (value.isNullOrBlank()) {
State.INPUT State.INPUT
} else { } else {
State.SEARCH State.SEARCH
@ -115,15 +117,18 @@ class NewSearchActivity : BaseActivity(), TabLayout.OnTabSelectedListener {
recyclerView.adapter = delegateAdapter recyclerView.adapter = delegateAdapter
editText.setOnEditorActionListener { v, actionId, _ -> editText.setOnEditorActionListener { v, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_SEARCH) { if (actionId == EditorInfo.IME_ACTION_SEARCH) {
KeyboardUtil.hideKeyboard(v)
keyword = v.text.toString() keyword = v.text.toString()
if (!keyword.isNullOrBlank()) KeyboardUtil.hideKeyboard(v)
return@setOnEditorActionListener true return@setOnEditorActionListener true
} }
return@setOnEditorActionListener false return@setOnEditorActionListener false
} }
editText.bindKeyEvent(listOf(KeyEvent.KEYCODE_ENTER, KeyEvent.KEYCODE_NUMPAD_ENTER)) {
keyword = it.text.toString()
}
keyword = intent.getStringExtra(EXTRA_KEYWORD) keyword = intent.getStringExtra(EXTRA_KEYWORD)
editText.post { editText.post {
if (keyword == null) { if (keyword.isNullOrBlank()) {
KeyboardUtil.showKeyboard(editText) KeyboardUtil.showKeyboard(editText)
} }
} }

View File

@ -2,6 +2,7 @@ package com.huanchengfly.tieba.post.activities
import android.graphics.Color import android.graphics.Color
import android.os.Bundle import android.os.Bundle
import android.view.KeyEvent
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.view.animation.LinearInterpolator 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.ThemeUtil
import com.huanchengfly.tieba.post.utils.Util import com.huanchengfly.tieba.post.utils.Util
import com.huanchengfly.tieba.post.utils.anim.animSet import com.huanchengfly.tieba.post.utils.anim.animSet
import com.huanchengfly.tieba.post.utils.bindKeyEvent
import com.scwang.smart.refresh.layout.SmartRefreshLayout import com.scwang.smart.refresh.layout.SmartRefreshLayout
import org.litepal.LitePal import org.litepal.LitePal
import retrofit2.Call import retrofit2.Call
@ -256,11 +258,14 @@ class SearchPostActivity : BaseActivity() {
} }
return@setOnEditorActionListener false 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) editText.hint = getString(R.string.hint_search_in_ba, forumName)
} }
fun refresh() { fun refresh() {
if (keyword == null || keyword == null) { if (keyword.isNullOrBlank()) {
refreshLayout.finishRefresh(false) refreshLayout.finishRefresh(false)
return return
} }
@ -284,7 +289,7 @@ class SearchPostActivity : BaseActivity() {
} }
private fun loadMore() { private fun loadMore() {
if (keyword == null || keyword == null) { if (keyword.isNullOrBlank()) {
refreshLayout.finishLoadMore(false) refreshLayout.finishLoadMore(false)
return return
} }

View File

@ -87,7 +87,8 @@ class SearchForumFragment : BaseFragment(), ISearchFragment,
} }
private fun refresh() { private fun refresh() {
if (keyword == null) { if (keyword.isNullOrBlank()) {
refreshLayout?.finishRefresh()
return return
} }
getInstance().searchForum(keyword!!).enqueue(object : Callback<SearchForumBean> { getInstance().searchForum(keyword!!).enqueue(object : Callback<SearchForumBean> {

View File

@ -145,7 +145,7 @@ class SearchThreadFragment : BaseFragment(), ISearchFragment, NewSearchActivity.
} }
private fun refresh() { private fun refresh() {
if (keyword == null) { if (keyword.isNullOrBlank()) {
return return
} }
page = 1 page = 1

View File

@ -126,7 +126,8 @@ class SearchUserFragment : BaseFragment(), ISearchFragment,
} }
private fun refresh() { private fun refresh() {
if (keyword == null) { if (keyword.isNullOrBlank()) {
mRefreshLayout?.finishRefresh()
return return
} }
TiebaApi.getInstance().searchUser(keyword!!).enqueue(object : Callback<SearchUserBean> { TiebaApi.getInstance().searchUser(keyword!!).enqueue(object : Callback<SearchUserBean> {

View File

@ -0,0 +1,60 @@
package com.huanchengfly.tieba.post.utils
import android.view.KeyEvent
import android.view.View
private class KeyEventManager<V : View> : View.OnKeyListener {
private val keyEventMapping = mutableMapOf<Int, ((V) -> 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 : View> V.bindKeyEvent(keyCode: Int, action: (V) -> Unit) {
val keyEventManager: KeyEventManager<V>
if (onKeyListener !is KeyEventManager<*>) {
keyEventManager = KeyEventManager()
setOnKeyListener(keyEventManager)
} else {
keyEventManager = onKeyListener as KeyEventManager<V>
}
keyEventManager.bindKeyEvent(keyCode, action)
}
fun <V : View> V.bindKeyEvent(keyCodes: List<Int>, 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 : View> V.getKeyEventManager(): KeyEventManager<V> {
return if (onKeyListener !is KeyEventManager<*>) {
KeyEventManager<V>().also { setOnKeyListener(it) }
} else {
onKeyListener as KeyEventManager<V>
}
}