From 358f955071eae78be7a6d7ee7d91c79b136307ea Mon Sep 17 00:00:00 2001 From: kunfei Date: Tue, 1 Oct 2019 19:44:52 +0800 Subject: [PATCH] up --- .../ui/book/source/edit/SourceEditActivity.kt | 6 +- .../rss/source/edit/RssSourceEditActivity.kt | 90 ++++++++++++++++++- .../legado/app/ui/widget/KeyboardToolPop.kt | 8 +- 3 files changed, 96 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/source/edit/SourceEditActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/edit/SourceEditActivity.kt index 3abcbcacf..4a9cc535f 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/edit/SourceEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/edit/SourceEditActivity.kt @@ -34,7 +34,7 @@ import kotlin.math.abs class SourceEditActivity : VMBaseActivity(R.layout.activity_book_source_edit, false), - KeyboardToolPop.OnClickListener { + KeyboardToolPop.CallBack { override val viewModel: SourceEditViewModel get() = getViewModel(SourceEditViewModel::class.java) @@ -92,7 +92,7 @@ class SourceEditActivity : toast("书源名称和URL不能为空") } else { viewModel.save(bookSource) { - startActivity("key" to bookSource.bookSourceUrl) + startActivity(Pair("key", bookSource.bookSourceUrl)) } } } @@ -567,7 +567,7 @@ class SourceEditActivity : return source } - override fun click(text: String) { + override fun sendText(text: String) { if (text.isBlank()) return val view = window.decorView.findFocus() if (view is EditText) { diff --git a/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt b/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt index 40ce0ba97..effc75a44 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt @@ -1,20 +1,108 @@ package io.legado.app.ui.rss.source.edit +import android.graphics.Rect import android.os.Bundle +import android.view.Gravity +import android.view.Menu +import android.view.ViewTreeObserver +import android.widget.EditText +import android.widget.PopupWindow +import androidx.recyclerview.widget.LinearLayoutManager import io.legado.app.R import io.legado.app.base.VMBaseActivity +import io.legado.app.constant.AppConst +import io.legado.app.lib.theme.ATH +import io.legado.app.ui.widget.KeyboardToolPop import io.legado.app.utils.getViewModel +import kotlinx.android.synthetic.main.activity_book_source_edit.* +import org.jetbrains.anko.displayMetrics +import kotlin.math.abs class RssSourceEditActivity : - VMBaseActivity(R.layout.activity_rss_source_edit, false) { + VMBaseActivity(R.layout.activity_rss_source_edit, false), + KeyboardToolPop.CallBack { + + private var mSoftKeyboardTool: PopupWindow? = null + private var mIsSoftKeyBoardShowing = false + + private lateinit var adapter: RssSourceEditAdapter override val viewModel: RssSourceEditViewModel get() = getViewModel(RssSourceEditViewModel::class.java) override fun onActivityCreated(savedInstanceState: Bundle?) { + initView() + } + + override fun onDestroy() { + super.onDestroy() + mSoftKeyboardTool?.dismiss() + } + + override fun onCompatCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.source_edit, menu) + return super.onCompatCreateOptionsMenu(menu) + } + private fun initView() { + ATH.applyEdgeEffectColor(recycler_view) + mSoftKeyboardTool = KeyboardToolPop(this, AppConst.keyboardToolChars, this) + window.decorView.viewTreeObserver.addOnGlobalLayoutListener(KeyboardOnGlobalChangeListener()) + recycler_view.layoutManager = LinearLayoutManager(this) + recycler_view.adapter = adapter } + override fun sendText(text: String) { + if (text.isBlank()) return + val view = window.decorView.findFocus() + if (view is EditText) { + val start = view.selectionStart + val end = view.selectionEnd + val edit = view.editableText//获取EditText的文字 + if (start < 0 || start >= edit.length) { + edit.append(text) + } else { + edit.replace(start, end, text)//光标所在位置插入文字 + } + } + } + + private fun showKeyboardTopPopupWindow() { + mSoftKeyboardTool?.isShowing?.let { if (it) return } + if (!isFinishing) { + mSoftKeyboardTool?.showAtLocation(ll_content, Gravity.BOTTOM, 0, 0) + } + } + + private fun closePopupWindow() { + mSoftKeyboardTool?.let { + if (it.isShowing) { + it.dismiss() + } + } + } + + private inner class KeyboardOnGlobalChangeListener : ViewTreeObserver.OnGlobalLayoutListener { + override fun onGlobalLayout() { + val rect = Rect() + // 获取当前页面窗口的显示范围 + window.decorView.getWindowVisibleDisplayFrame(rect) + val screenHeight = this@RssSourceEditActivity.displayMetrics.heightPixels + val keyboardHeight = screenHeight - rect.bottom // 输入法的高度 + val preShowing = mIsSoftKeyBoardShowing + if (abs(keyboardHeight) > screenHeight / 5) { + mIsSoftKeyBoardShowing = true // 超过屏幕五分之一则表示弹出了输入法 + recycler_view.setPadding(0, 0, 0, 100) + showKeyboardTopPopupWindow() + } else { + mIsSoftKeyBoardShowing = false + recycler_view.setPadding(0, 0, 0, 0) + if (preShowing) { + closePopupWindow() + } + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/widget/KeyboardToolPop.kt b/app/src/main/java/io/legado/app/ui/widget/KeyboardToolPop.kt index 57f40c039..40e321b87 100644 --- a/app/src/main/java/io/legado/app/ui/widget/KeyboardToolPop.kt +++ b/app/src/main/java/io/legado/app/ui/widget/KeyboardToolPop.kt @@ -18,7 +18,7 @@ import org.jetbrains.anko.sdk27.listeners.onClick class KeyboardToolPop( context: Context, private val chars: List, - val onClickListener: OnClickListener? + val callBack: CallBack? ) : PopupWindow(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) { init { @@ -45,13 +45,13 @@ class KeyboardToolPop( override fun convert(holder: ItemViewHolder, item: String, payloads: MutableList) { with(holder.itemView) { text_view.text = item - onClick { onClickListener?.click(item) } + onClick { callBack?.sendText(item) } } } } - interface OnClickListener { - fun click(text: String) + interface CallBack { + fun sendText(text: String) } }