设置页面(1)
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
package com.example.defenseapplication.liveVideo
|
||||
|
||||
import TimePickerFragment
|
||||
import android.os.Bundle
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import com.example.defenseapplication.databinding.AutoModeActivityBinding
|
||||
import com.example.defenseapplication.view.AutoModeNoticeDialog
|
||||
import com.gyf.immersionbar.ImmersionBar
|
||||
import java.util.Calendar
|
||||
|
||||
class AutoModeActivity : AppCompatActivity() {
|
||||
|
||||
private lateinit var binding: AutoModeActivityBinding
|
||||
private lateinit var calendar: Calendar
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
binding = AutoModeActivityBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
|
||||
ImmersionBar.with(this)
|
||||
.statusBarDarkFont(true)
|
||||
.titleBar(binding.topBar)
|
||||
.init()
|
||||
|
||||
initListener()
|
||||
|
||||
showAutoModeNoticeDialog()
|
||||
}
|
||||
|
||||
private fun initListener() {
|
||||
binding.ivBack.setOnClickListener {
|
||||
finish()
|
||||
}
|
||||
|
||||
binding.rbAutoMode.setOnClickListener {
|
||||
binding.rbSemiAutoMode.isChecked = false
|
||||
showAutoModeNoticeDialog()
|
||||
}
|
||||
|
||||
binding.rbSemiAutoMode.setOnClickListener {
|
||||
binding.rbAutoMode.isChecked = false
|
||||
}
|
||||
// 起始时间选择
|
||||
binding.itemStartTime.setOnClickListener {
|
||||
showTimePicker { hour, minute ->
|
||||
val startTimeStr = String.format("%02d:%02d", hour, minute)
|
||||
binding.tvStartTime.text = startTimeStr
|
||||
}
|
||||
}
|
||||
// 结束时间选择
|
||||
binding.itemEndTime.setOnClickListener {
|
||||
showTimePicker { hour, minute ->
|
||||
val endTimeStr = String.format("%02d:%02d", hour, minute)
|
||||
binding.tvEndTime.text = endTimeStr
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 显示时间选择器对话框
|
||||
* @param onTimeSelected 时间选择回调,参数为小时和分钟
|
||||
*/
|
||||
private fun showTimePicker(onTimeSelected: (hour: Int, minute: Int) -> Unit) {
|
||||
val timePickerFragment = TimePickerFragment { hour, minute ->
|
||||
onTimeSelected(hour, minute)
|
||||
}
|
||||
timePickerFragment.show(supportFragmentManager, "timePicker")
|
||||
}
|
||||
private fun showAutoModeNoticeDialog() {
|
||||
val dialog = AutoModeNoticeDialog(this)
|
||||
dialog.setOnConfirmListener {
|
||||
}
|
||||
dialog.show()
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.example.defenseapplication.liveVideo
|
||||
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import com.example.defenseapplication.R
|
||||
import com.example.defenseapplication.base.BaseActivity
|
||||
@@ -23,6 +24,10 @@ class SettingsActivity : BaseActivity() {
|
||||
.statusBarDarkFont(true)
|
||||
.titleBar(binding.topBar)
|
||||
.init()
|
||||
binding.itemVoiceSetting.setOnClickListener {
|
||||
val intent = Intent(this, VoiceSettingsActivity::class.java)
|
||||
startActivity(intent)
|
||||
}
|
||||
binding.ivBack.setOnClickListener {
|
||||
finish()
|
||||
}
|
||||
@@ -57,6 +62,14 @@ class SettingsActivity : BaseActivity() {
|
||||
}
|
||||
dialog.show(supportFragmentManager, "CustomDialogFragment")
|
||||
}
|
||||
binding.itemWaterGunSetting.setOnClickListener {
|
||||
val intent = Intent(this, WaterGunSettingsActivity::class.java)
|
||||
startActivity(intent)
|
||||
}
|
||||
binding.itemAutoMode.setOnClickListener {
|
||||
val intent = Intent(this, AutoModeActivity::class.java)
|
||||
startActivity(intent)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
package com.example.defenseapplication.liveVideo
|
||||
|
||||
import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import android.view.animation.AccelerateDecelerateInterpolator
|
||||
import android.widget.ImageView
|
||||
import android.widget.Toast
|
||||
import androidx.activity.enableEdgeToEdge
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.view.ViewCompat
|
||||
import androidx.core.view.WindowInsetsCompat
|
||||
import com.example.defenseapplication.R
|
||||
import com.example.defenseapplication.databinding.SettingsActivityBinding
|
||||
import com.example.defenseapplication.databinding.VoiceSettingsActivityBinding
|
||||
import com.gyf.immersionbar.ImmersionBar
|
||||
|
||||
class VoiceSettingsActivity : AppCompatActivity() {
|
||||
|
||||
private lateinit var binding: VoiceSettingsActivityBinding
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
binding = VoiceSettingsActivityBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
|
||||
// ImmersionBar核心调用,沉浸式
|
||||
ImmersionBar.with(this)
|
||||
.statusBarDarkFont(true)
|
||||
.titleBar(binding.topBar)
|
||||
.init()
|
||||
|
||||
binding.swWarningVoice.setOnCheckedChangeListener { _, isChecked ->
|
||||
when(isChecked) {
|
||||
true -> {
|
||||
// 打开开关业务逻辑
|
||||
}
|
||||
|
||||
false -> {
|
||||
// 关闭开关业务逻辑
|
||||
}
|
||||
}
|
||||
}
|
||||
binding.rlWarningContent.setOnClickListener {
|
||||
val intent= Intent(this, WarningVoiceContentActivity::class.java)
|
||||
startActivity(intent)
|
||||
}
|
||||
binding.ivBack.setOnClickListener {
|
||||
finish()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
package com.example.defenseapplication.liveVideo
|
||||
|
||||
import android.graphics.Color
|
||||
import android.os.Bundle
|
||||
import android.text.Editable
|
||||
import androidx.activity.enableEdgeToEdge
|
||||
import androidx.appcompat.app.AppCompatActivity
|
||||
import androidx.core.widget.doAfterTextChanged
|
||||
import com.example.defenseapplication.databinding.WarningVoiceContentActivityBinding
|
||||
import com.gyf.immersionbar.ImmersionBar
|
||||
|
||||
class WarningVoiceContentActivity : AppCompatActivity() {
|
||||
|
||||
private lateinit var binding: WarningVoiceContentActivityBinding
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
binding = WarningVoiceContentActivityBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
// ImmersionBar核心调用,沉浸式
|
||||
ImmersionBar.with(this)
|
||||
.statusBarDarkFont(true)
|
||||
.titleBar(binding.topBar)
|
||||
.init()
|
||||
// 初始化计数显示
|
||||
val initialLength = binding.etWarningContent.text.length
|
||||
updateWordCount(initialLength)
|
||||
|
||||
// 添加文本变化监听
|
||||
binding.etWarningContent.doAfterTextChanged { text ->
|
||||
val length = text?.length ?: 0
|
||||
updateWordCount(length)
|
||||
}
|
||||
binding.btnBack.setOnClickListener {
|
||||
finish()
|
||||
}
|
||||
binding.btnSave.setOnClickListener {
|
||||
//保存的逻辑
|
||||
finish()
|
||||
}
|
||||
}
|
||||
private fun updateWordCount(current: Int) {
|
||||
binding.tvWordCount.text = "$current/100"
|
||||
//字数达到上限时改变颜色
|
||||
val color = if (current >= 100) Color.RED else Color.GRAY
|
||||
binding.tvWordCount.setTextColor(color)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
package com.example.defenseapplication.liveVideo
|
||||
|
||||
import android.os.Bundle
|
||||
import androidx.activity.enableEdgeToEdge
|
||||
import com.example.defenseapplication.R
|
||||
import com.example.defenseapplication.base.BaseActivity
|
||||
import com.example.defenseapplication.databinding.WaterGunSettingsActivityBinding
|
||||
import com.example.defenseapplication.view.ContainerSelectDialog
|
||||
import com.example.defenseapplication.view.CustomDialogFragmentText
|
||||
import com.gyf.immersionbar.ImmersionBar
|
||||
|
||||
class WaterGunSettingsActivity : BaseActivity() {
|
||||
|
||||
private lateinit var binding: WaterGunSettingsActivityBinding
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
binding = WaterGunSettingsActivityBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
|
||||
ImmersionBar.with(this)
|
||||
.statusBarDarkFont(true)
|
||||
.titleBar(binding.topBar)
|
||||
.init()
|
||||
|
||||
initListeners()
|
||||
}
|
||||
|
||||
private fun initListeners() {
|
||||
binding.ivBack.setOnClickListener {
|
||||
finish()
|
||||
}
|
||||
|
||||
binding.itemDistance.setOnClickListener {
|
||||
val dialog = CustomDialogFragmentText()
|
||||
.setTitle(getString(R.string.strike_distance))
|
||||
.setInputText(binding.tvDistance.text.toString().replace("m", ""))
|
||||
dialog.setOnConfirmListener { distance ->
|
||||
binding.tvDistance.text = "${distance}m"
|
||||
}
|
||||
dialog.show(supportFragmentManager, "DistanceDialog")
|
||||
}
|
||||
|
||||
binding.itemInterval.setOnClickListener {
|
||||
val dialog = CustomDialogFragmentText()
|
||||
.setTitle(getString(R.string.strike_interval))
|
||||
.setInputText(binding.tvInterval.text.toString().replace("s", ""))
|
||||
dialog.setOnConfirmListener { interval ->
|
||||
binding.tvInterval.text = "${interval}s"
|
||||
}
|
||||
dialog.show(supportFragmentManager, "IntervalDialog")
|
||||
}
|
||||
|
||||
binding.itemContainer.setOnClickListener {
|
||||
val dialog = ContainerSelectDialog(this)
|
||||
dialog.setSelectedContainer(binding.tvContainer.text.toString())
|
||||
dialog.setOnConfirmListener { container ->
|
||||
binding.tvContainer.text = container
|
||||
}
|
||||
dialog.show()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package com.example.defenseapplication.view
|
||||
|
||||
import android.app.Dialog
|
||||
import android.content.Context
|
||||
import android.os.Bundle
|
||||
import android.view.Gravity
|
||||
import android.view.WindowManager
|
||||
import com.example.defenseapplication.R
|
||||
import com.example.defenseapplication.databinding.DialogAutoModeNoticeBinding
|
||||
|
||||
class AutoModeNoticeDialog(context: Context) : Dialog(context) {
|
||||
|
||||
private lateinit var binding: DialogAutoModeNoticeBinding
|
||||
private var onConfirmListener: (() -> Unit)? = null
|
||||
|
||||
fun setOnConfirmListener(listener: () -> Unit) {
|
||||
this.onConfirmListener = listener
|
||||
}
|
||||
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
binding = DialogAutoModeNoticeBinding.inflate(layoutInflater)
|
||||
setContentView(binding.root)
|
||||
|
||||
val window = window
|
||||
window?.let {
|
||||
val params = it.attributes
|
||||
params.gravity = Gravity.BOTTOM
|
||||
params.width = WindowManager.LayoutParams.MATCH_PARENT
|
||||
params.height = WindowManager.LayoutParams.WRAP_CONTENT
|
||||
it.attributes = params
|
||||
it.setBackgroundDrawableResource(R.drawable.round_bg)
|
||||
}
|
||||
|
||||
binding.btnConfirm.setOnClickListener {
|
||||
onConfirmListener?.invoke()
|
||||
dismiss()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
package com.example.defenseapplication.view
|
||||
|
||||
import android.app.Dialog
|
||||
import android.content.Context
|
||||
import android.graphics.Color
|
||||
import android.graphics.drawable.ColorDrawable
|
||||
import android.view.Gravity
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.WindowManager
|
||||
import com.example.defenseapplication.R
|
||||
import com.example.defenseapplication.databinding.DialogContainerSelectBinding
|
||||
|
||||
class ContainerSelectDialog(context: Context) {
|
||||
|
||||
private val dialog: Dialog = Dialog(context)
|
||||
private val binding: DialogContainerSelectBinding
|
||||
private var selectedContainer: String = "容器4"
|
||||
private var onConfirmListener: ((String) -> Unit)? = null
|
||||
|
||||
init {
|
||||
binding = DialogContainerSelectBinding.inflate(LayoutInflater.from(context))
|
||||
dialog.setContentView(binding.root)
|
||||
dialog.window?.apply {
|
||||
setGravity(Gravity.BOTTOM)
|
||||
setLayout(WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT)
|
||||
setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
|
||||
}
|
||||
|
||||
initListeners()
|
||||
}
|
||||
|
||||
private fun initListeners() {
|
||||
binding.btnCancel.setOnClickListener {
|
||||
dialog.dismiss()
|
||||
}
|
||||
|
||||
binding.btnConfirm.setOnClickListener {
|
||||
onConfirmListener?.invoke(selectedContainer)
|
||||
dialog.dismiss()
|
||||
}
|
||||
|
||||
binding.itemContainer1.setOnClickListener {
|
||||
selectContainer("容器1")
|
||||
}
|
||||
|
||||
binding.itemContainer2.setOnClickListener {
|
||||
selectContainer("容器2")
|
||||
}
|
||||
|
||||
binding.itemContainer3.setOnClickListener {
|
||||
selectContainer("容器3")
|
||||
}
|
||||
|
||||
binding.itemContainer4.setOnClickListener {
|
||||
selectContainer("容器4")
|
||||
}
|
||||
}
|
||||
|
||||
private fun selectContainer(container: String) {
|
||||
selectedContainer = container
|
||||
updateSelectedStyle()
|
||||
}
|
||||
|
||||
private fun updateSelectedStyle() {
|
||||
val bgSelected = R.drawable.bg_bottom_sheet_rounded
|
||||
val bgNormal = android.R.color.transparent
|
||||
|
||||
binding.itemContainer1.setBackgroundResource(if (selectedContainer == "容器1") bgSelected else bgNormal)
|
||||
binding.itemContainer2.setBackgroundResource(if (selectedContainer == "容器2") bgSelected else bgNormal)
|
||||
binding.itemContainer3.setBackgroundResource(if (selectedContainer == "容器3") bgSelected else bgNormal)
|
||||
binding.itemContainer4.setBackgroundResource(if (selectedContainer == "容器4") bgSelected else bgNormal)
|
||||
|
||||
val textViews = listOf(binding.itemContainer1.getChildAt(0) as android.widget.TextView,
|
||||
binding.itemContainer2.getChildAt(0) as android.widget.TextView,
|
||||
binding.itemContainer3.getChildAt(0) as android.widget.TextView,
|
||||
binding.itemContainer4.getChildAt(0) as android.widget.TextView)
|
||||
|
||||
textViews.forEach { tv ->
|
||||
tv.setTextColor(if (tv.text == selectedContainer) dialog.context.getColor(R.color.black) else dialog.context.getColor(R.color.gray))
|
||||
}
|
||||
}
|
||||
|
||||
fun setSelectedContainer(container: String) {
|
||||
selectedContainer = container
|
||||
updateSelectedStyle()
|
||||
}
|
||||
|
||||
fun setOnConfirmListener(listener: (String) -> Unit) {
|
||||
this.onConfirmListener = listener
|
||||
}
|
||||
|
||||
fun show() {
|
||||
updateSelectedStyle()
|
||||
dialog.show()
|
||||
}
|
||||
|
||||
fun dismiss() {
|
||||
dialog.dismiss()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
import android.app.Dialog
|
||||
import android.app.TimePickerDialog
|
||||
import android.os.Bundle
|
||||
import android.text.format.DateFormat
|
||||
import android.widget.TimePicker
|
||||
import androidx.fragment.app.DialogFragment
|
||||
import java.util.Calendar
|
||||
|
||||
class TimePickerFragment(private val onTimeSelected: (hour: Int, minute: Int) -> Unit) :
|
||||
DialogFragment(), TimePickerDialog.OnTimeSetListener {
|
||||
|
||||
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
|
||||
// 使用当前时间作为默认值
|
||||
val c = Calendar.getInstance()
|
||||
val hour = c.get(Calendar.HOUR_OF_DAY)
|
||||
val minute = c.get(Calendar.MINUTE)
|
||||
|
||||
// 创建并返回 TimePickerDialog 实例
|
||||
// activity 参数需要可空性处理,this是OnTimeSetListener,最后一个是是否24小时制
|
||||
return TimePickerDialog(
|
||||
requireActivity(),
|
||||
this,
|
||||
hour,
|
||||
minute,
|
||||
DateFormat.is24HourFormat(activity)
|
||||
)
|
||||
}
|
||||
|
||||
override fun onTimeSet(view: TimePicker?, hourOfDay: Int, minute: Int) {
|
||||
// 当用户设置时间时,通过回调将结果传回
|
||||
onTimeSelected(hourOfDay, minute)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user