Android の DataBinding で onLongClick イベントにメソッドをバインドできない(と思い込んでしまう)落とし穴

このページは自分と同じ穴に落ちた人向けへのページです。

onLongClick イベントへのバインドがうまくいかなかった。

初めて Button の onLongClick イベントにメソッドをバインドしようとした際に失敗しました。

以下のようなメッセージが出力されてコンパイルに失敗しました。

Error:Execution failed for task ':note-app-main:compileDevelopmentDebugJavaWithJavac'.
> java.lang.RuntimeException: failure, see logs for details.
cannot generate view binders java.lang.StackOverflowError
at android.databinding.tool.writer.Scope.access$getCurrentScope$cp(LayoutBinderWriter.kt:49)
at android.databinding.tool.writer.Scope$Companion.getCurrentScope(LayoutBinderWriter.kt:58)
at android.databinding.tool.writer.LayoutBinderWriterKt.scopedName(LayoutBinderWriter.kt:196)
at android.databinding.tool.expr.Expr.toCode(Expr.java:776)
at android.databinding.tool.writer.LayoutBinderWriterKt$callbackLocalName$2.invoke(LayoutBinderWriter.kt:203)
at android.databinding.tool.writer.LayoutBinderWriterKt$callbackLocalName$2.invoke(LayoutBinderWriter.kt)
at android.databinding.tool.ext.LazyExt.getValue(ext.kt:27)
at android.databinding.tool.writer.LayoutBinderWriterKt.getCallbackLocalName(LayoutBinderWriter.kt)
at android.databinding.tool.writer.LayoutBinderWriterKt.scopedName(LayoutBinderWriter.kt:197)
...

Android の以下の公式の説明ページに onLongClick が載っているので使えるという予測にも反しての原因不明の失敗でした。

バインドしようとしたメソッドの戻り値を確かめよう。

バインドしようとしたメソッドの戻り値を確かめてください。

void にしていませんか?

戻り値を boolean にしてみてください!!!

理由は簡単です。

View.OnLongClickListener の onLongClick の戻り値が boolean で、これに合わせる必要があるからです。

View.OnClickListener の戻り値が void なので、そのままの感覚で onLongClick 向けのイベントを用意するとこの落とし穴に落ちます(私は落ちました)。

単純なプログラムだとちゃんと「Error:(5, 16) エラー: 不適合な型: 予期しない戻り値」という表示が出るようです。

StackOverflowError になってしまう細かい条件まではわかりません。

参考

この話題は既に Android の開発チケットとして上がっているようです。

「You should return boolean in your Presenter/MainActivity method onLongClick.」のコメントを読んで、自分の間違いに気づきました。

この記事は日本人向けに書きました。