Enhance settings fragment with validation and spinner controls
This commit is contained in:
@@ -1,22 +1,12 @@
|
|||||||
package com.example.app
|
package com.example.app
|
||||||
|
|
||||||
import android.Manifest
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.pm.PackageManager
|
|
||||||
import android.location.Location
|
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.Button
|
import android.widget.*
|
||||||
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 androidx.fragment.app.DialogFragment
|
import androidx.fragment.app.DialogFragment
|
||||||
|
|
||||||
class SettingsFragment : DialogFragment() {
|
class SettingsFragment : DialogFragment() {
|
||||||
@@ -25,6 +15,9 @@ class SettingsFragment : DialogFragment() {
|
|||||||
private lateinit var manualLatInput: EditText
|
private lateinit var manualLatInput: EditText
|
||||||
private lateinit var manualLngInput: EditText
|
private lateinit var manualLngInput: EditText
|
||||||
private lateinit var distanceInput: 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 saveButton: Button
|
||||||
private lateinit var cancelButton: Button
|
private lateinit var cancelButton: Button
|
||||||
|
|
||||||
@@ -36,7 +29,9 @@ class SettingsFragment : DialogFragment() {
|
|||||||
val view = inflater.inflate(R.layout.fragment_settings, container, false)
|
val view = inflater.inflate(R.layout.fragment_settings, container, false)
|
||||||
|
|
||||||
initViews(view)
|
initViews(view)
|
||||||
|
setupSpinners()
|
||||||
setupClickListeners()
|
setupClickListeners()
|
||||||
|
loadCurrentSettings()
|
||||||
|
|
||||||
return view
|
return view
|
||||||
}
|
}
|
||||||
@@ -46,23 +41,46 @@ class SettingsFragment : DialogFragment() {
|
|||||||
manualLatInput = view.findViewById(R.id.manualLatInput)
|
manualLatInput = view.findViewById(R.id.manualLatInput)
|
||||||
manualLngInput = view.findViewById(R.id.manualLngInput)
|
manualLngInput = view.findViewById(R.id.manualLngInput)
|
||||||
distanceInput = view.findViewById(R.id.distanceInput)
|
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)
|
saveButton = view.findViewById(R.id.saveButton)
|
||||||
cancelButton = view.findViewById(R.id.cancelButton)
|
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() {
|
private fun setupClickListeners() {
|
||||||
locationCalibrationRadioGroup.setOnCheckedChangeListener { _, checkedId ->
|
locationCalibrationRadioGroup.setOnCheckedChangeListener { _, checkedId ->
|
||||||
val selectedMethod = when (checkedId) {
|
// 显示或隐藏手动输入区域
|
||||||
R.id.latLngDistanceCalibration -> "经纬度+距离校准"
|
when (checkedId) {
|
||||||
R.id.onlineQueryCalibration -> "联网查询校准"
|
R.id.latLngDistanceCalibration -> {
|
||||||
else -> "默认"
|
manualInputLayout.visibility = View.VISIBLE
|
||||||
|
}
|
||||||
|
R.id.onlineQueryCalibration -> {
|
||||||
|
manualInputLayout.visibility = View.GONE
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Log.d("SettingsFragment", "选择了校准方式: $selectedMethod")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
saveButton.setOnClickListener {
|
saveButton.setOnClickListener {
|
||||||
saveSettings()
|
if (validateInputs()) {
|
||||||
dismiss()
|
saveSettings()
|
||||||
|
Toast.makeText(context, "设置已保存", Toast.LENGTH_SHORT).show()
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cancelButton.setOnClickListener {
|
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() {
|
private fun saveSettings() {
|
||||||
// 获取选择的位置校准方式
|
val sharedPreferences = requireContext().getSharedPreferences("LogCamSettings", Context.MODE_PRIVATE)
|
||||||
|
val editor = sharedPreferences.edit()
|
||||||
|
|
||||||
|
// 保存位置校准方式
|
||||||
val selectedMethodId = locationCalibrationRadioGroup.checkedRadioButtonId
|
val selectedMethodId = locationCalibrationRadioGroup.checkedRadioButtonId
|
||||||
val calibrationMethod = when (selectedMethodId) {
|
val calibrationMethod = when (selectedMethodId) {
|
||||||
R.id.latLngDistanceCalibration -> "lat_lng_distance"
|
R.id.latLngDistanceCalibration -> "lat_lng_distance"
|
||||||
R.id.onlineQueryCalibration -> "online_query"
|
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)
|
editor.putString("calibration_method", calibrationMethod)
|
||||||
|
|
||||||
// 如果选择了手动输入经纬度,则保存经纬度和距离
|
// 保存手动输入的经纬度和距离
|
||||||
if (selectedMethodId == R.id.latLngDistanceCalibration) {
|
if (selectedMethodId == R.id.latLngDistanceCalibration) {
|
||||||
try {
|
try {
|
||||||
val latStr = manualLatInput.text.toString()
|
val latStr = manualLatInput.text.toString().trim()
|
||||||
val lngStr = manualLngInput.text.toString()
|
val lngStr = manualLngInput.text.toString().trim()
|
||||||
val distanceStr = distanceInput.text.toString()
|
val distanceStr = distanceInput.text.toString().trim()
|
||||||
|
|
||||||
if (latStr.isNotEmpty() && lngStr.isNotEmpty()) {
|
if (latStr.isNotEmpty() && lngStr.isNotEmpty()) {
|
||||||
val latitude = latStr.toDouble()
|
val latitude = latStr.toDouble()
|
||||||
val longitude = lngStr.toDouble()
|
val longitude = lngStr.toDouble()
|
||||||
val distance = if (distanceStr.isNotEmpty()) distanceStr.toDouble() else 0.0
|
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_latitude", latitude.toFloat())
|
editor.putFloat("manual_longitude", longitude.toFloat())
|
||||||
editor.putFloat("manual_longitude", longitude.toFloat())
|
editor.putFloat("calibration_distance", distance.toFloat())
|
||||||
editor.putFloat("calibration_distance", distance.toFloat())
|
|
||||||
Toast.makeText(context, "设置已保存", Toast.LENGTH_SHORT).show()
|
|
||||||
} else {
|
|
||||||
Toast.makeText(context, "经纬度超出有效范围", Toast.LENGTH_SHORT).show()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (e: NumberFormatException) {
|
} catch (e: NumberFormatException) {
|
||||||
Toast.makeText(context, "请输入有效的数字", Toast.LENGTH_SHORT).show()
|
Log.e("SettingsFragment", "保存设置时出现数字格式错误: ${e.message}")
|
||||||
return
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 保存水印样式
|
||||||
|
val selectedWatermarkStyle = watermarkStyleSpinner.selectedItemPosition
|
||||||
|
editor.putInt("watermark_style", selectedWatermarkStyle)
|
||||||
|
|
||||||
|
// 保存合成质量
|
||||||
|
val selectedQuality = qualitySpinner.selectedItemPosition
|
||||||
|
editor.putInt("quality_setting", selectedQuality)
|
||||||
|
|
||||||
editor.apply()
|
editor.apply()
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
private fun loadCurrentSettings() {
|
||||||
const val REQUEST_CODE_LOCATION_PERMISSION = 100
|
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