小编luk*_*kle的帖子

Kotlin:如何处理列表转换:未选中Cast:kotlin.collections.List <Kotlin.Any?> to kotlin.colletions.List <Waypoint>

我想编写一个函数来返回List不是第一个或最后一个项目(通过点)的每个项目.该函数获取通用List<*>作为输入.只有在列表的元素属于以下类型时才应返回结果Waypoint:

fun getViaPoints(list: List<*>): List<Waypoint>? {

    list.forEach { if(it !is Waypoint ) return null }

    val waypointList = list as? List<Waypoint> ?: return null

    return waypointList.filter{ waypointList.indexOf(it) != 0 && waypointList.indexOf(it) != waypointList.lastIndex}
}
Run Code Online (Sandbox Code Playgroud)

当转换为List<*>to时List<Waypoint>,我收到警告:

未选中Cast:kotlin.collections.List to kotlin.colletions.List

我不知道如何实现它.在没有此警告的情况下实施此功能的正确方法是什么?

generics casting list kotlin

79
推荐指数
4
解决办法
3万
查看次数

Kotlin:为什么我需要使用自定义getter初始化var?

为什么我需要var使用自定义getter 初始化a ,返回常量?

var greeting: String // Property must be initialized 
get() = "hello"
Run Code Online (Sandbox Code Playgroud)

当我做greeting只读(val)时我不需要初始化

kotlin

26
推荐指数
2
解决办法
5234
查看次数

在某些情况下(单例)可以在 Android 上从 Globalscope 启动协程吗?

当从活动、片段或 Android 架构组件 ViewModel 启动协程时,使用绑定到该视图组件生命周期的协程范围是完全有意义的,以避免泄漏和释放资源,例如在用户离开时取消网络请求屏幕。

但在其他情况下,即使用户离开屏幕,您也不想取消协程,例如执行网络请求进行分析或写入数据库时​​。GlobalScope在这种情况下启动协程可以吗?启动这些协程的对象大多是Singletons,所以它们无论如何都会在应用程序的生命周期内存活,所以没有泄漏的危险,对吧?

在 GlobalScope 上,Kotlin 文档非常清楚:

应用程序代码通常应该使用应用程序定义的 CoroutineScope。强烈建议不要在 GlobalScope 实例上使用 async 或 launch。

在这些情况下可以使用 GlobalScope 吗?如果不是,我的应用程序定义的 CoroutineScope 应该是什么样的?

android kotlin kotlin-coroutines

19
推荐指数
2
解决办法
4369
查看次数

升级Android支持库23.2.0后的代码分析错误(意外的名称空间前缀)

我升级到Android支持库23.2.0并添加

vectorDrawables.useSupportLibrary = true
Run Code Online (Sandbox Code Playgroud)

到我的build.gradle,所以我对低于21的apis有矢量绘制支持.(详情请见这里).

我也换了

android:src="@drawable/ic_create_black_24dp"
Run Code Online (Sandbox Code Playgroud)

app:srcCompat="@drawable/ic_create_black_24dp"
Run Code Online (Sandbox Code Playgroud)

在每个使用矢量绘图的Imageview中.

该应用程序编译和工作完美,但代码分析报告:

错误:(56,9)为标记找到了意外的名称空间前缀"app" ImageView

为什么会这样?虽然我收到错误,为什么要编译?

编辑:我已经补充说

xmlns:app="http://schemas.android.com/apk/res-auto"
Run Code Online (Sandbox Code Playgroud)

在我的根布局中.

android android-support-library

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

Kotlin Android Extensions:如何获得对包含在另一个布局中的布局中的视图的引用?

我有一个包含另一个布局的布局:

activity_main.xml中:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"/>

    <include layout="@layout/included_layout" />

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

included_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent">

    <TextView
        android:id="@+id/includedTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Included TextView"/>

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

如何在包含的布局中获得对TextView的引用?是否尚未支持?

主要活动:

import android.app.Activity
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.activity_main.*

class MainActivity : AppCompatActivity(){

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        textView.text = "text" // works!
        textViewInclude.text = "textInclude" // does not work: "Unresolved reference: textViewInclude "
    }
}
Run Code Online (Sandbox Code Playgroud)

kotlin-android-extensions

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

使用Kotlin进行Gson反序列化,不调用初始化程序块

我创建对象时,我的初始化程序块工作正常

class ObjectToDeserialize(var someString: String = "") : Serializable {
    init{
        someString += " initialized"
    }
}
Run Code Online (Sandbox Code Playgroud)

这条路:

@Test
fun createObject_checkIfInitialized() {
      assertEquals("someString initialized",ObjectToDeserialize("someString").someString)
}
Run Code Online (Sandbox Code Playgroud)

