项目档案

温度转换示例

我们的下一个例子是一个简单的计算器赢博体育程序,它将华氏温度转换为摄氏度。

在这个例子中,我们将要引入的主要新特性是TextFields的使用,它是允许用户在赢博体育程序中输入文本的组件。

这是我们的赢博体育程序的源代码:

导入androidx. composer . componentactivity导入androidx.activity. component . setcontent导入androidx.activity.enableEdgeToEdge导入androidx. composer . found.clickable导入androidx. composer . found.layout . arrangement导入androidx. composer . found.layout . column导入androidx. composer . found.layout . fillmaxsize导入androidx. composer . found.layout .padding导入androidx. composer .material3. scaffold导入androidx. composer .material3. text导入androidx. composer .runtime. composable导入androidx. composer .runtime. mutablestateof导入androidx. composer .runtime.remember导入androidx. composer .ui. alignment导入androidx.compose.ui.Modifier导入androidx. composer .ui.graphics. color导入androidx. composer .ui.platform. localsoftwarekeyboardcontroller导入androidx. composer .ui. tool.preview导入androidx. composer .ui.unit.dp导入androidx. composer .ui.unit.sp import edu.lawrences .temperature.ui. theme.temperaturetheme类MainActivity: ComponentActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState) enableEdgeToEdge() setContent {TemperatureTheme {Scaffold(modifier = modifier . fillmaxsize ()) {innerPadding -> TempCalculator(modifier .padding(innerPadding))}}}}} @Composable fun TempCalculator(modifier:Modifier = Modifier) {val fahrenheitTemp = remember {mutableStateOf("68")} val celsiusTemp = remember {mutableStateOf("20")} val orange = Color(0xFFFFA500) val keyboardController = LocalSoftwareKeyboardController。当前列(垂直排列=排列)。居中,horizontalAlignment =对齐。centerhorizontal, modifier = modifier. fillmaxsize ()) {TextField(value = fahrenheitTemp。value, onValueChange = {newValue: String ->华氏温度。value = newValue val t = newValue. todoubleornull () if(t == null)Value = “未知” else {val c = (t!!- 32.0)*5.0/9.0value = "%.2f".format(c)}}) Column(horizontalalign = align。centerhorizontal, modifier = modifier。{keyboardController?.hide()}) {Text("degrees Fahrenheit", fontSize = 24。sp, color = orange,modifier= modifier .padding(top=10.dp)) Text("is", fontSize = 24。sp, color =橙色,modifier= modifier .padding(bottom=10.dp)) Text(celsiusTemp.value) Text(“摄氏度”,fontSize = 24。sp, color = orange,modifier= modifier .padding(top=10.dp))}}} @Preview(showBackground = true) @Composable fun GreetingPreview() {TemperatureTheme {TempCalculator()}}

使用文本字段

要在Jetpack Compose中创建文本字段,我们使用TextField()组件。该组件的构造函数接受两个参数:在文本字段中显示的一些文本,以及在用户更改文本字段内容时调用的lambda表达式。lambda表达式接受一个参数,即字段的新文本。在本例中,我使用lambda表达式将用户输入的华氏温度转换为我们存储在第二个状态函数中的摄氏温度。由于第二个状态变量将其值显示在视图更下方的文本组件中,因此对第二个状态变量的更改将自动显示在视图中。

附加事件处理程序

当用户点击文本框时,赢博体育程序会弹出一个软件键盘,用户可以用它在文本框中输入文本。与这些键盘相关的一个问题是,我们还需要为用户提供一种方法,当他们完成与文本字段的交互时,让键盘再次消失。这个赢博体育程序展示了一种可能的策略。

如果您仔细查看上面的代码,您会发现我在文本字段后面放置了一个Column组件。该列作为赢博体育程序中其他用户界面元素的容器,它还为我们提供了一个附加特殊事件处理程序的机会,该事件处理程序将响赢博体育户在列中的任何位置的点击。我们通过使用传递给列的特殊类型的Modifier来附加这个特殊事件处理程序。该修饰符通过调用lambda表达式响应列中的任何位置的点击。lambda表达式中的代码告诉赢博体育程序的键盘控制器隐藏当前显示的任何键盘。