输入框 手动调整底部margin

This commit is contained in:
renhaoting 2025-10-31 18:23:15 +08:00
parent 456fa95f25
commit 7c0f57745e
6 changed files with 93 additions and 6 deletions

View File

@ -74,7 +74,7 @@
<activity <activity
android:name=".ui.chat.ChatActivity" android:name=".ui.chat.ChatActivity"
android:windowSoftInputMode="adjustResize" android:windowSoftInputMode="adjustResize|stateHidden"
android:exported="false" > android:exported="false" >
</activity> </activity>

View File

@ -6,6 +6,9 @@ import android.view.View.GONE
import android.view.View.VISIBLE import android.view.View.VISIBLE
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.core.view.GravityCompat import androidx.core.view.GravityCompat
import androidx.core.view.marginLeft
import androidx.core.view.marginRight
import androidx.core.view.marginTop
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.facade.annotation.Route
@ -24,14 +27,15 @@ import com.remax.visualnovel.event.model.OnLoginEvent
import com.remax.visualnovel.extension.countDownCoroutines import com.remax.visualnovel.extension.countDownCoroutines
import com.remax.visualnovel.extension.launchAndLoadingCollect import com.remax.visualnovel.extension.launchAndLoadingCollect
import com.remax.visualnovel.extension.launchWithRequest import com.remax.visualnovel.extension.launchWithRequest
import com.remax.visualnovel.extension.setMargin
import com.remax.visualnovel.extension.toast import com.remax.visualnovel.extension.toast
import com.remax.visualnovel.manager.nim.NimManager import com.remax.visualnovel.manager.nim.NimManager
import com.remax.visualnovel.ui.chat.call.ChatCallView import com.remax.visualnovel.ui.chat.call.ChatCallView
import com.remax.visualnovel.ui.chat.setting.model.ChatModelDialog import com.remax.visualnovel.ui.chat.setting.model.ChatModelDialog
import com.remax.visualnovel.ui.chat.ui.HoldToTalkDialog import com.remax.visualnovel.ui.chat.ui.HoldToTalkDialog
import com.remax.visualnovel.utils.RecordHelper import com.remax.visualnovel.utils.RecordHelper
import com.remax.visualnovel.utils.StatusBarUtil2
import com.remax.visualnovel.utils.StatusBarUtil3 import com.remax.visualnovel.utils.StatusBarUtil3
import com.remax.visualnovel.utils.setOnKeyboardHeightChangeListener
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.Job import kotlinx.coroutines.Job
import timber.log.Timber import timber.log.Timber
@ -44,6 +48,7 @@ class ChatActivity : BaseBindingActivity<ActivityActorChatBinding>() {
private var mMode = MODE_TEXT private var mMode = MODE_TEXT
private val chatViewModel by viewModels<ChatViewModel>() private val chatViewModel by viewModels<ChatViewModel>()
private val mRecordAssist = RecordAssist() private val mRecordAssist = RecordAssist()
private val mImeHelper = ImeHelper()
@ -62,6 +67,8 @@ class ChatActivity : BaseBindingActivity<ActivityActorChatBinding>() {
initInputPanelEvents() initInputPanelEvents()
initCallViewEvents() initCallViewEvents()
} }
mImeHelper.startImeListen()
} }
override fun initData() { override fun initData() {
@ -232,6 +239,14 @@ class ChatActivity : BaseBindingActivity<ActivityActorChatBinding>() {
} }
} }
override fun onResume() {
super.onResume()
}
override fun onStop() {
super.onStop()
}
companion object { companion object {
const val MODE_TEXT = 1 const val MODE_TEXT = 1
@ -335,4 +350,20 @@ class ChatActivity : BaseBindingActivity<ActivityActorChatBinding>() {
} }
inner class ImeHelper {
fun startImeListen() {
val rootView = binding.root
rootView.setOnKeyboardHeightChangeListener { keyboardHeight, isVisible ->
updateLayoutForKeyboard(keyboardHeight, isVisible)
}
}
private fun updateLayoutForKeyboard(keyboardHeight: Int, isVisible: Boolean) {
with (binding.contentSubContainer) {
setMargin(marginLeft, marginTop, marginRight, keyboardHeight)
}
}
}
} }

