标签: kotlin

我可以在我的 Android 片段中消除视图模型和视图绑定样板代码吗?

我发现自己为我创建的每个新片段编写样板代码。这包括设置视图模型和视图绑定,这是我的代码的 2 个不同部分,它们不相互依赖,因此其中之一的解决方案仍然很棒。

片段代码示例:

class MyFragment : Fragment() {

    // View binding
    private var _binding: FragmentMyBinding? = null

    // View model
    private lateinit var model : MyViewModel

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Model init
        model = ViewModelProvider(this).get(MyViewModel::class.java)

        //binding init
        _binding = FragmentMyBinding.inflate(inflater, container, false)

        return _binding!!.root
    }

}

class MyViewModel : ViewModel()
Run Code Online (Sandbox Code Playgroud)

android boilerplate kotlin android-viewmodel android-viewbinding

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

将 android:fontFamily 传递给 Android 中的自定义视图

你如何在res/font文件夹内传递一个字体系列,例如@font/roboto_medium,作为一个 XML 格式的 Android 自定义视图的属性,然后在自定义视图中将它读入一个Typeface对象?这是对文本进行自定义图形渲染所必需的。

例如:

<MyCustomView android:fontFamily="@font/roboto_medium"/>
Run Code Online (Sandbox Code Playgroud)

然后在 MyCustomView.kt 中:

override fun onCreateView(...) {

  // parse android:fontFamily attribute into Typeface object
  val typeface: Typeface = ???  

}
Run Code Online (Sandbox Code Playgroud)

Typeface似乎没有任何功能支持这一点。其中一个接受assets文件夹内的自定义字体,另一个接受直接嵌入在 Java/Kotlin 代码中的资源字体整数,例如R.font.roboto_medium.

android android-layout kotlin

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

以编程方式获取设备的 EMUI 版本

在我的应用程序执行过程中,我如何获得 EMUI 版本?有什么系统方法可以获取EMUI版本吗?

android kotlin huawei-mobile-services

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

Ktor 客户端身份验证功能不发送授权标头

我试图在 Kotlin/MPP(多平台)项目和 JVM 目标功能中使用ktor 客户端基本身份验证似乎没有效果。

下面是一个重现的例子:

import io.ktor.client.HttpClient
import io.ktor.client.features.ResponseException
import io.ktor.client.features.auth.Auth
import io.ktor.client.features.auth.providers.basic
import io.ktor.client.features.json.JsonFeature
import io.ktor.client.features.json.serializer.KotlinxSerializer
import io.ktor.client.features.logging.DEFAULT
import io.ktor.client.features.logging.LogLevel
import io.ktor.client.features.logging.Logger
import io.ktor.client.features.logging.Logging
import io.ktor.client.request.get
import io.ktor.client.request.header
import kotlinx.coroutines.runBlocking
import java.util.*

