小编Mat*_*ert的帖子

如何显示使用 Jetpack Compose 创建的通用对话框?

当我开始使用 Compose 而不是 xml 创建所有新的 UI 组件时,我不确定如何处理在 Compose 中创建的对话框。

在 Compose之外使用对话框只需要对话框的上下文:

val builder = AlertDialog.Builder(context as Activity, R.style.PermissionInfoDialog)
[...]
builder.show()
Run Code Online (Sandbox Code Playgroud)

只要您有上下文,这就可以让您从“任何地方”触发对话框(是的,我意识到这可能会被滥用),但据我所知,对于撰写,我需要一个“可组合视图”来添加自定义撰写对话框?当您有一个可以显示特定对话框的特定片段时,这是可以管理的,但如果您想要可以重复使用的更通用的片段,例如:

  • 处理一般错误消息并向用户显示错误(来自“所有视图/片段/活动”)
  • 在 UI 的多个部分请求权限
  • ETC。

那么这会变得更加混乱。

在我的特定场景中,我有许多不同的片段需要请求权限的能力。请求权限的能力(这要求我们向用户解释为什么需要它)以自定义对话框开头。这个抽象片段包含这个逻辑,但是抽象片段不知道添加我的 Compose 对话框所需的(?)单个 ComposeView 或 xml(因为这个应用程序是新旧内容的混合体)。当然,我可以有一个函数,让抽象片段请求“在某个地方显示对话框”,并让每个片段提供一个 ComposeView,但这对我来说感觉不自然且被迫。

关于如何解决这个问题,我是否缺少一些东西和/或一些“常见做法”?我想我正在寻找与旧解决方案类似(逻辑上)的东西,即简单地引用上下文(或类似的)来显示对话框。

android android-jetpack-compose

6
推荐指数
1
解决办法
1987
查看次数

处理Fabric / Crashlytics中的错误分组

我有一个使用Fabric / crashlytics的项目。为了能够检测生产中的所有运行时错误,我想使用以下命令向Crashlytics发送(非致命)异常:

Crashlytics.logException(new RuntimeException("some identifiable error message");
Run Code Online (Sandbox Code Playgroud)

我想将此逻辑添加到通过gradle作为单独的“实用程序模块”加载的项目中现有的Log-class中。由于此模块不包含对Crashlytics的引用(而且我似乎找不到从主模块转发此引用的好方法),因此我通过引入一个接口(通过主应用程序实现)解决了该问题:

if (!BuildConfig.APP_BUILD_VERSION.equals("local")) {
        UtilitiesConfig.setExternalLogger(new Logger.ExternalLogger() {
            @Override
            public void reportError(String tag, String message, Throwable throwable) {
                Crashlytics.logException(new RuntimeException(TextUtils.isEmpty(tag) ? message : tag + ": " + message));
            }
        });
    }
Run Code Online (Sandbox Code Playgroud)

这样做很好,唯一的问题是,Fabric中的所有报告都被分组为一个类似的例外,因为堆栈跟踪的顶部行是相似的(即接口和应用程序)。例如:

Non-fatal Exception: java.lang.RuntimeException: c: onNetworkError, type: CANT_ACCESS_SERVER
   at my.package.Application$3.reportError(Application.java:234)
   at my.package.utilities.Logger.e(Logger.java:34)
   at my.package.utilities.net.CallbackCallable.onNetworkError(CallbackCallable.java:76)
   at my.package.utilities.net.MsgCallable.onNetworkError(MsgCallable.java:250)
   at my.package.utilities.net.CancellableCallable.call(CancellableCallable.java:80)
   at java.util.concurrent.FutureTask.run(FutureTask.java:237)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
   at java.lang.Thread.run(Thread.java:776)
Run Code Online (Sandbox Code Playgroud)

...和这个:

Non-fatal Exception: java.lang.RuntimeException: u: Cannot update
   at my.package.Application$3.reportError(Application.java:234)
   at my.package.utilities.Logger.e(Logger.java:43)
   at my.package.NTPManager$SyncTimeAsyncTask.doInBackground(NTPManager.java:150)
   at my.package.NTPManager$SyncTimeAsyncTask.doInBackground(NTPManager.java:133) …
Run Code Online (Sandbox Code Playgroud)

error-handling crashlytics crashlytics-android

5
推荐指数
1
解决办法
254
查看次数

Android 导航组件 - 从“任何地方”/基本片段导航?

我正在开发一个应用程序,它有一个古怪的噱头,可以在设备旋转时打开特定的片段。在实现 android 的导航组件之前,所需要的只是对当前活动的引用,并且可以在特定时刻向用户显示的任何内容之上执行手动片段事务。

但是在转到导航组件之后,我发现很难实现像上面的示例或(例如)如何从基本片段类显示简单对话框的通用内容。

有没有一种行之有效的方法来编写这种逻辑?

“SpecificFragment.kt”扩展“BaseFragment.kt”

BaseFragment.kt 可以承载所有通用逻辑来启动片段。通用片段逻辑仍然存在于 BaseFragment 中,但 BaseFragment(一个抽象类)不在导航图中(也不应该是(?)。因此,我不能从任何片段调用“BaseFragmentDirections.actionXXXX()”。

这个应该怎么写?

android android-jetpack-navigation

1
推荐指数
1
解决办法
486
查看次数