1
tj
2025-02-27 768f1d38c5357e214e6cff018e57ef7bcb64ee60
1
已修改11个文件
已添加21个文件
1428 ■■■■■ 文件已修改
app/build.gradle 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/entity/Item.kt 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/ui/reminderOther/ReminderOtherAddActivity2.kt 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/ui/reminderOther/ReminderSettingsFragmentOther.kt 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/ui/reminderOther/ReminderSettingsFragmentOtherAdd.kt 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/ui/reminderOther/ReminderSettingsFragmentOtherAddViewModel.kt 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/ui/reminderOther/ReminderSettingsFragmentOtherViewModel.kt 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/ui/reminderOther/RepeatCycleDialogFragment.kt 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/com/example/firstapp/ui/reminderOther/TimePickerBottomSheetFragment.kt 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/button_blue.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/button_pink.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/ic_add.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/ic_anniversary.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/ic_delete.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/drawable/ic_edit.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/activity_reminder_other_add2.xml 194 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/date_record_layout.xml 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_notifications.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_reminder_settings_fragment_other.xml 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_reminder_settings_fragment_other_add.xml 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_repeat_cycle_dialog_list_dialog.xml 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/fragment_time_picker_bottom_sheet_list_dialog.xml 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/item_countdown.xml 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/navigation/mobile_navigation.xml 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values-night/themes.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values/attrs.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values/colors.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values/dimens.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values/strings.xml 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values/styles.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/values/themes.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/build.gradle
@@ -120,6 +120,8 @@
    implementation libs.androidx.lifecycle.viewmodel.ktx
    implementation libs.androidx.navigation.fragment.ktx
    implementation libs.androidx.navigation.ui.ktx
    implementation libs.androidx.legacy.support.v4
    implementation libs.androidx.recyclerview
    testImplementation libs.junit
    androidTestImplementation libs.androidx.junit
    androidTestImplementation libs.androidx.espresso.core
@@ -262,5 +264,12 @@
    //附加功能的工具类
    implementation("com.github.xuexiangjys.XUtil:xutil-sub:2.0.0")
    // 滑轮滚动控件
    implementation 'com.github.open-android:WheelPicker:v1.0.0'
    // 滚轮滑动控件级联
    implementation 'com.contrarywind:Android-PickerView:4.1.9'
}
app/src/main/java/com/example/firstapp/entity/Item.kt
app/src/main/java/com/example/firstapp/ui/notifications/NotificationsFragment.kt
@@ -16,6 +16,8 @@
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.example.firstapp.R
import com.example.firstapp.databinding.FragmentNotificationsBinding
import com.example.firstapp.ui.reminderOther.ReminderOtherAddActivity2
import com.example.firstapp.ui.reminderOther.ReminderSettingsFragmentOther
class NotificationsFragment : Fragment() {
@@ -44,6 +46,14 @@
            findNavController().navigate(R.id.action_navigation_notifications_to_reminderSettingsFragment)
        }