fun main() = runBlocking {
    val client = HttpClient {
        install(Logging) {
            logger = Logger.DEFAULT
            level = LogLevel.HEADERS
        }
        install(JsonFeature) {
            serializer = KotlinxSerializer()
        }
        install(Auth) {
            basic {
                username = "user"
                password = "pass"
            }
        }
    }
    val url = "https://en.wikipedia.org/wiki/Main_Page" …
Run Code Online (Sandbox Code Playgroud)

kotlin ktor kotlin-multiplatform ktor-client

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

androidx.navigation 库更新到 2.2.2 版本发布构建问题

我有 androidx.navigation 上次更新的问题

我注意到,如果构建是RELEASE ,则在新更新(2.2.2) 后崩溃,错误如下

Caused by: android.view.InflateException: Binary XML file line #12 in 
com.somedomain.android:layout/activity_main: Binary XML file line #12 in 
com.somedomain.android:layout/activity_main: Error inflating class 
androidx.fragment.app.FragmentContainerView


Caused by: android.view.InflateException: Binary XML file line #12 in 
com.somedomain.android:layout/activity_main: Error inflating class 
androidx.fragment.app.FragmentContainerView

androidx.fragment.app.Fragment$e: Unable to instantiate fragment 
androidx.navigation.fragment.NavHostFragment: make sure class name exists
Run Code Online (Sandbox Code Playgroud)

我在用:

ext.versions = [
   ...
   nav_version        : '2.2.2',
]

ext.libs = [
   ...
   nav_fragment       : "androidx.navigation:navigation-fragment-ktx:$versions.nav_version",
   nav_ui             : "androidx.navigation:navigation-ui-ktx:$versions.nav_version",
]
Run Code Online (Sandbox Code Playgroud)

在应用程序gradle

 ...
    buildTypes {
        debug …
Run Code Online (Sandbox Code Playgroud)

android android-fragments kotlin android-navigation android-architecture-navigation

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

带有 Agora Flutter 的视频通话接受屏幕

我正在尝试使用Agora构建一个视频通话应用程序,我需要在用户呼叫时显示像 WhatsApp 这样的接受屏幕,如果退出应用程序,我需要在用户呼叫时显示呼叫屏幕,我尝试了很多东西,但没有任何效果,我试图做我颤抖,但没有太多关于这方面的信息,请帮助我

android kotlin flutter flutter-dependencies agora.io

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

Android Studio MediaStore Storage 无法访问文件夹

尝试下载并保存文件时,会引发错误

Primary directory file not allowed for content://media/external/downloads;
allowed directories are [Download]
Run Code Online (Sandbox Code Playgroud)

我该如何修复它,也许没有许可?

val multipartBuilder = MultipartBody.Builder().setType(MultipartBody.FORM)

                    multipartBuilder.addFormDataPart("oid", orderId)

                    val client = OkHttpClient.Builder()
                        .connectTimeout(120, TimeUnit.SECONDS)
                        .writeTimeout(120, TimeUnit.SECONDS)
                        .readTimeout(120, TimeUnit.SECONDS)
                        .build()

                    val request = Request.Builder()
                        .url(Api.API_URL + "order/shopOrderPrintAgreement")
                        .addHeader("Authorization", "Bearer ${Api.token}")
                        .post(multipartBuilder.build())
                        .build()

                    val response = client.newCall(request).execute()

                    /**
                     *TODO ???????? ??? android 10
                     */
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                        val resolver = context!!.contentResolver
                        val contentValues = ContentValues().apply {
                            put(MediaStore.DownloadColumns.DISPLAY_NAME, "agreement_$orderId")
                            put(MediaStore.DownloadColumns.MIME_TYPE, "application/pdf")
                            put(MediaStore.DownloadColumns.RELATIVE_PATH, "file/Peshkariki")
                        }
                        // MediaStore.Images.Media.EXTERNAL_CONTENT_URI
                        val uri = resolver.insert( …
Run Code Online (Sandbox Code Playgroud)

android kotlin

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

Kotlin Collection 中`component1` 到`component5` 的用途是什么?

在科特林文件https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/component1.htmlcomponent1component5。我有点迷茫它们的用例是什么?

我认为我们基本上可以mylist.get[0]mylist.component1. 它更短,更具扩展性。拥有这样的东西似乎是多余的component1。我错过了任何细节吗?

collections kotlin

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

Kotlin 看似递归的编译模板类型

在工作中进行代码审查并遇到了我以前从未见过的模板类型的使用。乍一看,代码似乎不应该编译,因为定义似乎是递归的。我将其归结为最简单的可验证示例:

interface Bar<T>
interface Foo<T: Bar<T>> // Surely this is recursive?
Run Code Online (Sandbox Code Playgroud)

我对模板类型如何工作的理解是:

interface Foo<T>-一个FooT,没有任何限制

interface Foo<T : Bar>- a Fooof T,其中T被限制为 aBar

假设我上面说的是真的,那么这对我来说没有意义:

interface Bar<T>- a Barof T, 没有约束T

interface Foo<T: Bar<T>>- a Fooof T,其中T被限制为 aBar<T>

哦哦,如何T定义Bar<T>?。

我们知道T是 a Bar<T>,所以如果我们替换Tin Bar<T>,那么它就是 a Bar<Bar<T>>

我们还没有解决TBar......为了便于讨论,让我们来代替 …

generics templates kotlin

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

为什么不能在 build.gradle.kts 中使用 `const val`

我想在guild.gradle.kts文件中定义一个版本常量,以便它甚至可以在plugins块中使用。该plugins块需要受限制的语法

«plugin version» 必须是常量、文字、字符串

遵循限制,我尝试定义 a 版本常量:

const val kotlinVersion = "1.3.72"

plugins {
    java
    kotlin("jvm") version kotlinVersion
}
Run Code Online (Sandbox Code Playgroud)

但是,这失败并显示消息

Const 'val' are only allowed on top level or in objects
Run Code Online (Sandbox Code Playgroud)

即使声明似乎满足所有const 要求。为什么const val在 build.gradle.kts 中不能使用?

constants gradle kotlin build.gradle gradle-kotlin-dsl

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