Browse Source

自定义图片
商品显示优化

ccc 2 tháng trước cách đây
mục cha
commit
a7d770ec6e

+ 0 - 1
app/src/main/AndroidManifest.xml

@@ -8,7 +8,6 @@
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <!-- ⾃定义权限  全局对话框 -->
     <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
-    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
     <uses-permission android:name="android.permission.OVERRIDE_WIFI_CONFIG" />
     <uses-permission android:name="android.permission.ACCESS_WIFI_PASSWORD" />
     <uses-permission android:name="android.permission.WRITE_SETTINGS" />

+ 2 - 0
lib_base/build.gradle

@@ -84,6 +84,8 @@ dependencies {
     api 'com.github.ldt-libs:SpringBackLayout:1.0' //回弹效果
     api 'com.github.kabouzeid:RecyclerView-FastScroll:1.0.16-kmod'
     api files('libs\\xzjh_interface_20240731.jar')
+    api 'com.github.bumptech.glide:glide:4.12.0'
+    annotationProcessor 'com.github.bumptech.glide:compiler:4.12.0'
 
     kapt DependencyConfig.GitHub.ARouteCompiler
     kapt DependencyConfig.GitHub.EventBusAPT

+ 4 - 0
lib_base/src/main/res/values-ar/strings.xml

@@ -281,4 +281,8 @@
     <string name="choose_time">اختر الوقت</string>
     <string name="week">أسبوع</string>
     <string name="type">النوع</string>
+    <string name="system_setting">أدخل إعدادات النظام</string>
+    <string name="make_faild">فشل الإنتاج، يُرجى إعادة التشغيل</string>
+    <string name="reset_product">إعادة الضبط</string>
 </resources>
+<!--阿拉伯语-->

+ 3 - 0
lib_base/src/main/res/values-de/strings.xml

@@ -280,4 +280,7 @@
     <string name="choose_time">Uhrzeit auswählen</string>
     <string name="week">Woche</string>
     <string name="type">Typ</string>
+    <string name="system_setting">Systemeinstellungen aufrufen</string>
+    <string name="make_faild">Produktion fehlgeschlagen, bitte neu starten</string>
+    <string name="reset_product">Zurücksetzen</string>
 </resources><!--德语-->

+ 4 - 0
lib_base/src/main/res/values-en/strings.xml

@@ -280,5 +280,9 @@
     <string name="choose_time">Choose time</string>
     <string name="week">Week</string>
     <string name="type">Type</string>
+    <string name="system_setting">Enter system settings</string>
+    <string name="make_faild">Production failed, please restart</string>
+    <string name="reset_product">Reset settings</string>
+
 </resources>
     <!--英文-->

+ 3 - 0
lib_base/src/main/res/values-fr/strings.xml

@@ -279,4 +279,7 @@
     <string name="choose_time">Choisir l\'heure</string>
     <string name="week">Semaine</string>
     <string name="type">Type</string>
+    <string name="system_setting">Accéder aux paramètres système</string>
+    <string name="make_faild">Échec de la production, veuillez redémarrer</string>
+    <string name="reset_product">Réinitialiser</string>
 </resources><!--法语-->

+ 1 - 0
lib_base/src/main/res/values/strings.xml

@@ -282,6 +282,7 @@
     <string name="type">类型</string>
     <string name="system_setting">进入系统设置</string>
     <string name="make_faild">制作失败,请重新开机</string>
+    <string name="reset_product">重置设置</string>
 
 </resources>
 <!--中文-->

+ 0 - 1
module_backstage/build.gradle

@@ -28,5 +28,4 @@ dependencies{
     implementation project(path: ':module_database')
     implementation project(path: ':lib_base')
     implementation project(':zloadingview')
-
 }

+ 10 - 1
module_backstage/src/main/java/com/module/backstage/adapter/DebugProductAdapter.kt

@@ -5,6 +5,7 @@ import android.view.ViewGroup
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.MutableLiveData
 import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
 import com.module.backstage.R
 import com.module.backstage.databinding.BackstageItemDebugProductBinding
 import com.module.backstage.databinding.BackstageItemPriceBinding
@@ -27,7 +28,15 @@ class DebugProductAdapter(var productList:ArrayList<ProductDataBean>): RecyclerV
 
         fun bind(productDataBean: ProductDataBean) {
             mBinding.run {
-                ivSugar.setImageResource(UiUtil.getResId(productDataBean.imgID, R.drawable::class.java))
+                if (productDataBean.customImg.isNotEmpty()) {
+                    // 使用自定义图片
+                    Glide.with(ivSugar.context)
+                        .load(productDataBean.customImg)
+                        .into(ivSugar)
+                } else {
+                    // 使用默认图片
+                    ivSugar.setImageResource(UiUtil.getResId(productDataBean.imgID, R.drawable::class.java))
+                }
                 tvName.setText(UiUtil.getResId(productDataBean.nameId, R.string::class.java))
                 clProduct.setOnClickListener {
                     XLogUtil.d("clProduct onclick:")

+ 10 - 1
module_backstage/src/main/java/com/module/backstage/adapter/PriceAdapter.kt

@@ -5,6 +5,7 @@ import android.view.ViewGroup
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.MutableLiveData
 import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
 import com.module.backstage.R
 import com.module.backstage.databinding.BackstageItemPriceBinding
 import com.quyunshuo.androidbaseframemvvm.common.listener.AdapterClickListener
@@ -25,7 +26,15 @@ class PriceAdapter(var productList:ArrayList<ProductDataBean>): RecyclerView.Ada
 
         fun bind(productDataBean: ProductDataBean) {
             mBinding.run {
-                ivSugar.setImageResource(UiUtil.getResId(productDataBean.imgID, R.drawable::class.java))
+                if (productDataBean.customImg.isNotEmpty()) {
+                    // 使用自定义图片
+                    Glide.with(ivSugar.context)
+                        .load(productDataBean.customImg)
+                        .into(ivSugar)
+                } else {
+                    // 使用默认图片
+                    ivSugar.setImageResource(UiUtil.getResId(productDataBean.imgID, R.drawable::class.java))
+                }
                 tvName.setText(UiUtil.getResId(productDataBean.nameId, R.string::class.java))
                 etSugarprice.setText(""+productDataBean.price)
 

+ 11 - 1
module_backstage/src/main/java/com/module/backstage/adapter/ProductAdapter.kt

@@ -5,6 +5,7 @@ import android.view.ViewGroup
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.MutableLiveData
 import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
 import com.module.backstage.R
 import com.module.backstage.databinding.BackstageItemPriceBinding
 import com.module.backstage.databinding.BackstageItemProductBinding
@@ -27,7 +28,16 @@ class ProductAdapter(var productList:ArrayList<ProductDataBean>): RecyclerView.A
 
         fun bind(productDataBean: ProductDataBean) {
             mBinding.run {
-                ivSugar.setImageResource(UiUtil.getResId(productDataBean.imgID, R.drawable::class.java))
+                if (productDataBean.customImg.isNotEmpty()) {
+                    // 使用自定义图片
+                    Glide.with(ivSugar.context)
+                        .load(productDataBean.customImg) // 这里假设 customImagePath 是用户选择的图片路径
+                        .into(ivSugar)
+                } else {
+                    // 使用默认图片
+                    ivSugar.setImageResource(UiUtil.getResId(productDataBean.imgID, R.drawable::class.java))
+                }
+
                 tvName.setText(UiUtil.getResId(productDataBean.nameId, R.string::class.java))
                 if (productDataBean.customName!=""){
                     etSugarprice.setText(productDataBean.customName)

+ 34 - 7
module_backstage/src/main/java/com/module/backstage/fragment/product/ShowProductFragment.kt

@@ -36,12 +36,14 @@ import java.io.File
  * @since 2021/8/1 11:46 下午
  */
 @AndroidEntryPoint
-class ShowProductFragment : BaseFragment<BackstageFragmentShowProductBinding, ShowProductFragmentVM>() {
+class ShowProductFragment :
+    BaseFragment<BackstageFragmentShowProductBinding, ShowProductFragmentVM>() {
     private val TAG = "ShowProductFragment"
     private var productAdapter: ProductAdapter? = null
     override val mViewModel: ShowProductFragmentVM by viewModels()
     override fun createVB() = BackstageFragmentShowProductBinding.inflate(layoutInflater)
     var okCancelDialog: OKCancelDialog? = null
+    var productPosition = -1
 
 
     override fun BackstageFragmentShowProductBinding.initView() {
@@ -64,7 +66,9 @@ class ShowProductFragment : BaseFragment<BackstageFragmentShowProductBinding, Sh
 //                        showOkCancelDialog(data)
 //                    }else if(data =="PIC"){
 //                        切换图片
+                    productPosition = position
                     showOkCancelDialog(data!!)
+                    Log.d(TAG, "onClickListener: " + productAdapter!!.productList[position].imgID)
 //                    }
                 }
             })
@@ -96,6 +100,18 @@ class ShowProductFragment : BaseFragment<BackstageFragmentShowProductBinding, Sh
             SpUtils.putString(MMKVName.PRODUCT_DATA, toJson)
             ToastUtil.switchToastStyleToSuccess(UiUtil.getStringRes(R.string.backstage_update_success))
         }
+        tvReset.setOnClickListener {
+            for (i in 0 until mBinding.priceRvProduct.layoutManager!!.childCount) {
+                productAdapter!!.productList[i].customImg = ""
+                productAdapter!!.productList[i].customName = ""
+                productAdapter!!.productList[i].isSelected=true
+            }
+
+            val toJson = Gson().toJson(productAdapter?.productList)
+            Log.d(TAG, "toJson : " + toJson)
+            SpUtils.putString(MMKVName.PRODUCT_DATA, toJson)
+            ToastUtil.switchToastStyleToSuccess("已重置商品设置")
+        }
     }
 
     override fun initObserve() {
@@ -147,19 +163,25 @@ class ShowProductFragment : BaseFragment<BackstageFragmentShowProductBinding, Sh
      * 获取系统系统相册权限
      */
     private fun permissions() {
-        if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
+        if (ContextCompat.checkSelfPermission(
+                requireContext(),
+                Manifest.permission.WRITE_EXTERNAL_STORAGE
+            ) != PackageManager.PERMISSION_GRANTED
+        ) {
             // 请求权限
             requestPermissions(arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), PHOTO)
+            Log.d(TAG, "permissions: 1")
         } else {
             // 已经有权限,直接打开系统相册
             choosePhoto()
+            Log.d(TAG, "permissions: 2")
         }
     }
 
     private fun choosePhoto() {
         // 打开系统相册
-        Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
-//        startActivityForResult(picture, 2) // 这里传入的请求码为2
+        val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
+        startActivityForResult(intent, 2) // 这里传入的请求码为2
     }
 
 
@@ -170,7 +192,11 @@ class ShowProductFragment : BaseFragment<BackstageFragmentShowProductBinding, Sh
      * @param permissions
      * @param grantResults
      */
-    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
+    override fun onRequestPermissionsResult(
+        requestCode: Int,
+        permissions: Array<out String>,
+        grantResults: IntArray
+    ) {
         super.onRequestPermissionsResult(requestCode, permissions, grantResults)
         if (requestCode == PHOTO) {
             if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
@@ -198,7 +224,7 @@ class ShowProductFragment : BaseFragment<BackstageFragmentShowProductBinding, Sh
             if (!isFilePathWithExtension) {
                 // 获取文件路径
                 path = File(ReaderUtils.getRealPathFromUri(requireContext(), uri))
-                Log.d("YourFragment", "onActivityResult: 当前位置: path"+path)
+                Log.d("YourFragment", "onActivityResult: 当前位置: path" + path)
                 Log.d("YourFragment", "onActivityResult: 商品名: {goodsBean.nameChinese}")
 
                 // 将文件路径存入 Map
@@ -208,9 +234,10 @@ class ShowProductFragment : BaseFragment<BackstageFragmentShowProductBinding, Sh
 
                 // 将选择的图片路径保存到 Hawk 中
 //                Hawk.put("image", picture)
+                productAdapter!!.productList[productPosition].customImg = path.toString()
 
                 // 刷新适配器
-                mBinding.priceRvProduct.adapter?.notifyItemChanged(currentPosition)
+                mBinding.priceRvProduct.adapter?.notifyItemChanged(productPosition)
             }
         }
     }

+ 17 - 0
module_backstage/src/main/res/layout/backstage_fragment_show_product.xml

@@ -33,4 +33,21 @@
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent" />
 
+    <TextView
+        android:id="@+id/tv_reset"
+        android:gravity="center"
+        android:layout_width="380dp"
+        android:layout_height="120dp"
+        android:layout_marginBottom="360dp"
+        android:minWidth="380dp"
+        android:minHeight="100dp"
+        android:background="@drawable/update_btn_background"
+        android:text="@string/reset_product"
+        android:paddingHorizontal="10dp"
+        android:textSize="42sp"
+        android:textStyle="bold"
+        android:textColor="@color/white"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent" />
+
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 10 - 1
module_home/src/main/java/com/quyunshuo/module/home/adapter/HomeProductAdapter.kt

@@ -7,6 +7,7 @@ import android.view.ViewGroup
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.MutableLiveData
 import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
 import com.quyunshuo.androidbaseframemvvm.base.BaseApplication
 import com.quyunshuo.androidbaseframemvvm.common.bean.ProductDataBean
 import com.quyunshuo.androidbaseframemvvm.common.constant.MMKVName
@@ -24,7 +25,15 @@ class HomeProductAdapter(var productList:ArrayList<ProductDataBean>): RecyclerVi
         fun bind(productDataBean: ProductDataBean) {
             mBinding.run {
                 //图片
-                ivSugar.setImageResource(UiUtil.getResId(productDataBean.imgID, R.drawable::class.java))
+                if (productDataBean.customImg.isNotEmpty()) {
+                    // 使用自定义图片
+                    Glide.with(ivSugar.context)
+                        .load(productDataBean.customImg)
+                        .into(ivSugar)
+                } else {
+                    // 使用默认图片
+                    ivSugar.setImageResource(UiUtil.getResId(productDataBean.imgID, R.drawable::class.java))
+                }
                 //商品名字:自定义、自带
                 if (productDataBean.customName == "") {
                     tvName.setText(UiUtil.getResId(productDataBean.nameId, R.string::class.java))

+ 11 - 4
module_home/src/main/java/com/quyunshuo/module/home/fragment/fragment/HomeFragment.kt

@@ -113,12 +113,10 @@ class HomeFragment : BaseFragment<HomeFragmentHomeBinding, HomeFragmentVM>(), Vi
     override fun HomeFragmentHomeBinding.initView() {
         startRefreshime()
         with(homeRvProduct) {
-            //设置布局排列方式,默认垂直排列
-            val gridLayoutManager =
-                GridLayoutManager(this@HomeFragment.context, 2, GridLayoutManager.VERTICAL, false)
-            layoutManager = gridLayoutManager
             //设置adapter
             productList = mViewModel.getPriceData()
+            //设置布局排列方式,默认垂直排列
+            layoutManager = createGridLayoutManager(productList.size)
             homeProductAdapter = HomeProductAdapter(productList)
             homeProductAdapter?.setOnclickListener { view, position, data ->
                 clickProduct(
@@ -192,6 +190,15 @@ class HomeFragment : BaseFragment<HomeFragmentHomeBinding, HomeFragmentVM>(), Vi
             })
     }
 
+
+    private fun createGridLayoutManager(itemCount: Int): GridLayoutManager {
+        return when (itemCount) {
+            1 -> GridLayoutManager(this@HomeFragment.context, 1, GridLayoutManager.VERTICAL, false)
+            2 -> GridLayoutManager(this@HomeFragment.context, 2, GridLayoutManager.VERTICAL, false)
+            else -> GridLayoutManager(this@HomeFragment.context, 2, GridLayoutManager.VERTICAL, false) // 默认情况下
+        }
+    }
+
     //设置字体文件
     private fun HomeFragmentHomeBinding.setTextTtf() {
         tvAacpeBill.typeface = MMKVName.typeface1

+ 4 - 0
module_home/src/main/java/com/quyunshuo/module/home/service/GlobalService.kt

@@ -86,6 +86,10 @@ class GlobalService :LifecycleService() {
         globalServiceViewModel.getAlarmClock()
 //        globalServiceViewModel.scheduleDailyAlarmWithWorkManager(this@GlobalService);
         //初始化 支付的串口通讯
+        Log.d(TAG, "onCreate:initPayIctMdb "+Build.MODEL)
+        if (Build.MODEL=="NX629J"){//模拟器跳过串口检测
+            return
+        }
         initPayIctMdb()
         showTipsDialog(UiUtil.getStringRes(R.string.initializing))//是否开机
         observeLiveData(globalServiceViewModel.initIsSuccess,::initIsSuccess)