Enhance settings fragment with validation and spinner controls
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user