//         设置其他提醒
        binding.settingsReminderOther.setOnClickListener {
            // 跳转到设置提醒页面
            findNavController().navigate(R.id.action_settings_to_reminderSettingsFragmentOther)
        }
        // 关于小红书
        binding.aboutApp.setOnClickListener {
            // 跳转到小红书账号页面
app/src/main/java/com/example/firstapp/ui/reminderOther/ReminderOtherAddActivity2.kt
对比新文件
@@ -0,0 +1,164 @@
package com.example.firstapp.ui.reminderOther
import androidx.appcompat.app.AppCompatActivity
import android.annotation.SuppressLint
import android.os.Build
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import android.view.MotionEvent
import android.view.View
import android.view.WindowInsets
import android.widget.LinearLayout
import android.widget.TextView
import com.example.firstapp.databinding.ActivityReminderOtherAdd2Binding
import com.example.firstapp.R
/**
 * An example full-screen activity that shows and hides the system UI (i.e.
 * status bar and navigation/system bar) with user interaction.
 */
class ReminderOtherAddActivity2 : AppCompatActivity() {
    private lateinit var binding: ActivityReminderOtherAdd2Binding
    private lateinit var fullscreenContent: TextView
    private lateinit var fullscreenContentControls: LinearLayout
    private val hideHandler = Handler(Looper.myLooper()!!)
    @SuppressLint("InlinedApi")
    private val hidePart2Runnable = Runnable {
        // Delayed removal of status and navigation bar
        if (Build.VERSION.SDK_INT >= 30) {
            fullscreenContent.windowInsetsController?.hide(WindowInsets.Type.statusBars() or WindowInsets.Type.navigationBars())
        } else {
            // Note that some of these constants are new as of API 16 (Jelly Bean)
            // and API 19 (KitKat). It is safe to use them, as they are inlined
            // at compile-time and do nothing on earlier devices.
            fullscreenContent.systemUiVisibility =
                View.SYSTEM_UI_FLAG_LOW_PROFILE or
                        View.SYSTEM_UI_FLAG_FULLSCREEN or
                        View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
                        View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY or
                        View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or
                        View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
        }
    }
    private val showPart2Runnable = Runnable {
        // Delayed display of UI elements
        supportActionBar?.show()
        fullscreenContentControls.visibility = View.VISIBLE
    }
    private var isFullscreen: Boolean = false
    private val hideRunnable = Runnable { hide() }
    /**
     * Touch listener to use for in-layout UI controls to delay hiding the
     * system UI. This is to prevent the jarring behavior of controls going away
     * while interacting with activity UI.
     */
    private val delayHideTouchListener = View.OnTouchListener { view, motionEvent ->
        when (motionEvent.action) {
            MotionEvent.ACTION_DOWN -> if (AUTO_HIDE) {
                delayedHide(AUTO_HIDE_DELAY_MILLIS)
            }
            MotionEvent.ACTION_UP -> view.performClick()
            else -> {
            }
        }
        false
    }
    @SuppressLint("ClickableViewAccessibility")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityReminderOtherAdd2Binding.inflate(layoutInflater)
        setContentView(binding.root)
        supportActionBar?.setDisplayHomeAsUpEnabled(true)
        isFullscreen = true
        fullscreenContent = binding.fullscreenContent
        fullscreenContent.setOnClickListener { toggle() }
        fullscreenContentControls = binding.fullscreenContentControls
        binding.dummyButton.setOnTouchListener(delayHideTouchListener)
    }
    override fun onPostCreate(savedInstanceState: Bundle?) {
        super.onPostCreate(savedInstanceState)
        // Trigger the initial hide() shortly after the activity has been
        // created, to briefly hint to the user that UI controls
        // are available.
        delayedHide(100)
    }
    private fun toggle() {
        if (isFullscreen) {
            hide()
        } else {
            show()
        }
    }
    private fun hide() {
        // Hide UI first
        supportActionBar?.hide()
        fullscreenContentControls.visibility = View.GONE
        isFullscreen = false
        // Schedule a runnable to remove the status and navigation bar after a delay
        hideHandler.removeCallbacks(showPart2Runnable)
        hideHandler.postDelayed(hidePart2Runnable, UI_ANIMATION_DELAY.toLong())
    }
    private fun show() {
        // Show the system bar
        if (Build.VERSION.SDK_INT >= 30) {
            fullscreenContent.windowInsetsController?.show(WindowInsets.Type.statusBars() or WindowInsets.Type.navigationBars())
        } else {
            fullscreenContent.systemUiVisibility =
                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or
                        View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
        }
        isFullscreen = true
        // Schedule a runnable to display UI elements after a delay
        hideHandler.removeCallbacks(hidePart2Runnable)
        hideHandler.postDelayed(showPart2Runnable, UI_ANIMATION_DELAY.toLong())
    }
    /**
     * Schedules a call to hide() in [delayMillis], canceling any
     * previously scheduled calls.
     */
    private fun delayedHide(delayMillis: Int) {
        hideHandler.removeCallbacks(hideRunnable)
        hideHandler.postDelayed(hideRunnable, delayMillis.toLong())
    }
    companion object {
        /**
         * Whether or not the system UI should be auto-hidden after
         * [AUTO_HIDE_DELAY_MILLIS] milliseconds.
         */
        private const val AUTO_HIDE = true
        /**
         * If [AUTO_HIDE] is set, the number of milliseconds to wait after
         * user interaction before hiding the system UI.
         */
        private const val AUTO_HIDE_DELAY_MILLIS = 3000
        /**
         * Some older devices needs a small delay between UI widget updates
         * and a change of the status and navigation bar.
         */
        private const val UI_ANIMATION_DELAY = 300
    }
}
app/src/main/java/com/example/firstapp/ui/reminderOther/ReminderSettingsFragmentOther.kt
对比新文件
@@ -0,0 +1,49 @@
package com.example.firstapp.ui.reminderOther
import androidx.fragment.app.viewModels
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageButton
import com.example.firstapp.R
import androidx.navigation.fragment.findNavController
import android.content.Intent
class ReminderSettingsFragmentOther : Fragment() {
    companion object {
        fun newInstance() = ReminderSettingsFragmentOther()
    }
    private val viewModel: ReminderSettingsFragmentOtherViewModel by viewModels()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // TODO: Use the ViewModel
    }
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        val view= inflater.inflate(
            R.layout.fragment_reminder_settings_fragment_other,
            container,
            false
        )
        // 找到按钮并设置点击事件
        val button = view.findViewById<ImageButton>(R.id.btn_add)
        button.setOnClickListener {
            // 使用 Navigation Component 进行导航
            findNavController().navigate(R.id.action_reminderSettingsFragmentOther_to_reminderSettingsFragmentOtherAdd)
//            val intent = Intent(requireContext(), ReminderOtherAddActivity2::class.java)
//            startActivity(intent)
        }
        return view
    }
}
app/src/main/java/com/example/firstapp/ui/reminderOther/ReminderSettingsFragmentOtherAdd.kt
对比新文件
@@ -0,0 +1,139 @@
package com.example.firstapp.ui.reminderOther
import android.app.DatePickerDialog
import android.app.TimePickerDialog
import androidx.fragment.app.viewModels
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.EditText
import android.widget.NumberPicker
import android.widget.Spinner
import android.widget.TextView
import android.widget.Toast
import com.bigkoo.pickerview.adapter.ArrayWheelAdapter
import com.contrarywind.view.WheelView
import com.example.firstapp.R
import com.example.firstapp.utils.Log
import com.itheima.wheelpicker.WheelPicker
import java.util.Calendar
class ReminderSettingsFragmentOtherAdd : Fragment() {
    private lateinit var etDate: EditText
    private lateinit var etTime: EditText // 用于显示选择的时间
    private lateinit var textViewSelected: TextView
    companion object {
        fun newInstance() = ReminderSettingsFragmentOtherAdd()
    }
    private val viewModel: ReminderSettingsFragmentOtherAddViewModel by viewModels()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // TODO: Use the ViewModel
    }
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        val rootView = inflater.inflate(
            R.layout.fragment_reminder_settings_fragment_other_add,
            container,
            false
        )
        // Initialize Spinner
        val dayTypeSpinner: Spinner = rootView.findViewById(R.id.sp_day_type)
        // Set up ArrayAdapter for Spinner
        val adapter = ArrayAdapter.createFromResource(
            requireContext(),
            R.array.day_types, // This should match the array in strings.xml
            android.R.layout.simple_spinner_item
        )
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
        dayTypeSpinner.adapter = adapter
        // 初始化日期控件
        etDate = rootView.findViewById(R.id.et_date)
        // 设置点击事件来显示日期选择器
        etDate.setOnClickListener {
            // 获取当前日期
            val calendar = Calendar.getInstance()
            val year = calendar.get(Calendar.YEAR)
            val month = calendar.get(Calendar.MONTH)
            val dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH)
            // 创建 DatePickerDialog
            val datePickerDialog = DatePickerDialog(
                requireContext(),
                DatePickerDialog.OnDateSetListener { view, selectedYear, selectedMonth, selectedDayOfMonth ->
                    // 设置选中的日期到 EditText
                    etDate.setText("$selectedYear-${selectedMonth + 1}-$selectedDayOfMonth")
                },
                year, month, dayOfMonth
            )
            // 显示 DatePickerDialog
            datePickerDialog.show()
        }
        // 添加重复周期按钮
        textViewSelected = rootView.findViewById(R.id.tv_selected_cycle)
        val tvRepeatCycle: TextView = rootView.findViewById(R.id.tv_repeat_cycle)
        tvRepeatCycle.setOnClickListener {
            showRepeatCycleBottomSheet()
        }
        // 初始化 etTime
        etTime = rootView.findViewById(R.id.et_time)
        // 设置点击事件来显示时间选择器
        etTime.setOnClickListener {
            showTimePickerBottomSheet()
        }
        return rootView;
    }
    private fun showRepeatCycleBottomSheet() {
        val repeatCycleBottomSheetFragment = RepeatCycleDialogFragment()
        // 显式实现 OnCycleSelectedListener 接口
        repeatCycleBottomSheetFragment.setOnCycleSelectedListener(object : RepeatCycleDialogFragment.OnCycleSelectedListener {
            override fun onCycleSelected(every: String, interval: String, unit: String) {
                val formattedCycle = "$every $interval $unit"
                // 这里可以将选择的重复周期显示在某个 TextView 或其他控件中
                textViewSelected.text = "重复周期: $formattedCycle"
            }
        })
        repeatCycleBottomSheetFragment.show(childFragmentManager, "RepeatCycleBottomSheetFragment")
    }
    private fun showTimePickerBottomSheet() {
        val timePickerBottomSheetFragment = TimePickerBottomSheetFragment()
        // 显式实现 OnTimeSelectedListener 接口
        timePickerBottomSheetFragment.setOnTimeSelectedListener(object : TimePickerBottomSheetFragment.OnTimeSelectedListener {
            override fun onTimeSelected(hour: Int, minute: Int, second: Int) {
                val formattedTime = String.format("%02d:%02d:%02d", hour, minute, second)
                etTime.setText(formattedTime)
            }
        })
        timePickerBottomSheetFragment.show(childFragmentManager, "TimePickerBottomSheetFragment")
    }
}
app/src/main/java/com/example/firstapp/ui/reminderOther/ReminderSettingsFragmentOtherAddViewModel.kt
对比新文件
@@ -0,0 +1,7 @@
package com.example.firstapp.ui.reminderOther
import androidx.lifecycle.ViewModel
class ReminderSettingsFragmentOtherAddViewModel : ViewModel() {
    // TODO: Implement the ViewModel
}
app/src/main/java/com/example/firstapp/ui/reminderOther/ReminderSettingsFragmentOtherViewModel.kt
对比新文件
@@ -0,0 +1,7 @@
package com.example.firstapp.ui.reminderOther
import androidx.lifecycle.ViewModel
class ReminderSettingsFragmentOtherViewModel : ViewModel() {
    // TODO: Implement the ViewModel
}
app/src/main/java/com/example/firstapp/ui/reminderOther/RepeatCycleDialogFragment.kt
对比新文件
@@ -0,0 +1,123 @@
// RepeatCycleDialogFragment.kt
package com.example.firstapp.ui.reminderOther
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.bigkoo.pickerview.adapter.ArrayWheelAdapter
import com.contrarywind.view.WheelView
import com.example.firstapp.R
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
class RepeatCycleDialogFragment : BottomSheetDialogFragment() {
    private lateinit var wheelEvery: WheelView
    private lateinit var wheelInterval: WheelView
    private lateinit var wheelUnit: WheelView
    private var listener: OnCycleSelectedListener? = null
    interface OnCycleSelectedListener {
        fun onCycleSelected(every: String, interval: String, unit: String)
    }
    fun setOnCycleSelectedListener(listener: OnCycleSelectedListener) {
        this.listener = listener
    }
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_repeat_cycle_dialog_list_dialog, container, false)
        wheelEvery = view.findViewById(R.id.wheelEvery)
        wheelInterval = view.findViewById(R.id.wheelInterval)
        wheelUnit = view.findViewById(R.id.wheelUnit)
        // 设置 "每" 数据源
        val everyOptions = listOf("每")
        val everyAdapter = ArrayWheelAdapter(everyOptions)
        wheelEvery.setAdapter(everyAdapter)
        wheelEvery.currentItem = 0
        // 如果只有一个元素,禁止滚动
        if (everyOptions.size <= 1) {
            wheelEvery.setCyclic(false)  // 禁止循环
            wheelEvery.isEnabled = false // 禁止滚动
        } else {
            wheelEvery.setCyclic(true)   // 允许循环
            wheelEvery.isEnabled = true  // 允许滚动
        }
        // 设置间隔数据源
        val intervalOptions = listOf("不重复") + (1..30).map { it.toString() } // 你可以根据需要调整范围
        val intervalAdapter = ArrayWheelAdapter(intervalOptions)
        wheelInterval.setAdapter(intervalAdapter)
        wheelInterval.currentItem = 0
        // 设置单位数据源
        val unitOptions = listOf("天", "周", "月", "年")
        val unitAdapter = ArrayWheelAdapter(unitOptions)
        wheelUnit.setAdapter(unitAdapter)
        // 设置显示的项数,不要重复显示
