我发现自己为我创建的每个新片段编写样板代码。这包括设置视图模型和视图绑定,这是我的代码的 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
你如何在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.
在我的应用程序执行过程中,我如何获得 EMUI 版本?有什么系统方法可以获取EMUI版本吗?
我试图在 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) 我有 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
我正在尝试使用Agora构建一个视频通话应用程序,我需要在用户呼叫时显示像 WhatsApp 这样的接受屏幕,如果退出应用程序,我需要在用户呼叫时显示呼叫屏幕,我尝试了很多东西,但没有任何效果,我试图做我颤抖,但没有太多关于这方面的信息,请帮助我
尝试下载并保存文件时,会引发错误
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) 在科特林文件https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/component1.html
有component1至component5。我有点迷茫它们的用例是什么?
我认为我们基本上可以mylist.get[0]为mylist.component1. 它更短,更具扩展性。拥有这样的东西似乎是多余的component1。我错过了任何细节吗?
在工作中进行代码审查并遇到了我以前从未见过的模板类型的使用。乍一看,代码似乎不应该编译,因为定义似乎是递归的。我将其归结为最简单的可验证示例:
interface Bar<T>
interface Foo<T: Bar<T>> // Surely this is recursive?
Run Code Online (Sandbox Code Playgroud)
我对模板类型如何工作的理解是:
interface Foo<T>-一个Foo的T,没有任何限制
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>>。
我们还没有解决T的Bar......为了便于讨论,让我们来代替 …
我想在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 中不能使用?
kotlin ×10
android ×6
agora.io ×1
android-architecture-navigation ×1
boilerplate ×1
build.gradle ×1
collections ×1
constants ×1
flutter ×1
generics ×1
gradle ×1
ktor ×1
ktor-client ×1
templates ×1