Я работаю над исследовательским приложением для Android и столкнулся с проблемой при реализации функции завершения задач. Вот что мне нужно:
Пользователь выбирает задачу.
Появляется окно считывания QR-кода.
При сканировании правильного QR-кода должно появиться сообщение «Задание выполнено».
После завершения приложение должно вернуться на главную страницу со списком задач.
Завершенная задача должна быть отмечена зачеркнутым и выделенным серым цветом текстом.
Для этого я пробовал как встроенные флажки, так и специальную реализацию, но ни один из подходов не работает должным образом. Есть ли у кого-нибудь предложения о том, как правильно это реализовать? Мне удалось реализовать функцию чтения QR-кода и отображение завершенного всплывающего окна, но задача не помечается как выполненная на главной странице (т. е. просто отображается нормально).
Заранее спасибо!
Вот мой код для справки:
TaskElement
package com.example.syncops
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
// Data class to represent a task with a unique ID, name, and completion status
@Parcelize
data class TaskElement(
// Unique identifier for the task
val taskId: String,
// Name or description of the task
val taskName: String,
// Indicates whether the task is completed or not (default is false)
var completed: Boolean = false
) : Parcelable
TaskViewModel:
package com.example.syncops
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.*
class TaskViewModel : ViewModel() {
private val repository = TaskRepository()
// Initialize tasks as a SnapshotStateList for observable updates
private val _tasks = mutableStateListOf().apply { addAll(repository.getTasks()) }
// Expose tasks as a read-only list
val tasks: List get() = _tasks
private var trackingJob: Job? = null
fun startTracking(taskId: String) {
trackingJob?.cancel()
trackingJob = viewModelScope.launch(Dispatchers.IO) {
while (isActive) {
collectAndStoreData(taskId)
delay(60 * 1000)
}
}
}
fun stopTracking() {
trackingJob?.cancel()
trackingJob = null
}
private suspend fun collectAndStoreData(taskId: String) {
println("Collecting data for task ID: $taskId")
}
fun completeTask(task: TaskElement) {
val index = _tasks.indexOfFirst { it.taskId == task.taskId }
if (index != -1) {
// Update the state list using SnapshotStateList methods
_tasks.removeAt(index)
_tasks.add(index, task.copy(completed = true))
}
stopTracking()
}
}
Экран списка задач
package com.example.syncops
import android.content.Intent
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.unit.dp
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TaskListView(taskViewModel: TaskViewModel) {
val tasks = taskViewModel.tasks
// Access context within composable scope
val context = LocalContext.current
Column(modifier = Modifier.fillMaxSize()) {
TopAppBar(
title = { Text("Task List") }
)
LazyColumn(modifier = Modifier.fillMaxSize()) {
items(tasks) { task ->
TaskListItem(
task = task,
onTaskClick = {
// Only start tracking and open QR code scanner if the task is not completed
if (!task.completed) {
taskViewModel.startTracking(task.taskId)
context.startActivity(
Intent(context, QrCodeScannerActivity::class.java).apply {
putExtra("task_id", task.taskId)
putExtra("task_name", task.taskName)
}
)
}
}
)
}
}
}
}
@Composable
fun TaskListItem(task: TaskElement, onTaskClick: () -> Unit) {
val taskColor = if (task.completed) Color.Gray else Color.Black
val taskDecoration = if (task.completed) TextDecoration.LineThrough else TextDecoration.None
Row(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp)
.clickable { onTaskClick() },
verticalAlignment = Alignment.CenterVertically
) {
// Non-interactive Checkbox to show completion status
Checkbox(
checked = task.completed,
onCheckedChange = null // Non-interactive
)
Spacer(modifier = Modifier.width(8.dp)) // Space between checkbox and text
// Task text with appropriate color and decoration
Text(
text = task.taskName,
color = taskColor,
textDecoration = taskDecoration,
modifier = Modifier.weight(1f)
)
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... -task-list
Борьба с пользовательским интерфейсом завершения задач в приложении Android (список задач) ⇐ Android
Форум для тех, кто программирует под Android
1731834135
Anonymous
Я работаю над исследовательским приложением для Android и столкнулся с проблемой при реализации функции завершения задач. Вот что мне нужно:
Пользователь выбирает задачу.
Появляется окно считывания QR-кода.
При сканировании правильного QR-кода должно появиться сообщение «Задание выполнено».
После завершения приложение должно вернуться на главную страницу со списком задач.
Завершенная задача должна быть отмечена зачеркнутым и выделенным серым цветом текстом.
Для этого я пробовал как встроенные флажки, так и специальную реализацию, но ни один из подходов не работает должным образом. Есть ли у кого-нибудь предложения о том, как правильно это реализовать? Мне удалось реализовать функцию чтения QR-кода и отображение завершенного всплывающего окна, но задача не помечается как выполненная на главной странице (т. е. просто отображается нормально).
Заранее спасибо!
Вот мой код для справки:
TaskElement
package com.example.syncops
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
// Data class to represent a task with a unique ID, name, and completion status
@Parcelize
data class TaskElement(
// Unique identifier for the task
val taskId: String,
// Name or description of the task
val taskName: String,
// Indicates whether the task is completed or not (default is false)
var completed: Boolean = false
) : Parcelable
TaskViewModel:
package com.example.syncops
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.*
class TaskViewModel : ViewModel() {
private val repository = TaskRepository()
// Initialize tasks as a SnapshotStateList for observable updates
private val _tasks = mutableStateListOf().apply { addAll(repository.getTasks()) }
// Expose tasks as a read-only list
val tasks: List get() = _tasks
private var trackingJob: Job? = null
fun startTracking(taskId: String) {
trackingJob?.cancel()
trackingJob = viewModelScope.launch(Dispatchers.IO) {
while (isActive) {
collectAndStoreData(taskId)
delay(60 * 1000)
}
}
}
fun stopTracking() {
trackingJob?.cancel()
trackingJob = null
}
private suspend fun collectAndStoreData(taskId: String) {
println("Collecting data for task ID: $taskId")
}
fun completeTask(task: TaskElement) {
val index = _tasks.indexOfFirst { it.taskId == task.taskId }
if (index != -1) {
// Update the state list using SnapshotStateList methods
_tasks.removeAt(index)
_tasks.add(index, task.copy(completed = true))
}
stopTracking()
}
}
Экран списка задач
package com.example.syncops
import android.content.Intent
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.unit.dp
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun TaskListView(taskViewModel: TaskViewModel) {
val tasks = taskViewModel.tasks
// Access context within composable scope
val context = LocalContext.current
Column(modifier = Modifier.fillMaxSize()) {
TopAppBar(
title = { Text("Task List") }
)
LazyColumn(modifier = Modifier.fillMaxSize()) {
items(tasks) { task ->
TaskListItem(
task = task,
onTaskClick = {
// Only start tracking and open QR code scanner if the task is not completed
if (!task.completed) {
taskViewModel.startTracking(task.taskId)
context.startActivity(
Intent(context, QrCodeScannerActivity::class.java).apply {
putExtra("task_id", task.taskId)
putExtra("task_name", task.taskName)
}
)
}
}
)
}
}
}
}
@Composable
fun TaskListItem(task: TaskElement, onTaskClick: () -> Unit) {
val taskColor = if (task.completed) Color.Gray else Color.Black
val taskDecoration = if (task.completed) TextDecoration.LineThrough else TextDecoration.None
Row(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp)
.clickable { onTaskClick() },
verticalAlignment = Alignment.CenterVertically
) {
// Non-interactive Checkbox to show completion status
Checkbox(
checked = task.completed,
onCheckedChange = null // Non-interactive
)
Spacer(modifier = Modifier.width(8.dp)) // Space between checkbox and text
// Task text with appropriate color and decoration
Text(
text = task.taskName,
color = taskColor,
textDecoration = taskDecoration,
modifier = Modifier.weight(1f)
)
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79196833/struggling-with-task-completion-ui-in-android-app-task-list[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия