小编Squ*_*yMo的帖子

Kotlin属性访问语法如何用于Java类(即EditText setText)?

我正在尝试将我的Android项目切换到Kotlin.我有一个EditText(我的子类TextView),我想以编程方式设置提示和文本.提示按预期工作.但是对于文本,如果我尝试使用Kotlin setter语法,我会遇到类型不匹配异常:

    val test = EditText(context)

    test.setHint("hint")    // Lint message: "Use property access syntax"
    test.hint = "hint"      // ok

    test.setText("text")    // ok (no lint message)
    test.text = "text"      // Type mismatch: inferred type is kotlin.String but android.text.Editable! was expected
Run Code Online (Sandbox Code Playgroud)

如果我们查看声明,我们会发现从TextView以下内容继承的相同签名:

    public final void setHint(CharSequence hint)

    public final void setText(CharSequence text)
Run Code Online (Sandbox Code Playgroud)

我的印象x.y = z是一种捷径,x.setY(z)但显然这种印象是错误的.setText()被视为普通方法而不是setter,但这两种方法之间的区别是什么使编译器的行为不同?我唯一能想到的是,TextView有一个mHint属性,但我不认为它可能是这样.

我不太明白的另一件事是,android.text.Editable来自哪里?没有相应的setText(Editable)方法,也没有这种类型的公共领域.

谢谢.

android android-edittext kotlin

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

如何截断双倍到N位小数?

我想将我的double值舍入到N个小数位(比如说一个),实际上只是省略了后面的所有数字:

0.123 #=> 0.1
0.19  #=> 0.1
0.2   #=> 0.2
Run Code Online (Sandbox Code Playgroud)

这个问题已经多次提出,例如这里这里.推荐的方法是使用BigDecimal然后缩放它,特别是为了避免昂贵的转换为字符串和返回.我需要的舍入模式显然是RoundingMode.DOWN.

所以方法是这样的:

static double truncate(double value, int places) {
    return new BigDecimal(value)
        .setScale(places, RoundingMode.DOWN)
        .doubleValue();
}
Run Code Online (Sandbox Code Playgroud)

但是,由于精度的降低,它会带来一些意想不到的结果:

truncate(0.2, 1) #=> 0.2
truncate(0.3, 1) #=> 0.2
truncate(0.4, 1) #=> 0.4

truncate(0.2, 3) #=> 0.2
truncate(0.3, 3) #=> 0.299
truncate(0.4, 3) #=> 0.4
Run Code Online (Sandbox Code Playgroud)

这引出了两个问题:

  1. 是它应该如何工作0.3?为什么在这种情况下会失去精确度?难道它没有击败拥有的全部目的BigDecimal吗?

  2. 如何正确截断我的值?

谢谢.

java rounding bigdecimal

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

Dagger 2错误:没有@Inject构造函数的依赖"无法提供"

我正在尝试在我的Android项目中使用Dagger 2.对于初学者,我想分别使用两个负责注入应用程序范围和活动范围依赖关系的组件.作为基本参考,我使用了这个答案.

因此,有两种不同的方法来设置组件之间的关系:使用@Subcomponent注释和dependencies参数.

  1. 如果我选择第一个,我的AppContextComponent工作正常.但是一旦我尝试从中注入依赖项ActivityContextComponent,我就会遇到这个构建时错误:

错误:如果没有@Inject构造函数或@ Provide-或@ Produces-annotated方法,则无法提供com.example.ui.activity.MainActivity.

  1. 使用第二种方法,我得到所有依赖项的此错误.

知道我确实有提供方法,这个错误信息坦率地没用.以下是我设法谷歌出错的其他几个可能的错误来源,但似乎并非如此:

  1. 范围问题.
  2. 由于来自不同提供方法的相同返回类型导致的不确定性(即使我删除提供的方法,问题仍然存在Context).

以下代码在Kotlin中,但我认为它应该非常简单.

应用程序组件

object AppContext {
    // a singleton used in place of a Java static field
    @JvmStatic lateinit var graph: AppContextComponent
}

@ApplicationScope @Component(modules = arrayOf(AppContextModule::class))
interface AppContextComponent {
    fun inject(fragment: BaseFragment)

    fun newActivityContextComponent(module: ActivityContextModule): ActivityContextComponent
}

@Module
class AppContextModule(val app: MyApplication) {
    @Provides @ApplicationScope @ForApplication
    fun provideContext(): Context {
        return …
Run Code Online (Sandbox Code Playgroud)

android dependency-injection kotlin dagger-2

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