有点复杂的消息布局

我有一个非常有趣的问题。 我应该像电报那样对短信进行布局,但只能用文本。 所以如果消息文本占用多于一行的话,我应该稍微移一点时间戳。 我做了2个textView的布局(一个用于单行消息和其他多行,你可以看到我的布局在附加) 我的问题是,当我显示时间戳多行的情况下,所有列表一个小小的跳跃(因为高度的观点改变)在这里我的代码从我的viewHolder(我使用kotlin,但它仍然非常明显)。 主要的问题是 – 如何在渲染之前在textView中计算行数? val date = stamp.toString(Constants.DEFAULT_TIME_FORMAT) textViewItemMessageText.text = text textViewItemMessageTimeForSingleLine.show() textViewItemMessageTime.hide() textViewItemMessageTimeForSingleLine.text = date textViewItemMessageText.post { if (textViewItemMessageText.lineCount > 1) { textViewItemMessageTimeForSingleLine.hide() textViewItemMessageTime.show() textViewItemMessageTime.text = date }

用一种expression方式创建,初始化和运行的习惯性方法

有时你有这样的事情: let mut something = Something::new(); something.set_property_a(“foo”); something.set_property_b(“bar”); let result = something.result(); 你所需要的只是结果,但现在范围被污染something 。 在Kotlin中,你可以像这样做(在其他版本中,但为了清晰起见,使用详细的): val result = Something().let { x -> x.propertyA = “foo” x.propertyB = “bar” x.result() } T.let(closure)只是运行闭T.let(closure)它的对象( Something的实例)作为参数,并返回闭包返回的任何东西。 非常轻量级和简单的概念,但非常有帮助。 在Rust里能做什么类似的事情吗? 我最近想出的是: let result = { let mut x = Something::new(); x.set_property_a(“foo”); x.set_property_b(“boo”); x.result() };

什么是Kotlin的Java静态方法的等价物?

Kotlin中没有static关键字。 在Kotlin中表示static Java方法的最好方法是什么?

kotlin的htmlx构建器如何正确地工作?

这是解释htmlx构建器某些部分的片段(来自文档): protected fun initTag(tag: T, init: T.() -> Unit): T { tag.init() children.add(tag) return tag } 最重要的是children.add(tag) ,所以我们可以声明: html { head {} body {} } 因为head和body是html的成员函数。 但是DIV标签呢? 我可以在任何地方宣布div,而且我可以这样写: someEnclosingTag { (1..3).forEach { div {+”MyCustomDivFromEverywhere”} }} 如何包装lambda知道“孩子”lambda(并分别添加到整个html的“孩子”标签),可以在任何地方宣布? 请纠正我,如果我在某个地方错了。 UPDATE 基于回答,我结束了以下肮脏的虚拟代码,显示函数范围(封闭的一些方面)和隐式的接收器遗漏(希望它可以以某种方式帮助某人): fun main(args: Array) { Child().childFun { /*childFun lambda receiver implements parent1Fun lambda receiver, so the receiver […]

如何配置kotlin-logging记录器

为了在我的Kotlin项目中进行日志记录 ,我正在使用kotlin-logging ,但是我错过了一个非常中心的观点:如何配置记录器的日志级别? 默认情况下,它被设置为信息,我想将其设置为调试。 由于在Github页面上没有任何关于GitHub页面的内容,也没有任何方法来以编程方式设置关卡,所以我查看了slf4j,因为kotlin-logging是一个包装。 显然我必须像这样设置一个系统属性: -Dorg.slf4j.simpleLogger.defaultLogLevel=DEBUG 但是我不知道如何在Kotlin做到这一点。 任何人都可以帮助我?

使用默认值推断类types的参数

我有一个这样的构造函数类声明 class Facade( val kClass: KClass = SuperClass::class ) 这样做是为了让开发人员不必指定SuperClass,如果他们想使用它而不是一个子类。 甚至发送类types的原因是,所以开发人员不必在尖括号中指定types。 但现在出现这个问题。 像下面这样创建实例,表示没有足够的信息来推断参数T.这导致必须将类放在尖括号中。 Facade() 但是由于默认值是SuperClass,所以kotlin应该能够将参数T推断为SuperClass。 我在想什么错 谢谢 TL; DR: Facade(SubClass:class) // working Facade(SuperClass:class) // working, but don’t want (superclass is default) Facade() // working, but don’t want angle brackets Facade() // not working, cannot infer T type from default, why?

Android数据绑定不适用于Kotlin的class级授权

我的ViewModel: class MyVM( app: Application, private val observableImpl: BaseObservable, /* other colaborators*/ ) : AndroidViewModel(app), Observable by observableImpl { var currencyCode: String by Delegates.observable(“”) { _, _, newValue -> /* business logic methods */ notifyPropertyChanged(BR.currencyCode) } @Bindable get } 我的布局: 当currencyCode在数据模型中更新时, TextView不会自动更改文本。 我试图摆脱从AndroidViewModelinheritance和定义MyVM ,如下所示: class MyVM(/* other colaborators*/) : BaseObservable() { } 它的工作。 问题是,我不能丢弃我的生产代码中的AndroidViewModel的inheritance。 尽管有一个解决方法: […]

为什么Kotlin使用“val”这个词来代表常量?

我真的想知道为什么Kotlin使用val这个词来代表常量? 如果var意味着variables。 val意味着什么? val表示var + l还是val只是一个单词? 在Kotlin文档中,我们只有以下几个字。 使用val关键字声明只读局部variables。 可变的局部variables是使用var关键字声明的。 这个问题不仅是为了弄清val这个词,还要提醒WMA MAKER告诉我们为什么他们说出这个词,这不是一件小事,这会让我们学习新知识更加舒适,我们想要学习和理解一切。 例如,很多人想知道为什么Swift使用let或Objective-C为什么使用.m文件扩展名? 我认为官方的文件或回应是非常重要的,任何猜测或假设都不是真的有用,因为它没有定罪,混淆仍然是困惑的。 我也在官方论坛上问过这个问题: https://discuss.kotlinlang.org/t/why-kotlin-use-the-word-val-to-stand-for-constant/4491 一些参考: https://discuss.kotlinlang.org/t/change-val-to-something-else/1180/13

Live模板不能在Kotlin中工作

希望你已经使用Android默认的实时模板。 喜欢: Generate debug log statement: “logd”+TAB Generate error log statement: “loge”+TAB Generate info log statement: “logi”+TAB Generate TAG declaration: “logt”+TAB Generate parameter logging: “logm”+TAB Generate method return log: “logr”+TAB 它在KOTLIN中不可用? 在Android Studio 3.0 Canary版本中不可用吗?

Kotlin maven插件编译顺序

我有一个关于kotlin-maven插件的问题:如何确定编译顺序? 我的意思是:kotlin编译器必须先来吗? 它理解java代码吗? java编译器不能理解kotlin代码,所以我想它会检查字节码,但为此,kotlin的字节码必须存在,所以有人必须确定kotline编译器必须在javac之前编译它的代码。 例如:我有Java类A,依赖于Kotlin类B和B也依赖于A. 我是否必须在maven插件中手动执行某些操作,方法是在java maven编译器之前声明它。