//        wheelUnit.setItemsVisibleCount(4)  // 设置可见项数,适当调整这个值
        // 禁止循环滚动
        wheelUnit.setCyclic(false)
        wheelUnit.currentItem = 0
        // 初始状态:如果 "不重复" 被选中,隐藏 wheelEvery 和 wheelUnit
        if (intervalOptions[wheelInterval.currentItem] == "不重复") {
            wheelEvery.visibility = View.GONE
            wheelUnit.visibility = View.GONE
        } else {
            wheelEvery.visibility = View.VISIBLE
            wheelUnit.visibility = View.VISIBLE
        }
        // 设置间隔选择监听器
        wheelInterval.setOnItemSelectedListener { index ->
            val selectedInterval = intervalOptions[index]
            if (selectedInterval == "不重复") {
                wheelEvery.visibility = View.GONE
                wheelUnit.visibility = View.GONE
            } else {
                wheelEvery.visibility = View.VISIBLE
                wheelUnit.visibility = View.VISIBLE
            }
        }
        // 设置确认按钮
        view.findViewById<View>(R.id.repeat_cycle_btn_confirm).setOnClickListener {
            val selectedEvery = everyOptions[wheelEvery.currentItem]
            val selectedInterval = intervalOptions[wheelInterval.currentItem]
            val selectedUnit = unitOptions[wheelUnit.currentItem]
            listener?.onCycleSelected(selectedEvery, selectedInterval, selectedUnit)
            dismiss()
        }
        // 设置取消按钮
        view.findViewById<View>(R.id.repeat_cycle_btn_cancel).setOnClickListener {
            dismiss()
        }
        return view
    }
    companion object {
        // TODO: Customize parameters
        fun newInstance(): RepeatCycleDialogFragment =
            RepeatCycleDialogFragment().apply {
                arguments = Bundle().apply {
                    // 你可以在这里传递参数,但在这个例子中不需要
                }
            }
    }
}
app/src/main/java/com/example/firstapp/ui/reminderOther/TimePickerBottomSheetFragment.kt
对比新文件
@@ -0,0 +1,72 @@
package com.example.firstapp.ui.reminderOther
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.bigkoo.pickerview.adapter.ArrayWheelAdapter
import com.contrarywind.view.WheelView
import com.example.firstapp.R
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
class TimePickerBottomSheetFragment : BottomSheetDialogFragment() {
    private lateinit var wheelHour: WheelView
    private lateinit var wheelMinute: WheelView
    private lateinit var wheelSecond: WheelView
    private var listener: OnTimeSelectedListener? = null
    interface OnTimeSelectedListener {
        fun onTimeSelected(hour: Int, minute: Int, second: Int)
    }
    fun setOnTimeSelectedListener(listener: OnTimeSelectedListener) {
        this.listener = listener
    }
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_time_picker_bottom_sheet_list_dialog, container, false)
        wheelHour = view.findViewById(R.id.wheelHour2)
        wheelMinute = view.findViewById(R.id.wheelMinute2)
        wheelSecond = view.findViewById(R.id.wheelSecond2)
        // 设置小时数据源
        val hours = (0..23).map { it.toString() }
        val hourAdapter = ArrayWheelAdapter(hours)
        wheelHour.setAdapter(hourAdapter)
        wheelHour.currentItem = 0
        // 设置分钟数据源
        val minutes = (0..59).map { it.toString().padStart(2, '0') }
        val minuteAdapter = ArrayWheelAdapter(minutes)
        wheelMinute.setAdapter(minuteAdapter)
        wheelMinute.currentItem = 0
        // 设置秒数据源
        val seconds = (0..59).map { it.toString().padStart(2, '0') }
        val secondAdapter = ArrayWheelAdapter(seconds)
        wheelSecond.setAdapter(secondAdapter)
        wheelSecond.currentItem = 0
        // 设置确认按钮
        view.findViewById<View>(R.id.btn_confirm2).setOnClickListener {
            val selectedHour = wheelHour.currentItem
            val selectedMinute = wheelMinute.currentItem
            val selectedSecond = wheelSecond.currentItem
            listener?.onTimeSelected(selectedHour, selectedMinute, selectedSecond)
            dismiss()
        }
        // 设置取消按钮
        view.findViewById<View>(R.id.btn_cancel2).setOnClickListener {
            dismiss()
        }
        return view
    }
}
app/src/main/res/drawable/button_blue.xml
对比新文件
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#2196F3"/>
    <corners android:radius="4dp"/>
