android-jetpack 相关问题

Android Jetpack是Google的一套库,工具和架构指南,用于构建Android应用程序并提供通用的基础架构代码。

如何在Android Jetpack Compose中使用字符串资源?

让我有以下 strings.xml 资源文件: 我的游乐场

回答 0 投票 0

Media3 ExoPlayer 中视频文件的初始加载时间太长

我有一个本地 HTTP 服务器,我在其中托管 MP4 文件(大约 50MB)。我在我的应用程序中设置了以下可组合项: @可组合 私人有趣的VideoItem( 网址:字符串, 修饰语:修饰语=莫迪...

回答 1 投票 0

Jetpack Compose 中没有连锁反应

当我点击 MyBox() 时没有连锁反应我已将 MyTheme(){} 添加到主 @Composable 屏幕,但它不起作用。是不是少了什么? @可组合 私人 MyBox(onClickInvoked: () -> Uni...

回答 3 投票 0

Jetpack 在按下按钮后首次渲染后组成无限循环

我在尝试与我的朋友一起阅读和理解文档时尝试了一些不寻常的事情。我们在 compose 中编写了一段代码,例如: @可组合 有趣的我的组件(){ 变种

回答 1 投票 0

如何访问lazyColumn或lazyRow中项目的Key?

我正在使用 Jetpack Compose 创建一个 LazyColumn,如下所示。我的懒惰列表有两种不同的视图类型,对于列表中的每种食物,它显示食物名称(第一种类型)和一些食物

回答 1 投票 0

Android compose:Surface 只能有一个直接可测量的子元素

我是 Jetpack compose 的新手,我创建了一个如下所示的可组合项: 柱子( Modifier.clickable(onClick = onclick) .fillMaxWidth().背景(pastelGray) .填充(16....

回答 1 投票 0

我什么时候应该使用 Android Jetpack Compose 的 Surface 可组合项?

Jetpack Compose 中有一个可组合的 Surface,它代表材质表面。表面允许您设置背景颜色或边框等内容,但似乎您也可以做同样的事情...

回答 3 投票 0

如何将屏幕分成两个区域,同时在中间有一个表单?

我已经尝试实现以下设计几个小时了,但无法找出使用 Jetpack Compose 解决此问题的最佳方法,而且我找不到描述 Compo 的可靠文档...

回答 4 投票 0

popBackStack() 在 android NavController 中不起作用

我正在使用 android JetPack 导航在我的片段之间导航。这就是我的导航图的样子 我正在使用 android JetPack 导航在我的片段之间导航。这就是我的navigation graph的样子 <?xml version="1.0" encoding="utf-8"?><navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/registration_nav_graph" app:startDestination="@id/registrationStoreNameFragment"> <fragment android:id="@+id/registrationStoreNameFragment" android:name="com.minidukaan.android.feature.registration.view.RegistrationStoreNameFragment" android:label="fragment_registration_store_name" tools:layout="@layout/fragment_registration_store_name" > <action android:id="@+id/action_registrationStoreNameFragment_to_registrationStoreUrlFragment2" app:destination="@id/registrationStoreUrlFragment2" /> </fragment> <fragment android:id="@+id/registrationStoreUrlFragment2" android:name="com.minidukaan.android.feature.registration.view.RegistrationStoreUrlFragment" android:label="RegistrationStoreUrlFragment" > <action android:id="@+id/action_registrationStoreUrlFragment2_to_registrationLocationFragment" app:destination="@id/registrationLocationFragment" /> <argument android:name="store_name" app:argType="string" /> <argument android:name="store_slug" app:argType="string" /> </fragment> <fragment android:id="@+id/registrationLocationFragment" android:name="com.minidukaan.android.feature.registration.view.RegistrationLocationFragment" android:label="fragment_registration_location" tools:layout="@layout/fragment_registration_location" > <action android:id="@+id/action_registrationLocationFragment_to_registrationSuccessFragment" app:destination="@id/registrationSuccessFragment" /> <argument android:name="store_name" app:argType="string" /> <argument android:name="store_slug" app:argType="string" android:defaultValue=""/> </fragment> <fragment android:id="@+id/registrationSuccessFragment" android:name="com.minidukaan.android.feature.registration.view.RegistrationSuccessFragment" android:label="fragment_registration_success" tools:layout="@layout/fragment_registration_success" /> 从RegistrationStoreNameFragment我像这样导航到RegistrationStoreUrlFragment private lateinit var navController: NavController override fun init(savedInstanceState: Bundle?) { super.init(savedInstanceState) .... binding.lifecycleOwner = this navController = view?.let { Navigation.findNavController(it) }!! val action = RegistrationStoreNameFragmentDirections. actionRegistrationStoreNameFragmentToRegistrationStoreUrlFragment2(storeName, it.slug) navController.navigate(action) } 所以它可以完美导航,但是当我在 navController.popBackStack() 中执行 RegistrationStoreUrlFragment 时,它不会导航回来。任何帮助将不胜感激,因为我很长时间都陷入这个问题。 对于其他片段,popBackStack 工作正常,但不适用于上面提到的片段。 您想什么时候导航? 如果您想在任何自定义事件中导航回之前添加的片段, 您必须在 NavGraph 中的 Fragment 标签下定义 popUpTo 操作, <fragment android:id="@+id/registrationStoreUrlFragment2" android:name="com.minidukaan.android.feature.registration.view.RegistrationStoreUrlFragment" android:label="RegistrationStoreUrlFragment" > <action android:id="@+id/action_pop_back" app:destination="@id/registrationSuccessFragment" app:popUpTo="@+id/registrationSuccessFragment"/> </fragment> 并在导航中这样调用它, findNavController().navigate(R.id.action_pop_back) 当前片段要返回 homeFragment findNavController().popBackStack(R.id.homeFragment, true) 这对我来说工作得很好。也许会对你有帮助 对于我的情况,我遇到了同样的问题,我尝试了通过在 app:popUpTo 中设置 xml 给出的解决方案,但对我来说问题是后退按钮在这种情况下只能工作一次。 然后我用 app:popUpToSaveState 将其设置如下,现在来回工作正常: <navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/anonymous_navigation" app:startDestination="@id/startupFragment"> <fragment android:id="@+id/landingFragment" android:name="com.myApp.ui.landing.LandingFragment" android:label="fragment_landing" tools:layout="@layout/fragment_landing" > <action android:id="@+id/action_landingFragment_to_loginFragment" app:destination="@id/loginFragment" app:popUpToSaveState="@id/landingFragment" /> </fragment> </navigation> 然后在代码中,当按下后退时我会调用navigateUp: findNavController().navigateUp()

回答 3 投票 0

Jetpack Compose 中的动画重组(视图更改)

有没有一种方法可以在 Jetpack Compose @Composable 中自动动画组合变化?例如,如果在重组中删除了先前显示的小部件,淡出动画是否可以

回答 3 投票 0

类型“State<List<User>?>”没有方法“getValue(Nothing?, KProperty<*>)”,因此它不能充当委托

我正在尝试使用jetpack compose中的observeAsState从LiveData获取值,但我收到一个奇怪的错误 类型“State”没有方法“getValue(Nothing?, KProperty<*>)' 因此它

回答 14 投票 0

如何创建具有多种字体样式的文本?

我想要一个带有多种字体样式的文本。 示例(混合粗体和斜体的文本): 这是我的文字! 通常我可以这样做: 我想要一个带有多个 FontStyles 的文本。 示例(文本混合粗体和斜体): 这是我的文字! 通常我可以这样做: <string name="test"><![CDATA[This <b>is my</b> <i><text/i>]]></string> 如何在 Compose 中使用 Text 和 FontStyles 执行相同操作? 注释:我不想将文本拆分为 strings.xml 文件中的多个条目。 您可以使用withStyle()来应用样式。您通常需要 SpanStyle 或 ParagraphStyle。 下面的示例使用数据类集合,其中可能包括粗体、斜体或任何需要的内容。就您而言,您需要构建一个具有不同风格的集合。在下面的示例中,我仅使用粗体样式。 @Composable fun TextStyled() { Text( buildAnnotatedString { withStyle(style = ParagraphStyle(lineHeight = 32.sp)){ textData.forEach { sd -> if (sd.bold) { withStyle(style = SpanStyle( fontSize = 22.sp, fontWeight = FontWeight.Bold), ) { append(sd.text) } } else { withStyle(style = SpanStyle( fontSize = 22.sp, fontWeight = FontWeight(300) )) { append(sd.text) } } } } } ) } 另一个解决方案是使用正则表达式。下面的示例将 Text() 的所有子字符串 text 替换为 FontWeight.Bold。 @Composable fun TextStyled() { val text = "This is <b>my text</b> in bold, and this is <b>another text</b> in bold" val regex = "<b>(.*?)</b>".toRegex() val boldSubstrings = regex.findAll(text).map { it.groupValues[1] }.toList() val normalSubstrings = regex.split(text) Text( buildAnnotatedString { withStyle(style = SpanStyle(color = Color.DarkGray, fontSize = 16.sp)){ normalSubstrings.forEachIndexed { index, s -> withStyle(style = SpanStyle( fontSize = 16.sp, color = Color.DarkGray ) ){ append(s) } if (index < boldSubstrings.size) { withStyle(style = SpanStyle( fontSize = 16.sp, color = Color.DarkGray, fontWeight = FontWeight.Bold ) ){ append(boldSubstrings[index]) } } } } } ) } 您可以在官方 Jetpack Compose 文档中找到有关文本样式的更多信息。 使用注释字符串和样式: AnnotatedString.Builder() 用于创建 AnnotatedString.Builder 的实例,它允许我们构建 AnnotatedString。 在 withStyle 块内,我们对参数应用粗体红色字体样式。您可以根据自己的喜好自定义样式(字体大小、颜色等)。 @Composable fun StyledMessage(format: String, vararg args: Any) { val annotatedString = AnnotatedString.Builder().apply { var startIndex = 0 args.forEachIndexed { index, arg -> val placeholder = "%${index + 1}\$" val placeholderIndex = format.indexOf(placeholder, startIndex) val placeholderEndIndex = placeholderIndex + placeholder.length append(format.substring(startIndex, placeholderIndex)) withStyle(style = SpanStyle(fontWeight = FontWeight.Bold, color = Color.Red)) { append(arg.toString()) } startIndex = placeholderEndIndex } if (startIndex < format.length) { append(format.substring(startIndex)) } }.toAnnotatedString() Column( modifier = Modifier.padding(16.dp) ) { Text(text = annotatedString) } } @Preview @Composable fun StyledMessagePreview() { StyledMessage("Hello, %1$! You have %2$ new messages.", "Alice", 3) }

回答 2 投票 0

除了状态提升之外,我还可以与 Jetpack Compose 一起使用其他状态管理选项吗?

我正在学习 Jetpack compose,到目前为止,我发现将状态提升到可组合项的调用者以使可组合项成为无状态是可行的方法。我一直在我的 Com 中使用这种模式...

回答 1 投票 0

使用导航时,使用“collectAsLazyPagingItems”构建的 LazyColumn 的滚动位置会丢失

导航时惰性列的滚动位置丢失。 val pageItems = myPager?.collectAsLazyPagingItems() LazyColumn(状态 = RememberLazyListState(), 修饰符 = Modifier.padding(底部 =

回答 1 投票 0

将样式动态应用到 Jetpack Compose 中的 BasicTextField 时出现无限循环

我面临着 Jetpack Compose 的挑战。我的目标是根据用户的输入和当前的当前情况,动态地将粗体样式应用于 BasicTextField 中文本的特定部分...

回答 1 投票 0

通过切换变量维持数据类的配置更改

我有一个带有“检查”变量的数据类。该变量的目的是更改单击或不单击时显示的图标。 这工作正常,但如果我旋转屏幕或拆分,我就会遇到问题......

回答 1 投票 0

如何使用jetpack compose创建主屏幕或锁定屏幕小部件

我想使用jetpack compose实现主屏幕或锁屏小部件。 我做了一些研发,但没有找到与该主题相关的任何文档。 所以帮助我吧。 提前谢谢您

回答 2 投票 0

48dp 的矢量图标也有 64dp 的吗?

我有一个矢量图标,例如: 我有一个矢量图标,例如: <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="48dp" android:height="48dp" android:viewportWidth="48" android:viewportHeight="48"> <path android:pathData="....." android:fillColor="#ffffff" android:fillType="evenOdd"/> </vector> 什么有48dp。手机图标设计为 48dp x 48dp,但平板电脑图标设计为 64dp x 64dp。 如何在代码中将此矢量图标升级为 64dp x 64dp?我更喜欢 Jetpack Compose 解决方案.. 您可以像这样检查设备是移动设备还是平板电脑: 解决方案1:如果您只想保留1个资源并根据条件更改大小 val context = LocalContext.current val isTablet = isTablet(context) Icon( painterResource = painterResource(R.drawable.mobileIcon), modifier = Modifier.size(if(isTablet) 64.dp else 48.dp) ) 解决方案2:如果您想根据情况更改资源 val context = LocalContext.current val isTablet = isTablet(context) Icon( painterResource = if(isTablet) painterResource(R.drawable.tabletIcon) else painterResource(R.drawable.mobileIcon), modifier = Modifier.size(if(isTablet) 64.dp else 48.dp) ) 获得 isTablet() 功能所需的依赖项: com.google.android.gms:play-services-basement:18.2.0

回答 1 投票 0

Jetpack Compose MutableLiveData 不更新 UI 组件

我试图通过包含下载 ID 和进度值的数据对象列表一次显示多个下载进度条。该对象列表的值正在正确更新...

回答 4 投票 0

如何在关注 TVLazyRow 的同时始终关注第一项?

我正在尝试实现一个 TVLazyRow,当我们关注该行上方其他可组合项的行时,它必须始终首先关注第一个项目。目前,按下时,焦点...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.