You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发:Kotlin实现7天屏幕时间录入与周平均计算方案咨询

7天屏幕时间录入与周平均统计实现方案

一、数据模型设计

先定义数据类统一管理单天记录,数组/列表存储7天数据更清晰:

// Kotlin示例,Java可改用JavaBean
data class ScreenTimeRecord(
    val date: String, // 日期格式如"2024-05-20"
    val morningTime: Int, // 早屏幕时间(分钟)
    val eveningTime: Int, // 晚屏幕时间(分钟)
    val remark: String // 当日备注
)

// 初始化7天空记录的列表
val weeklyRecords = mutableListOf<ScreenTimeRecord>()

二、用ListView实现规整的录入界面

1. 自定义列表项布局(item_screen_time.xml)

每个列表项对应一天的录入字段,避免EditText杂乱堆积:

<?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"
    android:background="@drawable/item_border" <!-- 可选:添加边框区分项 -->
    android:layout_marginBottom="8dp">

    <EditText
        android:id="@+id/et_date"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="输入日期(如2024-05-20)"
        android:inputType="date" />

    <EditText
        android:id="@+id/et_morning_time"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="早屏幕时间(分钟)"
        android:inputType="number"
        android:layout_marginTop="8dp" />

    <EditText
        android:id="@+id/et_evening_time"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="晚屏幕时间(分钟)"
        android:inputType="number"
        android:layout_marginTop="8dp" />

    <EditText
        android:id="@+id/et_remark"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="当日备注"
        android:layout_marginTop="8dp" />
</LinearLayout>

2. 自定义ListView适配器

通过适配器绑定数据与列表项,实时同步用户输入:

class ScreenTimeAdapter(
    private val context: Context,
    private val records: MutableList<ScreenTimeRecord>
) : BaseAdapter() {

    override fun getCount(): Int = records.size
    override fun getItem(position: Int): ScreenTimeRecord = records[position]
    override fun getItemId(position: Int): Long = position.toLong()

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        val view = convertView ?: LayoutInflater.from(context)
            .inflate(R.layout.item_screen_time, parent, false)

        val etDate = view.findViewById<EditText>(R.id.et_date)
        val etMorning = view.findViewById<EditText>(R.id.et_morning_time)
        val etEvening = view.findViewById<EditText>(R.id.et_evening_time)
        val etRemark = view.findViewById<EditText>(R.id.et_remark)

        val currentRecord = records[position]
        // 初始化输入框内容
        etDate.setText(currentRecord.date)
        etMorning.setText(currentRecord.morningTime.toString())
        etEvening.setText(currentRecord.eveningTime.toString())
        etRemark.setText(currentRecord.remark)

        // 监听输入变化,实时更新列表数据
        etDate.addTextChangedListener(object : TextWatcher {
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                records[position] = currentRecord.copy(date = s.toString())
            }
            override fun afterTextChanged(s: Editable?) {}
        })

        etMorning.addTextChangedListener(object : TextWatcher {
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                val time = s.toString().toIntOrNull() ?: 0
                records[position] = currentRecord.copy(morningTime = time)
            }
            override fun afterTextChanged(s: Editable?) {}
        })

        etEvening.addTextChangedListener(object : TextWatcher {
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                val time = s.toString().toIntOrNull() ?: 0
                records[position] = currentRecord.copy(eveningTime = time)
            }
            override fun afterTextChanged(s: Editable?) {}
        })

        etRemark.addTextChangedListener(object : TextWatcher {
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                records[position] = currentRecord.copy(remark = s.toString())
            }
            override fun afterTextChanged(s: Editable?) {}
        })

        return view
    }
}

3. 主Activity初始化ListView

class MainActivity : AppCompatActivity() {
    private lateinit var listView: ListView
    private lateinit var adapter: ScreenTimeAdapter
    private val weeklyRecords = mutableListOf<ScreenTimeRecord>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        listView = findViewById(R.id.list_view)
        // 初始化7条空记录
        repeat(7) {
            weeklyRecords.add(ScreenTimeRecord("", 0, 0, ""))
        }
        adapter = ScreenTimeAdapter(this, weeklyRecords)
        listView.adapter = adapter

        // 跳转到统计页面的按钮逻辑
        findViewById<Button>(R.id.btn_calculate).setOnClickListener {
            val intent = Intent(this, StatActivity::class.java)
            // 传递数据(Kotlin data类默认实现Serializable)
            intent.putExtra("weekly_records", ArrayList(weeklyRecords))
            startActivity(intent)
        }
    }
}

主Activity布局(activity_main.xml):

<?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">

    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <Button
        android:id="@+id/btn_calculate"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="计算周平均屏幕时间"
        android:layout_marginTop="16dp" />
</LinearLayout>

三、周平均统计页面实现

1. 统计页面布局(activity_stat.xml)

<?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"
    android:gravity="center">

    <TextView
        android:id="@+id/tv_avg_morning"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:layout_marginBottom="16dp" />

    <TextView
        android:id="@+id/tv_avg_evening"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:layout_marginBottom="16dp" />

    <TextView
        android:id="@+id/tv_avg_total"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:textStyle="bold" />
</LinearLayout>

2. 统计页面逻辑(StatActivity.kt)

class StatActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_stat)

        // 获取传递的记录数据
        val records = intent.getSerializableExtra("weekly_records") as ArrayList<ScreenTimeRecord>
        
        // 计算总时长
        var totalMorning = 0
        var totalEvening = 0
        records.forEach {
            totalMorning += it.morningTime
            totalEvening += it.eveningTime
        }

        // 计算平均(保留1位小数)
        val avgMorning = totalMorning / 7.0
        val avgEvening = totalEvening / 7.0
        val avgTotal = (totalMorning + totalEvening) / 7.0

        // 展示结果
        findViewById<TextView>(R.id.tv_avg_morning).text = "早屏幕时间周平均:%.1f分钟".format(avgMorning)
        findViewById<TextView>(R.id.tv_avg_evening).text = "晚屏幕时间周平均:%.1f分钟".format(avgEvening)
        findViewById<TextView>(R.id.tv_avg_total).text = "每日总屏幕时间周平均:%.1f分钟".format(avgTotal)
    }
}

四、优化建议

  • 日期输入可改用DatePickerDialog替代EditText,避免格式错误。
  • 添加输入验证:限制屏幕时间为非负数,校验日期格式。
  • 若需持久化数据,可使用SharedPreferences或Room数据库保存记录。

内容的提问来源于stack exchange,提问作者noobieCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:05:06