我在 macOS Monterey 中使用GPG Suite,以保存 GPG 密钥的密码,以便我可以进行经过验证的 git 提交。
问题: 目前,每次我每天第一次进行验证提交(git commit -S -m“提交消息”)时,系统都会提示我输入 GPG 密钥的密码。
愿望: 理想情况下,我希望只能输入该密码一次,并且在余生中不再输入。
改进但不是解决方案: 我遵循了本指南,并设法让密码被记住一段时间。但是,您可以设置的最大时间仅为 99999 秒。
问题:
在我的 Android 应用程序中,我使用 Jetpack Compose 作为 UI。
在屏幕中,我使用从 URL 下载的 Lottie 文件来渲染图像。Lottie 图像文件的渲染如下:
@Composable
private fun Image(assetUrl: String) {
val composition by rememberLottieComposition(LottieCompositionSpec.Url(assetUrl))
val progress by animateLottieCompositionAsState(composition, iterations = LottieConstants.IterateForever)
LottieAnimation(
composition = composition,
progress = { progress }
)
}
Run Code Online (Sandbox Code Playgroud)
我想提供一个预览可组合方法,该方法也将呈现上述Image可组合项。理想情况下,我希望能够做这样的事情:
@Preview
@Composable
private fun ScreenPreview(){
Theme {
Surface {
Screen(assetUrl = /* Some URL */)
}
}
}
Run Code Online (Sandbox Code Playgroud)
例如,屏幕将是一些包含可组合项的可Image组合项:
@Composable
fun Screen(assetUrl: String){
Image(
assetUrl = assetUrl
)
}
Run Code Online (Sandbox Code Playgroud)
问题:
android kotlin android-jetpack android-jetpack-compose composable
所需功能:
我有一个活动,它有一个从后端接收到的值,该值指示使用两种布局之一。我们将此值称为layoutType,并假设为简单起见,在下面的示例代码中,我们不关心如何分配它。因此,我有两个布局 xml 文件,我们称它们为layout1.xml和layout2.xml。
实现: 我想使用View Binding。我创建了一个ViewBinding类型的变量,并尝试为其分配Layout1Binding或Layout2Binding。这个逻辑的伪代码总结如下:
private ViewBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(layoutType == 1){
binding = Layout1Binding.inflate(getLayoutInflater());
} else {
binding = Layout2Binding.inflate(getLayoutInflater());
}
setContentView(binding.getRoot());
}
Run Code Online (Sandbox Code Playgroud)
结果:当然,这不起作用,变量绑定似乎没有可以引用的内部子级。另外,当然如果我将变量的类型转换为Layout1Binding并且layoutType等于1,那么我就可以正确使用它。如果我使用Layout2Binding并且layoutType不等于 1,情况也是如此。所有这些都是有意义的,因为 ViewBinding 只是由生成的类Layout1Binding和Layout2Binding实现的接口。
问题:如何仅使用一个可以分配给两个不同生成类的绑定变量来实现上述所需的行为?还有其他替代方法吗?
我有一个带有 Fragment 的 Android Activity,让我们将其命名为MyFragment。
在 MyFragment 的onCreate() 中,我的 ViewModel 是这样的:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myViewModel = new ViewModelProvider(requireActivity()).get(MyViewModel.class);
}
Run Code Online (Sandbox Code Playgroud)
问题:
有时,当我将应用程序置于后台并导航到其他应用程序时,当我尝试打开此应用程序并将其带回前台时,应用程序会因以下错误而崩溃:
Caused by: java.lang.RuntimeException: Cannot create an instance of class com.example.MyViewModel
...
at com.example.MyFragment.onCreate(MyFragment.java:64)
Run Code Online (Sandbox Code Playgroud)
其中第 64 行是这个:
myViewModel = new ViewModelProvider(requireActivity()).get(MyViewModel.class);
Run Code Online (Sandbox Code Playgroud)
在查看了ViewModel 的官方文档后,我在代码片段中注意到,在所有 Fragment 中,ViewModel 是在onViewCreated()而不是onCreate() 中获得的。我将该更改应用于我的代码,并且我的应用程序不再因上述堆栈跟踪而崩溃。
问题:
在 Fragment 的onCreate() 中获取 ViewModel 是否有任何特殊原因可能导致应用程序崩溃,如果是,那么为什么在onViewCreated()上获取 ViewModel似乎可以解决此问题?
我们应该总是在onViewCreated()的 Fragment 中获取 ViewModel而不是onCreate() …