我想编写一个函数来返回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
我不知道如何实现它.在没有此警告的情况下实施此功能的正确方法是什么?
为什么我需要var
使用自定义getter 初始化a ,返回常量?
var greeting: String // Property must be initialized
get() = "hello"
Run Code Online (Sandbox Code Playgroud)
当我做greeting
只读(val
)时我不需要初始化
当从活动、片段或 Android 架构组件 ViewModel 启动协程时,使用绑定到该视图组件生命周期的协程范围是完全有意义的,以避免泄漏和释放资源,例如在用户离开时取消网络请求屏幕。
但在其他情况下,即使用户离开屏幕,您也不想取消协程,例如执行网络请求进行分析或写入数据库时。GlobalScope
在这种情况下启动协程可以吗?启动这些协程的对象大多是Singletons
,所以它们无论如何都会在应用程序的生命周期内存活,所以没有泄漏的危险,对吧?
在 GlobalScope 上,Kotlin 文档非常清楚:
应用程序代码通常应该使用应用程序定义的 CoroutineScope。强烈建议不要在 GlobalScope 实例上使用 async 或 launch。
在这些情况下可以使用 GlobalScope 吗?如果不是,我的应用程序定义的 CoroutineScope 应该是什么样的?
我升级到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)
在我的根布局中.
我有一个包含另一个布局的布局:
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) 我创建对象时,我的初始化程序块工作正常
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以不同于执行主构造函数的方式创建对象.是否有可能像初始化程序块一样有类似的东西?
我想否定以下表达式:
return SpUtils.loadEMail()?.isEmpty() ?: false
如果我添加一个!在表达之前,就像
return !SpUtils.loadEMail()?.isEmpty() ?: false
IDE(Android Studio)告诉我
在类型为kotlin.Boolean的可空接收器上只允许安全(?.)或非空的断言(!!.)调用?
我怎么否定这种表达方式呢?
根据官方kotlin文档,null对象的toString()调用返回"null" toString()
我想,toString()应该返回一个空字符串("").我用扩展功能实现了它.
fun Any?.toEmptyStringIfNull() :String {
if (this == null) {
return ""
} else {
return toString()
}
Run Code Online (Sandbox Code Playgroud)
我想知道这是否可以实现更简单/更容易/更清洁,并且无需每次都调用扩展功能.
我正在开发一个Android应用程序,我想在Crashlytics/Fabric(调试和发布)中有两个不同的项目.
我知道这可以通过两个不同的包名来实现,但在我的情况下,这两种构建类型的包名必须相同.
是否有可能有两个具有相同包名称的碰撞项目?
我有一个名为app的Android Studio模块。我还有一个名为library的库模块。
在库中,我有一些软件包,例如manager或network。程序包管理器包含一个名为SPManager的类,带有静态方法storeSP()
package com.example.library.manager;
public class SPManager {
______ static void storeSP(){...}
}
Run Code Online (Sandbox Code Playgroud)
是否可以仅在我的库模块中访问storeSP()?如果选择package-private(无访问修饰符),则无法从同一模块的网络程序包中访问它。如果我选择public,那么也可以从其他模块访问此方法。
提前致谢!
我有一个 org. Threeten.bp.LocalDate 和一个 org. Threeten.bp.LocalTime 并且我确实需要一个 java.util.date 实例。实现这一目标的最佳方法是什么?我查看了DateTimeUtils但没有找到合适的解决方案。
我正在使用 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
这个 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()
默认不隐藏数据类中的私有属性?