刷新屏幕

问题描述 投票:0回答:1

我写了我的第一个应用程序。它显示简单的屏幕,并添加完成。如果给定的答案是正确的,我想刷新屏幕以显示新的计算。 目前旧的计算仍然保留,新的计算插入到顶部。 我想要的屏幕: 在此输入图片描述 在给出几个答案后我在屏幕上看到的内容: 在此输入图片描述

这是我的代码:


package com.example.calcul

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.border
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.TextField
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.remember
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.example.calcul.ui.theme.CalculTheme
import kotlin.random.Random


class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()

        setContent {
            CalculTheme {
                 MainContent()
                }
            }
        }
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MainContent() {
    Scaffold(
        topBar = {
            TopAppBar(
                colors = TopAppBarDefaults.topAppBarColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
                    titleContentColor = MaterialTheme.colorScheme.primary,
                ),
                title = {
                    Text("Addition")
                }
            )
        },
    ) { innerPadding ->
        Column(
            modifier = Modifier
                .fillMaxHeight()
                .fillMaxWidth()
                .border(2.dp, color = Color.Red)
                // For text to be displayed under the bar
                .padding(innerPadding)
        ) {
            //Add()
            InitializeNumbers()
        }
    }
}

@Composable
fun Add(fist: String, second: String) {

    var haveToReset by remember {
        mutableStateOf(false)
    }
    if (haveToReset) {
        InitializeNumbers()
    }

    val focusRequester = remember { FocusRequester() }

    var fist_number by remember { mutableStateOf(fist) }
    var second_number by remember { mutableStateOf(second) }
    var resultInput by remember { mutableStateOf("") }

    var result by remember { mutableIntStateOf(0) }
    result = fist_number.toInt() + second_number.toInt()

    val maxChar: Int = 2

    Spacer(modifier = Modifier.height(50.dp))
    Text(
        text = "$fist_number + $second_number = ",
        fontSize = 50.sp
    )

    TextField(
        value = resultInput,
        singleLine = true,
        // https://stackoverflow.com/questions/67136058/textfield-maxlength-android-jetpack-compose
        onValueChange = { if (it.length <= maxChar) resultInput = it },
        keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
        keyboardActions = KeyboardActions(
            
            onDone = {
                if (resultInput.toInt() == result) {
                    println("OK")
                    haveToReset = !haveToReset
                }
            }
        ),
        modifier = Modifier.focusRequester(focusRequester)
    )
    LaunchedEffect(Unit) {
        focusRequester.requestFocus()
}
    }

@Composable
fun InitializeNumbers() {
    var fist = Random.nextInt(11).toString()
    var second = Random.nextInt(11).toString()
    Add(fist, second)
}

@Preview(showBackground = true)
@Composable
fun AdditionPreview() {
    CalculTheme {
        MainContent()
    }
}

谢谢你的帮助

kotlin android-jetpack-compose
1个回答
0
投票

您需要调整应用程序中处理计算状态的方式。具体来说,需要进行的关键更改是:

将数字和结果的状态管理移至更高的可组合项,以适当地保留和更新它。 使用 Add 可组合项的单个实例,并在用户提供正确答案时刷新其状态。 以下是实施这些更改的方法:


class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            CalculTheme {
                MainContent()
            }
        }
    }
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MainContent() {
    var firstNumber by remember { mutableStateOf(Random.nextInt(11)) }
    var secondNumber by remember { mutableStateOf(Random.nextInt(11)) }

    Scaffold(
        topBar = {
            TopAppBar(
                colors = TopAppBarDefaults.topAppBarColors(
                    containerColor = MaterialTheme.colorScheme.primaryContainer,
                    titleContentColor = MaterialTheme.colorScheme.primary,
                ),
                title = {
                    Text("Addition")
                }
            )
        },
    ) { innerPadding ->
        Column(
            modifier = Modifier
                .fillMaxHeight()
                .fillMaxWidth()
                .border(2.dp, color = Color.Red)
                // For text to be displayed under the bar
                .padding(innerPadding)
        ) {
            //Add()
            Add(firstNumber, secondNumber) { newFirst, newSecond ->
                firstNumber = newFirst
                secondNumber = newSecond
            }
        }
    }
}

@Composable
fun Add(fist: Int, second: Int, onReset: (Int, Int) -> Unit) {
    val focusRequester = remember { FocusRequester() }

    var resultInput by remember { mutableStateOf("") }
    val result = fist + second

    Spacer(modifier = Modifier.height(50.dp))
    Text(
        text = "$fist + $second = ",
        fontSize = 50.sp
    )

    TextField(
        value = resultInput,
        singleLine = true,
        onValueChange = { resultInput = it },
        keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
        keyboardActions = KeyboardActions(
            onDone = {
                if (resultInput.toIntOrNull() == result) {
                    // If the answer is correct, generate new numbers
                    onReset(Random.nextInt(11), Random.nextInt(11))
                    resultInput = "" // Reset input
                }
            }
        ),
        modifier = Modifier.focusRequester(focusRequester)
    )

    LaunchedEffect(Unit) {
        focusRequester.requestFocus()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.