【问题标题】:Code conversion issue from Java to Kotlin从 Java 到 Kotlin 的代码转换问题
【发布时间】:2021-05-31 15:53:55
【问题描述】:

我正在尝试将这个很棒的日历事件库集成到我的 Kotlin 项目中

https://github.com/alamkanak/Android-Week-View

我创建了一个 Kotlin 项目。我无法在 Kotlin 中转换 MonthChangeListener

MonthLoader.MonthChangeListener mMonthChangeListener = new MonthLoader.MonthChangeListener() {
    @Override
    public List<WeekViewEvent> onMonthChange(int newYear, int newMonth) {
        // Populate the week view with some events.
        List<WeekViewEvent> events = getEvents(newYear, newMonth);
        return events;
    }
};

我把Java代码复制粘贴到Kotlin项目中,这里是转换的代码

val mMonthChangeListener = MonthChangeListener { newYear, newMonth -> // Populate the week view with some events.
    getEvents(newYear, newMonth)
}

抛出错误

没有实现这个应用程序在启动时崩溃,这里是日志

021-05-31 19:21:18.163 27099-27099/com.calendar.event101 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.calendar.event101, PID: 27099
    java.lang.IllegalStateException: You must provide a MonthChangeListener
        at com.alamkanak.weekview.WeekView.getMoreEvents(WeekView.java:882)
        at com.alamkanak.weekview.WeekView.drawHeaderRowAndEvents(WeekView.java:616)
        at com.alamkanak.weekview.WeekView.onDraw(WeekView.java:488)
        at android.view.View.draw(View.java:17185)
        at android.view.View.updateDisplayListIfDirty(View.java:16167)
        at android.view.View.draw(View.java:16951)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3727)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3513)
        at android.view.View.updateDisplayListIfDirty(View.java:16162)
        at android.view.View.draw(View.java:16951)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3727)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3513)
        at android.view.View.updateDisplayListIfDirty(View.java:16162)
        at android.view.View.draw(View.java:16951)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3727)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3513)
        at android.view.View.updateDisplayListIfDirty(View.java:16162)
        at android.view.View.draw(View.java:16951)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3727)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3513)
        at android.view.View.updateDisplayListIfDirty(View.java:16162)
        at android.view.View.draw(View.java:16951)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3727)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3513)
        at android.view.View.updateDisplayListIfDirty(View.java:16162)
        at android.view.View.draw(View.java:16951)
        at android.view.ViewGroup.drawChild(ViewGroup.java:3727)
        at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3513)
        at android.view.View.draw(View.java:17188)
        at com.android.internal.policy.DecorView.draw(DecorView.java:753)
        at android.view.View.updateDisplayListIfDirty(View.java:16167)
        at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:648)
        at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:654)
        at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:762)
        at android.view.ViewRootImpl.draw(ViewRootImpl.java:2800)
        at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2608)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2215)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6337)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
        at android.view.Choreographer.doCallbacks(Choreographer.java:686)
        at android.view.Choreographer.doFrame(Choreographer.java:621)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6119)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

【问题讨论】:

  • 乍一看,您的问题似乎出在其他地方。上面的 Java/Kotlin 代码只创建了一个监听器,它还没有在任何地方使用它。错误说未提供侦听器,所以我猜在 Java 代码中您向库提供了 mMonthChangeListener 而您没有在 Kotlin 中执行此操作。第二个问题类似:getEvents() 似乎是您在 Java 代码中拥有的一些外部方法/函数,但您在 Kotlin 中没有它或者它无法访问。这是什么功能?与上述代码相关的位置在哪里?

标签: java android kotlin


【解决方案1】:
 val monthChangeListener = MonthChangeListener { newYear, newMonth -> ArrayList<WeekViewEvent>() }

关于getEvents,其实库中根本没有getEvents这样的方法。

查看图书馆老板的回复

https://github.com/alamkanak/Android-Week-View/issues/436#issuecomment-302939156

您可以使用他的这个示例找到示例来自己创建列表。

https://github.com/alamkanak/Android-Week-View/blob/develop/sample/src/main/java/com/alamkanak/weekview/sample/BasicActivity.java

【讨论】:

  • 成功了,谢谢你的指导。你是处理者。 :)
【解决方案2】:

你正在尝试创建一个接口实例(我认为它是一个接口)你可以尝试使用匿名类吗

val monthChangeListener : object = MonthChangeListener {}

它会希望你实现这个接口的成员,我们在 kotlin 中以这种方式使用接口我希望我是对的

【讨论】:

    【解决方案3】:

    试试这个

    val mMonthChangeListener:(Int,Int) -> List<WeekViewEvent> = MonthChangeListener { newYear, newMonth -> // Populate the week view with some events.
                return getEvents(newYear, newMonth)
            }
    

    【讨论】:

    • 出现错误 ==> 未解决的参考:getEvents
    猜你喜欢
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 2019-03-28
    • 2019-08-06
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2018-04-16
    相关资源
    最近更新 更多