fix(fragment): 修复 CollectFragment 首次打开相机预览不显示的问题

This commit is contained in:
2026-04-22 17:09:33 +08:00
parent 9ba6443f4f
commit 8c709a3f5f
3 changed files with 16 additions and 7 deletions
@@ -92,9 +92,9 @@ class SingleFragmentActivity : BaseActivity() {
* 根据页面类型返回对应标题文本
*/
private fun getTitleForPage(pageType: PageType): String = when (pageType) {
PageType.FOOD_COLLECT -> "菜品采集"
PageType.COOK_MODE -> "设备配置"
PageType.SEASONING_CONFIG -> "调料"
PageType.FOOD_COLLECT -> "食材采样"
PageType.COOK_MODE -> "餐品模式"
PageType.SEASONING_CONFIG -> "调料区设"
}
/**
@@ -11,6 +11,7 @@ import android.view.ViewGroup
import android.view.inputmethod.EditorInfo
import android.view.inputmethod.InputMethodManager
import androidx.camera.view.PreviewView
import androidx.core.view.doOnLayout
import androidx.core.view.updateLayoutParams
import androidx.recyclerview.widget.GridLayoutManager
import com.shuwei.dish.match.R
@@ -36,7 +37,7 @@ class CollectFragment : BaseFragment<FragmentCollectBinding>(){
companion object {
private const val TAG = "CollectFragment"
const val MAX_COUNT = 9
const val MAX_COUNT = 18
}
private var selectedFoodId: String? = ""
@@ -194,8 +195,12 @@ class CollectFragment : BaseFragment<FragmentCollectBinding>(){
initCamera(binding.flCameraPreview)
currentActivity.setLifecycleCallback(object : SingleFragmentActivity.LifecycleCallback {
override fun onActivityResume() {
// 首次进入时 previewView 尚未 attach,由 doOnLayout 负责首次 bind
// 从后台切回时 previewView 已 attach,直接 bind 恢复预览
if (::previewView.isInitialized && previewView.isAttachedToWindow) {
cameraUtils.bind()
}
}
override fun onActivityPause() {
cameraUtils.unbind()
@@ -355,7 +360,7 @@ class CollectFragment : BaseFragment<FragmentCollectBinding>(){
override fun onResume() {
super.onResume()
if (isVisible.not()) return
// 不使用 isVisible 判断,首次打开时 View 尚未 attach 到 WindowisVisible 会返回 false 导致遮罩永不隐藏
binding.llCameraFlag.run {
visibility = View.VISIBLE
postDelayed({
@@ -408,6 +413,10 @@ class CollectFragment : BaseFragment<FragmentCollectBinding>(){
}
}
cameraUtils.setPreviewController(previewView)
// doOnLayout 确保 previewView 测量完成(有有效尺寸和 Surface)后再 bind,解决首次打开无预览问题
previewView.doOnLayout {
cameraUtils.bind()
}
}
}
@@ -64,7 +64,7 @@ class CameraUtils(private var activity: ComponentActivity) {
)
cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
}
bind()
// bind() 由外部在 previewView attach 到窗口后调用,避免首次无预览
}
// if (isCameraReady.not()) {