如何BottomSheetDialog(Fragment)使用ToolBar 创建一个切换到全屏的模态,如材料设计规范中所示?
我可以通过添加a BottomSheetBehavior.BottomSheetCallback并根据slideOffset设置ToolBar的alpha来手动添加ToolBar.移动底板时,这有点像hacky但似乎有效.但是,当我的底部工作表包含EditText并显示键盘时,这不起作用.我尝试了两个版本:BottomSheetDialogFragment并手动将行为添加到新片段.
我尝试将 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会更干净。但这会导致大量重复的代码。
在测试中,我可以卸载模块并安装测试模块。但这在生产代码中似乎是不可能的。
还有其他方法可以实现我的目标吗?
我想使用SQLDelight建模关系,尤其是一对多关系。
我有 2 个表:recipe和ingredient。为了简单起见,它们看起来像这样:
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) 我有一个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可组合项就有这种行为。
我使用以下操作查询语音服务支持的语言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 ×5
kotlin ×3
bottom-sheet ×1
dagger ×1
dagger-hilt ×1
google-apps ×1
relationship ×1
sqldelight ×1