如何在Jetpack Compose中获取Activity配置的Label值?
Jetpack Compose 读取 Manifest 中配置的 Activity Label
问题场景
在AndroidManifest.xml声明Activity时,通常会通过android:label属性指定Activity的展示名称,配置示例:
<activity android:name="MyActivityClass" android:label="Activity Label" />
在Jetpack Compose开发中,很多人会尝试直接通过LocalContext.current调用Activity的getTitle()方法拿这个值,会发现找不到对应API,典型错误写法:
@Composable fun TopBar() { val context = LocalContext.current val title = context.getActivity().getTitle() // 错误:不存在该API TopAppBar( title = { Text(text = title, fontSize = 18.sp) }, backgroundColor = MaterialTheme.colors.primary, contentColor = Color.White ) }
正确实现
直接从当前Context持有的Activity组件信息中读取label即可,完整可运行代码:
@Composable fun TopBar() { val context = LocalContext.current val title = remember(context) { val activityInfo = (context as? ComponentActivity)?.componentInfo activityInfo?.loadLabel(context.packageManager)?.toString().orEmpty() } TopAppBar( title = { Text(text = title, fontSize = 18.sp) }, backgroundColor = MaterialTheme.colors.primary, contentColor = Color.White ) }
要点说明
- Compose中
LocalContext.current拿到的默认就是宿主ComponentActivity的上下文,强转后可直接获取componentInfo对象,对应Manifest中声明的Activity全量配置 - 调用
loadLabel()方法会自动兼容两种label配置场景:直接写硬编码字符串、或者引用@string/xxx资源,无需手动做资源解析 - 外层套
remember做值缓存,避免每次重组都重复执行解析逻辑 - 空安全判断可以兼容Compose预览、非Activity上下文等边界场景,避免空指针崩溃
如果需要在多个页面复用,可以抽成通用的Compose方法:
@Composable fun rememberActivityLabel(): String { val context = LocalContext.current return remember { val activityInfo = (context as? ComponentActivity)?.componentInfo activityInfo?.loadLabel(context.packageManager)?.toString().orEmpty() } }
使用时直接在Composable中调用val title = rememberActivityLabel()即可。
内容的提问来源于stack exchange,提问作者Elye
相关产品推荐
相关产品推荐

