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">--> <!-- <!– 倒数日列表 –>--> <!-- <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>