小编dip*_*dip的帖子

带有全屏工具栏和软键盘的Modal BottomSheetDialog

如何BottomSheetDialog(Fragment)使用ToolBar 创建一个切换到全屏的模态,如材料设计规范中所示

在此输入图像描述

可以通过添加a BottomSheetBehavior.BottomSheetCallback并根据slideOffset设置ToolBar的alpha来手动添加ToolBar.移动底板时,这有点像hacky但似乎有效.但是,当我的底部工作表包含EditText并显示键盘时,这不起作用.我尝试了两个版本:BottomSheetDialogFragment并手动将行为添加到新片段.

  • 有没有更简单的方法来实现这一目标?
  • 当显示键盘并且底部纸张占用整个空间时,我可以触发工具栏吗?

android android-softkeyboard android-toolbar bottom-sheet

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

Dagger Hilt 为不同的风格/构建类型提供替代模块

我尝试将 App 迁移到Dagger Hilt。在我的旧设置中,我为调试版本中的调试版本或不同的产品风格切换了一个模块。例如:

@Module
open class NetworkModule {

    @Provides
    @Singleton
    open fun provideHttpClient(): OkHttpClient {
        ...
    }
}

class DebugNetworkModule : NetworkModule() {

    override fun provideHttpClient(): OkHttpClient {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我在调试版本中交换了正确的模块:

val appComponent = DaggerAppComponent.builder().networkModule(DebugNetworkModule())
Run Code Online (Sandbox Code Playgroud)

由于 Hilt 管理着ApplicationComponent我看不到交换模块的可能性。

但是,当我查看生成的源代码(对我来说DaggerApp_HiltComponents_ApplicationC:)时,我看到 Hilt 确实为不同的模块生成了一个构建器(在 旁边未使用ApplicationContextModule)。

知道这不是最佳做法。NetworkModule为每个构建类型/产品风格提供不同的s会更干净。但这会导致大量重复的代码。

在测试中,我可以卸载模块并安装测试模块。但这在生产代码中似乎是不可能的。

还有其他方法可以实现我的目标吗?

android dagger dagger-hilt

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

SQLDelight关系

我想使用SQLDelight建模关系,尤其是一对多关系。

我有 2 个表:recipeingredient。为了简单起见,它们看起来像这样:

CREATE TABLE recipe (
  id INTEGER NOT NULL PRIMARY KEY,
  name TEXT NOT NULL
)

CREATE TABLE ingredient (
  recipe_id INTEGER NOT NULL,
  name TEXT NOT NULL,
  FOREIGN KEY (recipe_id) REFERENCES recipe(id) ON DELETE CASCADE
);
Run Code Online (Sandbox Code Playgroud)

所以我有一个食谱列表,每个食谱可以包含 0-n 种成分。

我有2个目标:

  • 写一个包含所有成分的食谱
  • 阅读包含所有成分的食谱

我很确定第一个只能手动完成,例如插入食谱,然后手动插入关联的成分。

对于后者,我尝试使用以下语句连接表:

selectWithIngredients:
SELECT *
FROM recipe
INNER JOIN ingredient ON recipe.id = ingredient.recipe_id
WHERE recipe.id=?;
Run Code Online (Sandbox Code Playgroud)

为此,SQLDelight 为我生成了一个 1:1 关系文件:

public data class SelectWithIngredients(
  public val …
Run Code Online (Sandbox Code Playgroud)

android relationship kotlin sqldelight

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

Jetpack Compose TextField 剪切滚动文本

我有一个TextField固定高度的。当用户输入较长的文本时,它会滚动。滚动时它将截断填充内的任何文本:

在此输入图像描述

基本上是这样的:

var text by remember { mutableStateOf("") }
TextField(
    value = text,
    onValueChange = { value -> text = value },
    modifier = modifier
        .fillMaxWidth()
        .height(100.dp),
    colors = TextFieldDefaults.textFieldColors(
        focusedIndicatorColor = Color.Transparent,
        unfocusedIndicatorColor = Color.Transparent,
        backgroundColor = Color.Transparent
    )
)
Run Code Online (Sandbox Code Playgroud)

可以直接TextField使用来调整/删除 a 的填充BasicTextField,例如参见此堆栈溢出问题

不过,我想保留填充,但在用户滚动时不剪切文本。一个简单的Text可组合项就有这种行为。

android kotlin android-jetpack-compose

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

使用 Google 语音服务查询支持的语言不适用于 Android 13

我使用以下操作查询语音服务支持的语言RecognizerIntent.ACTION_GET_LANGUAGE_DETAILS

val intent = Intent(RecognizerIntent.ACTION_GET_LANGUAGE_DETAILS)
packageManager.queryBroadcastReceivers(intent, 0).map { resolveInfo ->
    sendOrderedBroadcast(
        intent.apply {
            component = ComponentName(resolveInfo.activityInfo.applicationInfo.packageName, resolveInfo.activityInfo.name)
        },
        null,
        object : BroadcastReceiver() {
            override fun onReceive(context: Context?, intent: Intent?) {
                val extras = getResultExtras(true)
                val supportedLanguages = extras.getStringArrayList(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES)
                // supportedLanguages is empty on Android 13 for all services
            }
        },
        null, Activity.RESULT_OK, null, null
    )
}
Run Code Online (Sandbox Code Playgroud)

这在 Android 12 及更低版本上运行良好。但是,Android 13 上的列表为空。我正在使用 Google 语音服务/Google 应用程序。

经过一番挖掘后,似乎之前返回语言的广播接收器被简单地禁用了。来自Google App的反编译源:

values/bools.xml

<bool name="speech_services_enabled">true</bool>
Run Code Online (Sandbox Code Playgroud)

values-v33/bools.xml

<bool name="speech_services_enabled">false</bool>
Run Code Online (Sandbox Code Playgroud)

还有其他方法可以获取支持的语言列表吗?

编辑:我也尝试直接查询SpeechRecognizer: …

android google-apps kotlin android-speech-api

5
推荐指数
0
解决办法
501
查看次数