但是当我用Gson反序列化对象时,初始化块不会被执行:

@Test
fun deserializeObject_checkIfInitialized(){
    val someJson: String = "{\"someString\":\"someString\" }"
    val jsonObject = Gson().fromJson(someJson, ObjectToDeserialize::class.java)

    assertEquals("someString initialized",jsonObject.someString)

    // Expected :someString initialized
    // Actual   :someString
}
Run Code Online (Sandbox Code Playgroud)

我认为gson以不同于执行主构造函数的方式创建对象.是否有可能像初始化程序块一样有类似的东西?


gson kotlin

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

在kotlin中使用elvis运算符时如何否定布尔表达式?

我想否定以下表达式:

return SpUtils.loadEMail()?.isEmpty() ?: false

如果我添加一个!在表达之前,就像

return !SpUtils.loadEMail()?.isEmpty() ?: false

IDE(Android Studio)告诉我

在类型为kotlin.Boolean的可空接收器上只允许安全(?.)或非空的断言(!!.)调用?

我怎么否定这种表达方式呢?

kotlin

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

对于null对象的toString()方法来说,kotlin中最好的方法是返回一个空字符串而不是"null"

根据官方kotlin文档,null对象的toString()调用返回"null" toString()

我想,toString()应该返回一个空字符串("").我用扩展功能实现了它.

fun Any?.toEmptyStringIfNull() :String {
if (this == null) {
    return ""
} else {
    return toString()
}
Run Code Online (Sandbox Code Playgroud)

我想知道这是否可以实现更简单/更容易/更清洁,并且无需每次都调用扩展功能.

string null nullable kotlin

11
推荐指数
2
解决办法
4213
查看次数

Android上的Fabric/Crashlytics - 如何使用相同的包名称拥有两个不同的crashlytics项目?

我正在开发一个Android应用程序,我想在Crashlytics/Fabric(调试和发布)中有两个不同的项目.

我知道这可以通过两个不同的包名来实现,但在我的情况下,这两种构建类型的包名必须相同.

是否有可能有两个具有相同包名称的碰撞项目?

android gradle crashlytics twitter-fabric

10
推荐指数
2
解决办法
3605
查看次数

Android模块访问修饰符-是否可以使方法仅在android studio库模块中可访问?

我有一个名为app的Android Studio模块。我还有一个名为library的库模块。

库中,我有一些软件包,例如managernetwork。程序包管理器包含一个名为SPManager的类,带有静态方法storeSP()

package com.example.library.manager;

public class SPManager {
    ______ static void storeSP(){...}
}
Run Code Online (Sandbox Code Playgroud)

是否可以仅在我的模块中访问storeSP()?如果选择package-private(无访问修饰符),则无法从同一模块的网络程序包中访问它。如果我选择public,那么也可以从其他模块访问此方法。

提前致谢!

java android android-studio

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

将 LocalDate 和 LocalTime 转换为 java.util.date 的最佳方法是什么?

我有一个 org. Threeten.bp.LocalDate 和一个 org. Threeten.bp.LocalTime 并且我确实需要一个 java.util.date 实例。实现这一目标的最佳方法是什么?我查看了DateTimeUtils但没有找到合适的解决方案。

threetenbp

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

如何确定 gradle 守护进程是否正在运行?

我正在使用 Android Studio 2.0 开发 Android 应用程序。我在很多博客文章中读到启用 gradle 守护程序应该会显着提高构建性能。

我的问题是,我不知道如何检查守护进程是否正在运行。我添加了该行

org.gradle.daemon=true
Run Code Online (Sandbox Code Playgroud)

gradle.properties文件,但 Android Studio 向我显示了一个unused property警告,所以我不确定守护程序是否真的在运行。我怎样才能知道守护进程是否真的在运行?

android gradle android-studio android-gradle-plugin gradle-daemon

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

Kotlin 数据类:为什么 toString() 导出私有属性

这个 Kotlin 数据类

data class PhoneNumber(val prefix: String, private val lineNumber: String)
Run Code Online (Sandbox Code Playgroud)

拥有私有财产lineNumber

当我创建一个对象时:

val phoneNumber = PhoneNumber("0676", "123456")
// toString() = PhoneNumber(prefix=0676, lineNumber=123456)
Run Code Online (Sandbox Code Playgroud)

我不希望该toString()函数也公开lineNumber.

在 Effective Java 中,Joshua Bloch 写道

提供对 toString() 返回值中包含的所有信息的编程访问

如果您不这样做,您图书馆的客户将解析toString()结果以访问lineNumber.

有谁知道为什么 KotlintoString()默认不隐藏数据类中的私有属性?

kotlin

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