我的應用包含針對不同設備型別的 2 種不同布局。我希望執行不同的操作,例如第 1、第 2 和第 3 項導航到不同的螢屏,第 4 項顯示 a Toast,第 5 項啟動電子郵件撰寫器意圖等。有沒有辦法找出陣列的哪個索引是單擊并使這些單擊事件可重用,而不是兩次創建相同的單擊事件?
strings.xml 中的陣列
<string-array name="array_main">
<item>@string/breads</item>
<item>@string/cakes</item>
<item>@string/condiments</item>
<item>@string/desserts</item>
<item>@string/snacks</item>
<item>@string/contact us</item>
</string-array>
MainActivity.kt
class ActivityMain : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyAppTheme {
Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
HomeScreen(navController = rememberNavController())
}
}
}
}
@Composable
fun ComposeNavigation() {
val navController = rememberNavController()
NavHost(
navController = navController,
startDestination = "home_screen"
) {
composable("home_screen") {
HomeScreen(navController = navController)
}
composable("second_screen") {
SecondScreen(navController = navController)
}
composable("third_screen") {
ThirdScreen(navController = navController)
}
}
}
@Composable
fun HomeScreen(navController: NavController) {
val windowInfo = rememberWindowInfo()
if (windowInfo.screenWidthInfo is WindowInfo.WindowType.Compact) {
Scaffold(
topBar = {...},
content = {
MyLazyColumn(lazyItems = resources.getStringArray(R.array.array_main))
},
)
} else {
Scaffold(
topBar = {...},
content = {
MyLazyVerticalGrid(lazyItems = resources.getStringArray(R.array.array_main))
},
)
}
}
}
MyLazyColumn.kt
@Composable
fun MyLazyColumn(lazyItems: Array<String>) {
val listState = rememberLazyListState()
LazyColumn(
state = listState,
) {
items(lazyItems) { item ->
Row(modifier = Modifier
.fillMaxWidth()
.clickable {
}) {
Text(
text = item,
)
}
}
}
}
MyLazyVerticalGrid.kt
fun MyLazyVerticalGrid(lazyItems: Array<String>) {
val lazyGridState = rememberLazyGridState()
LazyVerticalGrid(
state = lazyGridState,
columns = GridCells.Fixed(2),
content = {
items(lazyItems.size) { index ->
OutlinedButton(
modifier = Modifier.padding(7.dp),
onClick = {/*TODO*/ }) {
Text(text = lazyItems[index]
)
}
}
}
)
}
uj5u.com熱心網友回復:
由于我們使用的是 Compose,因此我們可以利用 Kotlin。string-array我們可以創建一個包含所有選項的列舉類,而不是創建資源,如下所示:
enum class Choices(@StringRes val textResId: Int) {
Breads(R.string.breads),
Cakes(R.string.cakes),
Condiments(R.string.condiments),
Desserts(R.string.desserts),
Snacks(R.string.snacks),
ContactUs(R.string.contact_us),
}
然后,我們可以像這樣設定你的LazyColumn和LazyGrid:
@Composable
fun MyLazyColumn(
lazyItems : Array<Choice>,
onClickItem: (Choice) -> Unit
) {
//...
items(lazyItems) { choice ->
//...
Text(text = stringResource(choice.textResId))
Button(
//...
onClick = { onClickItem(choice) }
)
//...
}
//...
}
@Composable
fun MyLazyGrid(
lazyItems : Array<Choice>,
onClickItem: (Choice) -> Unit
) {
// ...
items(lazyItems) { choice ->
Text(text = stringResource(choice.textResId))
Button(
onClick = { onClickItem(choice) }
)
}
// ...
}
要重用ClickListener,我們可以創建一個 lambda 物件并重用它:
@Composable
fun HomeScreen(/* ... */) {
val listener: (Choice) -> Unit = { choice ->
when(choice) {
Breads -> {}
Cakes -> {}
Condiments -> {}
Desserts -> {}
Snacks -> {}
ContactUs -> {}
}
}
MyLazyGrid(
lazyItems = arrayOf(
/* Choice items you'd add to you list */
),
onClickItem = listener
)
MyLazyColumn(
lazyItems = arrayOf(
/* Choice items you'd add to you list */
),
onClickItem = listener
)
}
uj5u.com熱心網友回復:
只需將您的點擊代碼塊存盤為變數。
val firstItemClicker = { /* Add Actions Here */ }
val secondItemClicker = { /* and So on */ }
像這樣使用它
FirstItem(
Modifier.clickable { firstItemClicker() }
)
或者,
Button(
onclick = { firstItemClicker() }
){
Text("Click Recyler")
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/480747.html
標籤:安卓 科特林 安卓布局 安卓意图 android-jetpack-compose
上一篇:將IARWorkbench中的LiveWatch變數保存為LOG檔案
下一篇:如何定位最后一個彈性專案