</shape>
app/src/main/res/drawable/button_pink.xml
对比新文件
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="#FF4081"/>
    <corners android:radius="4dp"/>
</shape>
app/src/main/res/drawable/ic_add.xml
对比新文件
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24">
    <path
        android:fillColor="#2196F3"
        android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM17,13h-4v4h-2v-4H7v-2h4V7h2v4h4v2z"/>
</vector>
app/src/main/res/drawable/ic_anniversary.xml
对比新文件
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24">
    <path
        android:fillColor="#FF4081"
        android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z"/>
</vector>
app/src/main/res/drawable/ic_delete.xml
对比新文件
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24">
    <path
        android:fillColor="#FF4081"
        android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM17,13H7v-2h10v2z"/>
</vector>
app/src/main/res/drawable/ic_edit.xml
对比新文件
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24">
    <path
        android:fillColor="#757575"
        android:pathData="M3,17.46v3.04c0,0.28 0.22,0.5 0.5,0.5h3.04c0.13,0 0.26,-0.05 0.35,-0.15L17.81,9.94l-3.75,-3.75L3.15,17.1c-0.1,0.1 -0.15,0.22 -0.15,0.36zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z"/>
</vector>
app/src/main/res/layout/activity_reminder_other_add2.xml
对比新文件
@@ -0,0 +1,194 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?attr/fullscreenBackgroundColor"
    android:theme="@style/ThemeOverlay.FirstApp.FullscreenContainer"
    tools:context=".ui.reminderOther.ReminderOtherAddActivity2">
    <!-- The primary full-screen view. This can be replaced with whatever view
         is needed to present your content, e.g. VideoView, SurfaceView,
         TextureView, etc. -->
    <TextView
        android:id="@+id/fullscreen_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:keepScreenOn="true"
        android:text="@string/dummy_content"
        android:textColor="?attr/fullscreenTextColor"
        android:textSize="50sp"
        android:textStyle="bold" />
    <!-- This FrameLayout insets its children based on system windows using
         android:fitsSystemWindows. -->
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">
        <LinearLayout
            android:id="@+id/fullscreen_content_controls"
            style="@style/Widget.Theme.FirstApp.ButtonBar.Fullscreen"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|center_horizontal"
            android:orientation="horizontal"
            tools:ignore="UselessParent">
            <EditText
                android:id="@+id/et_special_day_name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="请输入纪念日名称"
                android:inputType="text"
                android:ems="10"
                android:background="?attr/editTextBackground"/>
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="日子类型"
                android:textSize="16sp"
                android:paddingTop="16dp"/>
            <RadioGroup
                android:id="@+id/rg_day_type"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:paddingBottom="16dp">
                <RadioButton
                    android:id="@+id/rb_anniversary"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_weight="1"
                    android:text="纪念日"/>
                <!-- Add more RadioButton items as needed -->
            </RadioGroup>
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="日期"
                android:textSize="16sp"
                android:paddingTop="16dp"/>
            <DatePicker
                android:id="@+id/dp_date"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="16dp"/>
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="重复周期"
                android:textSize="16sp"
                android:paddingTop="16dp"/>
