我正在通过Android开发人员进行工作 online tutorial for 1st Android apps.
我有C编程背景,但面向对象的经验非常有限.
当我使用"修饰符"调用一个方法时,我正在试图理清发生了什么.VS"修饰语".我假设小写版本调用传递给它的对象上的方法,而大写版本不知何故是作为参数调用它的子对象的本地新对象.小写版本似乎会影响先前应用于该"父对象"的方法.这里有一个两者的例子,有观察到的行为.这两个示例之间的唯一区别是在第一个Text()调用中的"Modify"调用中的"m"的大小写.
第一个例子是所需的行为.在第一个"Text"调用中,我使用了"Modify"(大写).This preserves the centered vertical arrangement of the parent column.("One象限"函数被调用4次,如下图所示为预览面板)
@Composable
fun OneQuadrant(title: String, info: String, bColor: Color, modifier: Modifier)
{
Column (
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center,
modifier = modifier
.fillMaxHeight()
.background(bColor)
.padding(16.dp)
)
{
Text(
text = title,
fontWeight = Bold,
modifier = Modifier.padding(bottom=16.dp)
)
Text(
text = info,
textAlign = TextAlign.Justify,
)
}
}
第二个例子是不受欢迎的行为.第一个"Text"调用使用"Modify"(小写).This evidently overrides the centered vertical arrangement in the parent column.
@Composable
fun OneQuadrant(title: String, info: String, bColor: Color, modifier: Modifier)
{
Column (
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center,
modifier = modifier
.fillMaxHeight()
.background(bColor)
.padding(16.dp)
)
{
Text(
text = title,
fontWeight = Bold,
modifier = modifier.padding(bottom=16.dp)
)
Text(
text = info,
textAlign = TextAlign.Justify,
)
}
}
问题1:在第二个例子中,即使小写版本作用于父级,为什么会取消居中的垂直排列?我看到底部填充和居中不一致,很可能最后一次调用占上风.但是,该列还需要在Arrangement.Center语句之后进行填充,这可以正常工作.
Q2:如果是映射回父级,为什么"Column"中的调用不也映射回100 Parent,因为它是作为参数传递的?
问题3:什么是正确的心理模型,才能理解正在发生的事情?我想我在某种程度上被底层的对象搞糊涂了.可组合函数的名称暗示对象,但它们实际上是作用于其他对象的函数(S)……是真的吗?
我确实读了Kotlin 的《伴随物》,但这并没有真正起到什么作用.我猜这在某种程度上与Kotlin中的按引用传递行为有关,但我无法理解.你能给我解释一下,或者让我参考一个明确的参考资料吗?谢谢!
如果有用,下面是调用OneQuadant 4次的函数.
fun DisplayQuadrants(modifier: Modifier = Modifier) {
Column (modifier.fillMaxWidth()) {
Row (modifier.weight(1f)){
OneQuadrant(
title = stringResource(R.string.text_composable),
info = stringResource(R.string.displays_text),
bColor = Color(0xFFEADDFF),
modifier = modifier.weight(1f)
)
OneQuadrant(
title = stringResource(R.string.image_composable),
info = stringResource(R.string.creates_composable),
bColor = Color(0xFFD0BCFF),
modifier = modifier.weight(1f)
)
}
Row (modifier.weight(1f)){
OneQuadrant (
title = stringResource(R.string.row_composable),
info = stringResource(R.string.a_layout),
bColor = Color(0xFFD0BCFF),
modifier = modifier.weight(1f)
)
OneQuadrant(
title = stringResource(R.string.column_composable),
info = stringResource(R.string.vertical),
bColor = Color(0xFFF6EDFF),
modifier = modifier.weight(1f)
)
}
}
}
此DisplayQuadrants在MainActivity中的调用如下:
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
QuadrantsTheme {
// A surface container using the 'background' color from the theme
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
DisplayQuadrants(modifier = Modifier)
}
}
}
}
}