笨蛋开始学习 Android Studio 了!
- 软件设置代理
Jetbrains 的所有集成开发环境都要手动设置代理!具体位置在
设置 -> 外观与行为 -> 系统设置 -> HTTP 代理
选择手动配置代理!本地开全局魔法的话就用
主机 127.0.0.1
端口 (看魔法软件上到底是哪个!)
clash 的默认端口是 10808!
nekobox 的默认端口是 2080!
- 软件汉化
Jetbrains 的大部分集成开发环境的汉化包都是通用的!所以去插件市场找 IntelliJ Idea 的汉化插件然后下载,给 Android Studio 从磁盘安装就好了! 学习过程
1.搭建UI界面
使用Column
布局和Row
布局可以规定该布局下属的元素是垂直排列还是水平排列,通过verticalArrangement
与horizontalAlignment
可以调整他们在垂直方向与水平方向的对齐排列方式与内部元素占用父元素的位置与大小
每个UI界面搭建函数都应该接收modifier参数,写法是@Composable fun EditNumberField(modifier: Modifier = Modifier)
这让该函数可以接收modifier参数,modifier参数相当于CSS,决定该UI的样式,而如果没有传入modifier参数,它将使用默认modifier作为自己的modifier。
2.储存与改变界面内容
使用可组合函数构建界面时,可组合函数是无状态的,他们不会储存值(除非硬编码在里面)或改变已有的值,为此必须通过
remeber
才能将值储存到内存中
但是remeber
是个可组合函数,需要在里面通过mutableStateOf(value)
存入一个可观察对象(类似一个监听对象是否改变的事件监听),才可以储存变量到内存中;譬如我们要储存一个result
的值为1
var result by remember { mutableStateOf(1) }
当result改变时,界面上的内容也会改变
记得使用var
让该值可变!而不是val
3.创建输入框
@Composable fun EditNumberField(modifier: Modifier = Modifier){ var amountInput = mutableStateOf("0") TextField( value = amountInput, onValueChange = { amountInput = it}, modifier = Modifier ) }
通过上面的一段代码可以创建一个实时显示输入内容的输入框,输入框中的默认值为
value
在输入框内容被修改时便会调用onValueChange
中的内容,其中的关键字it
代表当前输入框内的value,但实际上这段代码并不会让输入框显示出输入的内容,而是会一直显示0。
这是因为onValueChange
修改了可观察对象的数据,触发了数据修改的监听事件,让界面重新执行了EditNumberField
函数,并在函数的第一行执行了var amountInput = mutableStateOf("0")
导致输入框内的值永远为0
解决方案如下@Composable fun EditNumberField(modifier: Modifier = Modifier){ var amountInput by remember { mutableStateOf("") } TextField( value = amountInput, onValueChange = { amountInput = it}, modifier = Modifier ) }
在加入
remeber
时,重绘代码会先在内存中寻找已储存的值,这样就可以显示出输入的内容了,因为onValueChange
先触发,输入框中的数据保存到了amountInput
变量中,并且该变量值会被储存在内存中,并且是个可观察对象,由于可观察对象被修改触发EditNumberField
函数的再次执行,但在这次重绘时amountInput
的值将会从内存中找,而不是被硬编码赋值为0