<!--            <Spinner-->
<!--                android:id="@+id/sp_repeat_cycle"-->
<!--                android:layout_width="match_parent"-->
<!--                android:layout_height="wrap_content"-->
<!--                android:entries="@array/repeat_cycles"-->
<!--                android:layout_marginBottom="16dp"/>-->
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="定期提醒"
                android:textSize="16sp"
                android:paddingTop="16dp"/>
<!--            <Spinner-->
<!--                android:id="@+id/sp_regular_reminder"-->
<!--                android:layout_width="match_parent"-->
<!--                android:layout_height="wrap_content"-->
<!--                android:entries="@array/regular_reminders"-->
<!--                android:layout_marginBottom="16dp"/>-->
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="每天提醒"
                android:textSize="16sp"
                android:paddingTop="16dp"/>
            <Switch
                android:id="@+id/sw_daily_reminder"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="end"
                android:checked="false"
                android:layout_marginBottom="16dp"/>
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="时间精确到秒"
                android:textSize="16sp"
                android:paddingTop="16dp"/>
            <Switch
                android:id="@+id/sw_time_to_second"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="end"
                android:checked="false"
                android:layout_marginBottom="16dp"/>
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="置于首页顶部"
                android:textSize="16sp"
                android:paddingTop="16dp"/>
            <Switch
                android:id="@+id/sw_top_of_homepage"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="end"
                android:checked="false"
                android:layout_marginBottom="16dp"/>
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="包含起始日 (+1天)"
                android:textSize="16sp"
                android:paddingTop="16dp"/>
            <Switch
                android:id="@+id/sw_include_start_date"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="end"
                android:checked="false"
                android:layout_marginBottom="16dp"/>
            <Button
                android:id="@+id/btn_save"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="保存"
                android:layout_marginTop="16dp"/>
            <Button
                android:id="@+id/dummy_button"
                style="?android:attr/buttonBarButtonStyle"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/dummy_button" />
        </LinearLayout>
    </FrameLayout>
