所以我有一个场景,其中我有 5 个带有底部导航的片段。
1. 主页 2. 收件箱 3. 搜索 4. 通知 5. 个人资料
因此,我有另一个名为 (BarcodeDetail) 的片段,我从 Home Fragment 导航到该片段。
(首页 -> 条码详情)
现在从 BarcodeDetail 导航到 Search Fragment
(条码详细信息 -> 搜索)
但现在如果我从 BottomNavigationView 选择 Home Fragment 它不会转到 Home Fragment。
它不会选择与搜索片段相同的当前片段。
(日志打印Search Fragment的名称)
navController.addOnDestinationChangedListener((controller, destination, bundle) -> {
Timber.d("Destination -> %s", destination.getDisplayName());
});
Run Code Online (Sandbox Code Playgroud)
private void setupBottomNavigation() {
NavHostFragment navHostFragment = (NavHostFragment)
getSupportFragmentManager().findFragmentById
(R.id.fragment_container_view);
if (navHostFragment != null) {
navController = navHostFragment
.getNavController();
NavigationUI.setupWithNavController(
binding.bottomNavigation, navController);
initDestinationListener();
}
}
Run Code Online (Sandbox Code Playgroud)
<?xml version="1.0" encoding="utf-8"?>
<menu …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现 Camera X 应用程序。我现在面临的问题是我无法弄清楚如何使用以下命令将下面的图像保存到特定文件夹ImageCapture.OutputFileOptions.Builder
我当前的代码如下。我需要采用其他方式吗?或者我也可以这样做?
private void capturePhoto() {
showProgress(true);
long currentTime = System.currentTimeMillis();
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, makeImageName(currentTime));
if (Build.VERSION.SDK_INT >= 29) {
contentValues.put(MediaStore.Images.Media.DATE_TAKEN, currentTime);
contentValues.put(MediaStore.Images.Media.RELATIVE_PATH,
Environment.DIRECTORY_PICTURES + "/" + FOLDER_IMAGES);
} else {
// Todo ( Something equivalent to RELATIVE_PATH)
}
ImageCapture.OutputFileOptions options = new ImageCapture.OutputFileOptions.Builder(
getContentResolver(), MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues).build();
imageCapture.takePicture(options,
ContextCompat.getMainExecutor(this),
new ImageCapture.OnImageSavedCallback() {
@Override
public void onImageSaved(@NonNull ImageCapture.OutputFileResults results) {
ToastUtility.successToast(getApplicationContext(),
"Photo Capture Successfully");
showProgress(false);
}
@Override
public void onError(@NonNull ImageCaptureException exception) …Run Code Online (Sandbox Code Playgroud) 使用 SavedStateHandle 发送回结果不适用于 ViewModel 中注入的 SavedStateHandle。
使用navController.currentBackStackEntry?.savedStateHandle?它可以得到结果!
fun CreatePostScreen(
navController: NavController,
coroutineScope: CoroutineScope,
snackbarState: SnackbarHostState,
viewModel: CreatePostViewModel = hiltViewModel(),
) {
LaunchedEffect(key1 = Unit) {
navController.currentBackStackEntry?.savedStateHandle?.getStateFlow(
"result", ""
)?.collect { result ->
Timber.d("Result -> $result")
}
}
}
Run Code Online (Sandbox Code Playgroud)
在 ViewModel 中使用saveStateHandleHilt 注入不会得到结果!
@HiltViewModel
class CreatePostViewModel @Inject constructor(
private val savedStateHandle: SavedStateHandle,
) : ViewModel() {
init {
viewModelScope.launch {
savedStateHandle.getStateFlow("result", "").collect {
Timber.d("Result -> $it")
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我将结果发送回前一屏幕的方式!
navController.previousBackStackEntry?.savedStateHandle?.set("result", "this is result")
Run Code Online (Sandbox Code Playgroud) android android-jetpack-navigation android-jetpack-compose viewmodel-savedstate dagger-hilt