View File

@ -13,6 +13,10 @@ class ChatEditView @JvmOverloads constructor(context: Context, attrs: AttributeS
init { init {
isFocusable = true
isFocusableInTouchMode = true
isClickable = true
setBackgroundResource(R.color.transparent) setBackgroundResource(R.color.transparent)
setPadding(0, 12.dp, 0, 12.dp) setPadding(0, 12.dp, 0, 12.dp)
} }

View File

@ -0,0 +1,51 @@
package com.remax.visualnovel.utils
import android.view.View
import androidx.core.view.*
import com.remax.visualnovel.utils.ResUtil.dp
fun View.setOnKeyboardVisibilityChangeListener(
onShown: (keyboardHeight: Int) -> Unit,
onHidden: () -> Unit
) {
val threshold = 100.dp
ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->
val imeInsets = insets.getInsets(WindowInsetsCompat.Type.ime())
val keyboardHeight = imeInsets.bottom
val isKeyboardVisible = keyboardHeight > threshold
if (isKeyboardVisible) {
onShown(keyboardHeight)
} else {
onHidden()
}
insets
}
}
fun View.setOnKeyboardHeightChangeListener(
onHeightChanged: (keyboardHeight: Int, isVisible: Boolean) -> Unit
) {
var lastKeyboardHeight = 0
var lastVisibility = false
ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->
val imeInsets = insets.getInsets(WindowInsetsCompat.Type.ime())
val keyboardHeight = imeInsets.bottom
val isVisible = keyboardHeight > 100.dp
if (keyboardHeight != lastKeyboardHeight || isVisible != lastVisibility) {
onHeightChanged(keyboardHeight, isVisible)
lastKeyboardHeight = keyboardHeight
lastVisibility = isVisible
}
//WindowInsetsCompat.CONSUMED.toWindowInsets() ?: insets
insets
}
}

View File

@ -10,7 +10,7 @@
<!-- 页面内容 --> <!-- 页面内容 -->
<com.remax.visualnovel.widget.uitoken.view.UITokenConstraintLayout <com.remax.visualnovel.widget.uitoken.view.UITokenConstraintLayout
android:id="@+id/content" android:id="@+id/content_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@mipmap/splash_bg" > android:background="@mipmap/splash_bg" >
@ -25,6 +25,7 @@
/> />
<com.remax.visualnovel.widget.uitoken.view.UITokenConstraintLayout <com.remax.visualnovel.widget.uitoken.view.UITokenConstraintLayout
android:id="@+id/content_sub_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"

View File

@ -26,7 +26,7 @@
app:radiusToken="@string/radius_40" app:radiusToken="@string/radius_40"
app:backgroundColorToken="@string/color_surface_element_normal" app:backgroundColorToken="@string/color_surface_element_normal"
> >
<RelativeLayout <FrameLayout
android:id="@+id/iv_hold2talk" android:id="@+id/iv_hold2talk"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="match_parent" android:layout_height="match_parent"
@ -40,14 +40,14 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/hold_to_talk" android:text="@string/hold_to_talk"
app:drawableLeftCompat="@mipmap/chat_voice_s" app:drawableLeftCompat="@mipmap/chat_voice_s"
android:layout_centerInParent="true"
android:textStyle="bold" android:textStyle="bold"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="@dimen/sp_15" android:textSize="@dimen/sp_15"
android:gravity="center" android:gravity="center"
android:layout_gravity="center"
android:drawablePadding="@dimen/dp_5" android:drawablePadding="@dimen/dp_5"
/> />
</RelativeLayout> </FrameLayout>
<com.remax.visualnovel.widget.uitoken.view.UITokenImageView <com.remax.visualnovel.widget.uitoken.view.UITokenImageView
android:id="@+id/iv_chat_mode_switcher" android:id="@+id/iv_chat_mode_switcher"