Enhance settings fragment with validation and spinner controls

This commit is contained in:
xiajiid
2026-02-08 12:17:09 +08:00
parent ad950e8468
commit 20c6a76cc2

View File

@@ -1,22 +1,12 @@
package com.example.app
import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import android.location.Location
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.EditText
import android.widget.RadioButton
import android.widget.RadioGroup
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.core.app.ActivityCompat
import android.widget.*
import androidx.fragment.app.DialogFragment
class SettingsFragment : DialogFragment() {
@@ -25,6 +15,9 @@ class SettingsFragment : DialogFragment() {
private lateinit var manualLatInput: EditText
private lateinit var manualLngInput: EditText
private lateinit var distanceInput: EditText
private lateinit var manualInputLayout: LinearLayout
private lateinit var watermarkStyleSpinner: Spinner
private lateinit var qualitySpinner: Spinner
private lateinit var saveButton: Button
private lateinit var cancelButton: Button
@@ -36,7 +29,9 @@ class SettingsFragment : DialogFragment() {
val view = inflater.inflate(R.layout.fragment_settings, container, false)
initViews(view)
setupSpinners()
setupClickListeners()
loadCurrentSettings()
return view
}
@@ -46,23 +41,46 @@ class SettingsFragment : DialogFragment() {
manualLatInput = view.findViewById(R.id.manualLatInput)
manualLngInput = view.findViewById(R.id.manualLngInput)
distanceInput = view.findViewById(R.id.distanceInput)
manualInputLayout = view.findViewById(R.id.manualInputLayout)
watermarkStyleSpinner = view.findViewById(R.id.watermarkStyleSpinner)
qualitySpinner = view.findViewById(R.id.qualitySpinner)
saveButton = view.findViewById(R.id.saveButton)
cancelButton = view.findViewById(R.id.cancelButton)
}
private fun setupSpinners() {
// 设置水印样式选项
val watermarkStyles = arrayOf("白色粗体", "黑色阴影", "彩色半透明", "经典样式")
val watermarkAdapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item, watermarkStyles)
watermarkAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
watermarkStyleSpinner.adapter = watermarkAdapter
// 设置质量选项
val qualityOptions = arrayOf("高质量 (100%)", "标准 (80%)", "低质量 (60%)")
val qualityAdapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item, qualityOptions)
qualityAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
qualitySpinner.adapter = qualityAdapter
}
private fun setupClickListeners() {
locationCalibrationRadioGroup.setOnCheckedChangeListener { _, checkedId ->
val selectedMethod = when (checkedId) {
R.id.latLngDistanceCalibration -> "经纬度+距离校准"
R.id.onlineQueryCalibration -> "联网查询校准"
else -> "默认"
// 显示或隐藏手动输入区域
when (checkedId) {
R.id.latLngDistanceCalibration -> {
manualInputLayout.visibility = View.VISIBLE
}
R.id.onlineQueryCalibration -> {
manualInputLayout.visibility = View.GONE
}
}
Log.d("SettingsFragment", "选择了校准方式: $selectedMethod")
}
saveButton.setOnClickListener {
saveSettings()
dismiss()
if (validateInputs()) {
saveSettings()
Toast.makeText(context, "设置已保存", Toast.LENGTH_SHORT).show()
dismiss()
}
}
cancelButton.setOnClickListener {
@@ -70,52 +88,134 @@ class SettingsFragment : DialogFragment() {
}
}
private fun validateInputs(): Boolean {
val selectedMethodId = locationCalibrationRadioGroup.checkedRadioButtonId
// 如果选择了手动经纬度校准,验证输入
if (selectedMethodId == R.id.latLngDistanceCalibration) {
val latStr = manualLatInput.text.toString().trim()
val lngStr = manualLngInput.text.toString().trim()
val distanceStr = distanceInput.text.toString().trim()
if (latStr.isEmpty() || lngStr.isEmpty()) {
Toast.makeText(context, "请输入经纬度", Toast.LENGTH_SHORT).show()
return false
}
try {
val latitude = latStr.toDouble()
val longitude = lngStr.toDouble()
if (latitude !in -90.0..90.0) {
Toast.makeText(context, "纬度应在-90到90之间", Toast.LENGTH_SHORT).show()
return false
}
if (longitude !in -180.0..180.0) {
Toast.makeText(context, "经度应在-180到180之间", Toast.LENGTH_SHORT).show()
return false
}
if (distanceStr.isNotEmpty()) {
val distance = distanceStr.toDouble()
if (distance < 0) {
Toast.makeText(context, "距离应大于等于0", Toast.LENGTH_SHORT).show()
return false
}
}
} catch (e: NumberFormatException) {
Toast.makeText(context, "请输入有效的数字", Toast.LENGTH_SHORT).show()
return false
}
}
return true
}
private fun saveSettings() {
// 获取选择的位置校准方式
val sharedPreferences = requireContext().getSharedPreferences("LogCamSettings", Context.MODE_PRIVATE)
val editor = sharedPreferences.edit()
// 保存位置校准方式
val selectedMethodId = locationCalibrationRadioGroup.checkedRadioButtonId
val calibrationMethod = when (selectedMethodId) {
R.id.latLngDistanceCalibration -> "lat_lng_distance"
R.id.onlineQueryCalibration -> "online_query"
else -> "default"
else -> "online_query" // 默认选项
}
// 保存设置到SharedPreferences
val sharedPreferences = requireContext().getSharedPreferences("LogCamSettings", Context.MODE_PRIVATE)
val editor = sharedPreferences.edit()
editor.putString("calibration_method", calibrationMethod)
// 如果选择了手动输入经纬度,则保存经纬度和距离
// 保存手动输入的经纬度和距离
if (selectedMethodId == R.id.latLngDistanceCalibration) {
try {
val latStr = manualLatInput.text.toString()
val lngStr = manualLngInput.text.toString()
val distanceStr = distanceInput.text.toString()
val latStr = manualLatInput.text.toString().trim()
val lngStr = manualLngInput.text.toString().trim()
val distanceStr = distanceInput.text.toString().trim()
if (latStr.isNotEmpty() && lngStr.isNotEmpty()) {
val latitude = latStr.toDouble()
val longitude = lngStr.toDouble()
val distance = if (distanceStr.isNotEmpty()) distanceStr.toDouble() else 0.0
if (latitude in -90.0..90.0 && longitude in -180.0..180.0) {
editor.putFloat("manual_latitude", latitude.toFloat())
editor.putFloat("manual_longitude", longitude.toFloat())
editor.putFloat("calibration_distance", distance.toFloat())
Toast.makeText(context, "设置已保存", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(context, "经纬度超出有效范围", Toast.LENGTH_SHORT).show()
return
}
editor.putFloat("manual_latitude", latitude.toFloat())
editor.putFloat("manual_longitude", longitude.toFloat())
editor.putFloat("calibration_distance", distance.toFloat())
}
} catch (e: NumberFormatException) {
Toast.makeText(context, "请输入有效的数字", Toast.LENGTH_SHORT).show()
return
Log.e("SettingsFragment", "保存设置时出现数字格式错误: ${e.message}")
}
}
// 保存水印样式
val selectedWatermarkStyle = watermarkStyleSpinner.selectedItemPosition
editor.putInt("watermark_style", selectedWatermarkStyle)
// 保存合成质量
val selectedQuality = qualitySpinner.selectedItemPosition
editor.putInt("quality_setting", selectedQuality)
editor.apply()
}
companion object {
const val REQUEST_CODE_LOCATION_PERMISSION = 100
private fun loadCurrentSettings() {
val sharedPreferences = requireContext().getSharedPreferences("LogCamSettings", Context.MODE_PRIVATE)
// 加载位置校准方式
val calibrationMethod = sharedPreferences.getString("calibration_method", "online_query")
val selectedMethodId = when (calibrationMethod) {
"lat_lng_distance" -> R.id.latLngDistanceCalibration
else -> R.id.onlineQueryCalibration
}
locationCalibrationRadioGroup.check(selectedMethodId)
// 根据选择显示或隐藏手动输入区域
if (selectedMethodId == R.id.latLngDistanceCalibration) {
manualInputLayout.visibility = View.VISIBLE
// 加载手动输入的经纬度和距离
val latitude = sharedPreferences.getFloat("manual_latitude", 0f).toDouble()
val longitude = sharedPreferences.getFloat("manual_longitude", 0f).toDouble()
val distance = sharedPreferences.getFloat("calibration_distance", 0f).toDouble()
if (latitude != 0.0 || longitude != 0.0) {
manualLatInput.setText(latitude.toString())
manualLngInput.setText(longitude.toString())
distanceInput.setText(distance.toString())
}
} else {
manualInputLayout.visibility = View.GONE
}
// 加载水印样式
val watermarkStyle = sharedPreferences.getInt("watermark_style", 0)
if (watermarkStyle in 0 until watermarkStyleSpinner.adapter.count) {
watermarkStyleSpinner.setSelection(watermarkStyle)
}
// 加载质量设置
val qualitySetting = sharedPreferences.getInt("quality_setting", 1) // 默认标准质量
if (qualitySetting in 0 until qualitySpinner.adapter.count) {
qualitySpinner.setSelection(qualitySetting)
}
}
}