</FrameLayout>
app/src/main/res/layout/date_record_layout.xml
对比新文件
@@ -0,0 +1,127 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">
    <!-- 标题 -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="请输入纪念日名称"
        android:textSize="18sp"
        android:textColor="#333333"
        android:layout_marginBottom="16dp"/>
    <!-- 日期选项列表 -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:background="#FFFFFF"
        android:padding="16dp">
        <!-- 日子类型 -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:padding="8dp">
            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="日子类型"
                android:textColor="#333333"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="纪念日 >"
                android:textColor="#999999"/>
        </LinearLayout>
        <!-- 日期 -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:padding="8dp">
            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="日期"
                android:textColor="#333333"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="乙巳(2025)七月初七周五 >"
                android:textColor="#999999"/>
        </LinearLayout>
        <!-- 重复周期 -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:padding="8dp">
            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="重复周期"
                android:textColor="#333333"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="每年重新倒数 >"
                android:textColor="#999999"/>
        </LinearLayout>
        <!-- 提前提醒 -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:padding="8dp">
            <TextView
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="提前提醒"
                android:textColor="#333333"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="一周 >"
                android:textColor="#999999"/>
        </LinearLayout>
    </LinearLayout>
    <!-- 底部按钮 -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginTop="32dp">
        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="保存"
            android:textColor="#FFFFFF"
            android:background="@drawable/button_blue"
            android:layout_marginEnd="8dp"/>
        <Button
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="重置"
            android:textColor="#FFFFFF"
            android:background="@drawable/button_pink"
            android:layout_marginStart="8dp"/>
    </LinearLayout>
</LinearLayout>
app/src/main/res/layout/fragment_notifications.xml
@@ -49,6 +49,25 @@
                android:src="@drawable/right_forward" />
        </RelativeLayout>
        <!-- 设置其他提醒 -->
        <RelativeLayout
            android:id="@+id/settings_reminder_other"
            style="@style/SettingsItem">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:text="设置其他提醒" />
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentEnd="true"
                android:layout_centerVertical="true"
                android:src="@drawable/right_forward" />
        </RelativeLayout>
        <!-- 联系与反馈 -->
        <TextView
            android:layout_width="match_parent"
app/src/main/res/layout/fragment_reminder_settings_fragment_other.xml
对比新文件
@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.reminderOther.ReminderSettingsFragmentOther">
    <!-- 主要内容区域 -->
<!--    <LinearLayout-->
<!--        android:layout_width="match_parent"-->
<!--        android:layout_height="match_parent"-->
<!--        android:layout_above="@+id/bottom_navigation"-->
<!--        android:orientation="vertical">-->
<!--        &lt;!&ndash; 倒数日列表 &ndash;&gt;-->
<!--        <androidx.recyclerview.widget.RecyclerView-->
<!--            android:id="@+id/countdown_list"-->
<!--            android:layout_width="match_parent"-->
<!--            android:layout_height="match_parent"-->
<!--            android:padding="16dp" />-->
<!--    </LinearLayout>-->
    <!-- 底部导航栏 -->
    <LinearLayout
        android:id="@+id/bottom_navigation"
        android:layout_width="match_parent"
        android:layout_height="56dp"
        android:layout_alignParentBottom="true"
        android:background="#FFFFFF"
        android:orientation="horizontal"
        android:elevation="8dp"
        android:layout_marginTop="610dp"
        >
        <ImageButton
            android:id="@+id/btn_add"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="?android:attr/selectableItemBackground"
            android:src="@drawable/ic_add"
            android:contentDescription="添加"/>
        <ImageButton
            android:id="@+id/btn_edit"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="?android:attr/selectableItemBackground"
            android:src="@drawable/ic_edit"
            android:contentDescription="编辑"/>
        <ImageButton
            android:id="@+id/btn_delete"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:background="?android:attr/selectableItemBackground"
            android:src="@drawable/ic_delete"
            android:contentDescription="删除"/>
    </LinearLayout>
</LinearLayout>
app/src/main/res/layout/fragment_reminder_settings_fragment_other_add.xml
对比新文件
@@ -0,0 +1,109 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".ui.reminderOther.ReminderSettingsFragmentOtherAdd">
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="16dp">
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="16dp">
        <EditText
            android:id="@+id/et_special_day_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="请输入纪念日名称"
            android:inputType="text"
            android:ems="10"
            android:background="?attr/editTextBackground"/>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="日子类型"
            android:textSize="16sp"
            android:paddingTop="16dp"/>
        <Spinner
            android:id="@+id/sp_day_type"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="12dp"
            android:background="@android:drawable/btn_dropdown" />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="日期"
            android:textSize="16sp"
            android:paddingTop="16dp"/>
        <EditText
            android:id="@+id/et_date"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="选择日期"
            android:focusable="false"
            android:clickable="true"
            android:padding="12dp"
            android:background="@android:drawable/edit_text"
            android:textSize="16sp"
            android:layout_marginBottom="16dp"/>
        <TextView
            android:id="@+id/tv_repeat_cycle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="重复周期"
            android:textSize="16sp"
            android:paddingTop="16dp"
            android:clickable="true"
            android:focusable="true"
            android:textColor="?attr/colorPrimary" />
        <TextView
            android:id="@+id/tv_selected_cycle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="选择的重复周期: "
            android:textSize="16sp"
            android:paddingTop="8dp"/>
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="提前提醒"
            android:textSize="16sp"
            android:paddingTop="16dp"/>
        <!-- 时间选择按钮 -->
        <EditText
            android:id="@+id/et_time"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="选择时间"
            android:focusable="false"
            android:clickable="true"
            android:textColor="@android:color/black" />
        <Button
            android:id="@+id/btn_save"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="保存"
            android:layout_marginTop="16dp"/>
    </LinearLayout>
    </ScrollView>
</FrameLayout>
app/src/main/res/layout/fragment_repeat_cycle_dialog_list_dialog.xml
对比新文件
@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="16dp">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:padding="16dp">
        <com.contrarywind.view.WheelView
            android:id="@+id/wheelEvery"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content" />
        <com.contrarywind.view.WheelView
            android:id="@+id/wheelInterval"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content" />
        <com.contrarywind.view.WheelView
            android:id="@+id/wheelUnit"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content" />
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="end"
        android:padding="16dp">
        <Button
            android:id="@+id/repeat_cycle_btn_cancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="取消" />
        <Button
            android:id="@+id/repeat_cycle_btn_confirm"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="确定"
            android:layout_marginStart="16dp" />
    </LinearLayout>
</LinearLayout>
app/src/main/res/layout/fragment_time_picker_bottom_sheet_list_dialog.xml
对比新文件
@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="16dp">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:padding="16dp">
        <com.contrarywind.view.WheelView
            android:id="@+id/wheelHour2"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content" />
        <com.contrarywind.view.WheelView
            android:id="@+id/wheelMinute2"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content" />
        <com.contrarywind.view.WheelView
            android:id="@+id/wheelSecond2"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content" />
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="end"
        android:padding="16dp">
        <Button
            android:id="@+id/btn_cancel2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="取消" />
        <Button
            android:id="@+id/btn_confirm2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="确定"
            android:layout_marginStart="16dp" />
    </LinearLayout>
</LinearLayout>
app/src/main/res/layout/item_countdown.xml
对比新文件
@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="8dp"
    app:cardCornerRadius="8dp"
    app:cardElevation="2dp">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:padding="16dp"
        android:background="#FFF5F5">
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:orientation="vertical">
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:gravity="center_vertical">
                <ImageView
                    android:id="@+id/icon_type"
                    android:layout_width="20dp"
                    android:layout_height="20dp"
                    android:layout_marginEnd="8dp"
                    android:src="@drawable/ic_anniversary"/>
                <TextView
                    android:id="@+id/text_title"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="结婚一周年纪念日"
                    android:textColor="#333333"
                    android:textSize="16sp"/>
            </LinearLayout>
            <TextView
                android:id="@+id/text_date"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="4dp"
                android:text="起始日期 2025.01.14"
                android:textColor="#999999"
                android:textSize="12sp"/>
        </LinearLayout>
        <TextView
            android:id="@+id/text_days"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="265天后"
            android:textColor="#333333"
            android:textSize="16sp"
            android:textStyle="bold"/>
    </LinearLayout>
</androidx.cardview.widget.CardView>
app/src/main/res/navigation/mobile_navigation.xml
@@ -31,6 +31,16 @@
            app:exitAnim="@anim/nav_default_exit_anim"
            app:popEnterAnim="@anim/nav_default_pop_enter_anim"
            app:popExitAnim="@anim/nav_default_pop_exit_anim" />
        <!-- 新增的action,跳转到 ReminderSettingsFragmentOther -->
        <action
            android:id="@+id/action_settings_to_reminderSettingsFragmentOther"
            app:destination="@id/reminderSettingsFragmentOther"
            app:enterAnim="@anim/nav_default_enter_anim"
            app:exitAnim="@anim/nav_default_exit_anim"
            app:popEnterAnim="@anim/nav_default_pop_enter_anim"
            app:popExitAnim="@anim/nav_default_pop_exit_anim" />
    </fragment>
    <fragment
@@ -38,4 +48,23 @@
        android:name="com.example.firstapp.ui.reminder.ReminderSettingsFragment"
        android:label="设置提醒"
        tools:layout="@layout/fragment_reminder_settings" />
    <fragment
        android:id="@+id/reminderSettingsFragmentOther"
        android:name="com.example.firstapp.ui.reminderOther.ReminderSettingsFragmentOther"
        android:label="设置其他提醒"
        tools:layout="@layout/fragment_reminder_settings_fragment_other" >
        <action
            android:id="@+id/action_reminderSettingsFragmentOther_to_reminderSettingsFragmentOtherAdd"
            app:destination="@id/reminderSettingsFragmentOtherAdd" />
    </fragment>
    <fragment
        android:id="@+id/reminderSettingsFragmentOtherAdd"
        android:name="com.example.firstapp.ui.reminderOther.ReminderSettingsFragmentOtherAdd"
        android:label="新增" />
</navigation>
app/src/main/res/values-night/themes.xml
@@ -13,4 +13,9 @@
        <item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
        <!-- Customize your theme here. -->
    </style>
    <style name="ThemeOverlay.FirstApp.FullscreenContainer" parent="">
        <item name="fullscreenBackgroundColor">@color/light_blue_900</item>
        <item name="fullscreenTextColor">@color/light_blue_A400</item>
    </style>
</resources>
app/src/main/res/values/attrs.xml
对比新文件
@@ -0,0 +1,6 @@
<resources>
    <declare-styleable name="FullscreenAttrs">
        <attr name="fullscreenBackgroundColor" format="color" />
        <attr name="fullscreenTextColor" format="color" />
    </declare-styleable>
</resources>
app/src/main/res/values/colors.xml
@@ -7,4 +7,9 @@
    <color name="teal_700">#FF018786</color>
    <color name="black">#FF000000</color>
    <color name="white">#FFFFFFFF</color>
    <color name="light_blue_600">#FF039BE5</color>
    <color name="light_blue_900">#FF01579B</color>
    <color name="light_blue_A200">#FF40C4FF</color>
    <color name="light_blue_A400">#FF00B0FF</color>
    <color name="black_overlay">#66000000</color>
</resources>
app/src/main/res/values/dimens.xml
@@ -2,4 +2,6 @@
    <!-- Default screen margins, per the Android Design guidelines. -->
    <dimen name="activity_horizontal_margin">16dp</dimen>
    <dimen name="activity_vertical_margin">16dp</dimen>
    <dimen name="list_item_spacing">16dp</dimen>
    <dimen name="list_item_spacing_half">8dp</dimen>
</resources>
app/src/main/res/values/strings.xml
@@ -6,5 +6,50 @@
    <string name="notification_content">智信管家APP</string>
    <string name="title_activity_reminder_other_add">ReminderOtherAddActivity</string>
    <string name="dummy_button">Dummy Button</string>
    <string name="dummy_content">DUMMY\nCONTENT</string>
    <string name="title_activity_reminder_other_add2">添加纪念日</string>
    <string-array name="day_types">
        <item>纪念日</item>
        <item>生日</item>
        <item>节日</item>
        <!-- 可以根据需要添加更多选项 -->
    </string-array>
    <string-array name="day_month_year_options">
        <item>天</item>
        <item>月</item>
        <item>年</item>
    </string-array>
    <!-- 第一级选择器选项 -->
    <string-array name="level1_options">
        <item>不重复</item>
        <item>每</item>
    </string-array>
    <!-- 第二级选择器选项 (1到10000) -->
    <string-array name="level2_options">
        <item>1</item>
        <item>2</item>
        <item>3</item>
        <item>4</item>
        <!-- 可继续添加更多数字 -->
    </string-array>
    <!-- 第三级选择器选项 (天、周、月、年) -->
    <string-array name="level3_options">
        <item>天</item>
        <item>周</item>
        <item>月</item>
        <item>年</item>
    </string-array>
</resources>
app/src/main/res/values/styles.xml
@@ -1,4 +1,5 @@
<resources>
<style name="SettingsItem">
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">wrap_content</item>
@@ -7,4 +8,13 @@
    <item name="android:clickable">true</item>
    <item name="android:focusable">true</item>
</style>
    <style name="Widget.Theme.FirstApp.ActionBar.Fullscreen" parent="Widget.AppCompat.ActionBar">
        <item name="android:background">@color/black_overlay</item>
    </style>
    <style name="Widget.Theme.FirstApp.ButtonBar.Fullscreen" parent="">
        <item name="android:background">@color/black_overlay</item>
        <item name="android:buttonBarStyle">?android:attr/buttonBarStyle</item>
    </style>
</resources>
app/src/main/res/values/themes.xml
@@ -13,5 +13,16 @@
        <!-- Status bar color. -->
        <item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
        <!-- Customize your theme here. -->
    </style>
    <style name="Theme.FirstApp.Fullscreen" parent="Theme.FirstApp">
        <item name="android:actionBarStyle">@style/Widget.Theme.FirstApp.ActionBar.Fullscreen</item>
        <item name="android:windowActionBarOverlay">true</item>
        <item name="android:windowBackground">@null</item>
    </style>
    <style name="ThemeOverlay.FirstApp.FullscreenContainer" parent="">
        <item name="fullscreenBackgroundColor">@color/light_blue_600</item>
        <item name="fullscreenTextColor">@color/light_blue_A200</item>
    </style>
</resources>