无法将onClick分配给Kotlin中的按钮

时间:2019-06-26 12:10:56

标签: android kotlin onclick

我正在研究一个android studio项目,该项目部分是用kotlin构建的,其余部分是用java构建的。在进行此项目之前,我从未与kotlin一起工作过,目前,我发现自己花费了数小时试图实现对按钮的简单onclick。我知道这个问题已经问了很多,但是我尝试过的大多数解决方案都行不通。

这是我的xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/folioPageFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<FrameLayout
    android:id="@+id/webViewLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@+id/indicatorLayout">

    <com.folioreader.ui.view.WebViewPager
        android:id="@+id/webViewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <com.folioreader.ui.view.FolioWebView
        android:id="@+id/folioWebView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</FrameLayout>

<com.folioreader.ui.view.LoadingView
    android:id="@+id/loadingView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:maxVisibleDuration="10000"
    tools:visibility="invisible" >
</com.folioreader.ui.view.LoadingView>

<com.folioreader.ui.view.VerticalSeekbar
    android:id="@+id/scrollSeekbar"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_above="@+id/indicatorLayout"
    android:layout_alignParentRight="true"
    android:layout_marginRight="2dp"
    android:animateLayoutChanges="true"
    android:thumb="@drawable/thumb"
    android:visibility="invisible" />

<Button
        android:text="Button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" tools:layout_editor_absoluteY="655dp"
        tools:layout_editor_absoluteX="161dp"
        android:id="@+id/buttonVasko"
        android:layout_marginTop="530dp"
        android:layout_marginLeft="150dp"

        android:layout_alignParentTop="true" 
        android:layout_alignParentStart="true"
        android:layout_marginStart="0dp"

/>
<LinearLayout
    android:id="@+id/indicatorLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:gravity="center"
    android:orientation="horizontal"
    android:paddingTop="2dp"
    android:paddingBottom="2dp"
    android:visibility="gone">

    <TextView
        android:id="@+id/minutesLeft"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#888888"
        android:textSize="7sp" />

    <TextView
        android:id="@+id/pagesLeft"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="#bbbbbb"
        android:textSize="8sp" />
</LinearLayout>

这是onCreateView函数的开始:

 override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?, savedInstanceState: Bundle?
): View? {

    buttonVasko.setOnClickListener(object:View.OnClickListener {
        override fun onClick(view:View) {
            Toast.makeText(context,"WORK!!!", Toast.LENGTH_LONG).show()
        }// end onClick
    })

这是我在运行代码时收到的错误:

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.folioreader.android.sample, PID: 3862
java.lang.IllegalStateException: Could not find method zoko(View) in a 
parent or ancestor Context for android:onClick attribute defined on view 
class androidx.appcompat.widget.AppCompatButton with id 'buttonVasko'

我还尝试将setOnClickListener放在onCreateView函数的最后,以防在setOnClickListener之前需要编写一行代码,但结果是相同的。

完整的FolioPageFragment在这里: https://codeshare.io/5PlwDw

3 个答案:

答案 0 :(得分:1)

您已经将片段扩展为mRootView。您可以在onViewCreated中设置onClick侦听器。这是代码

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    view.findViewById<Button>(R.id.buttonVasko).setOnClickListener {

    }
}

您应该删除此静态视图导入。

import kotlinx.android.synthetic.main.folio_page_fragment.*
import kotlinx.android.synthetic.main.folio_page_fragment.view.*

希望它会起作用。

答案 1 :(得分:0)

像这样

    buttonVasko.setOnClickListener {
       // your code
Toast.makeText(context,"WORK!!!", Toast.LENGTH_LONG).show()
    }

答案 2 :(得分:-1)

从讨论和评论中,我可以看到您正在使用一个片段。片段的行为与活动不同,它不会像您setContentView时的活动那样按ID绑定视图。在您的onCreateView中为片段视图充气时,您需要在该视图中寻找视图:

 override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?, savedInstanceState: Bundle?
): View? {
    val view = inflater.inflate(R.layout.fragment_view, container, false)
    view.buttonVasko.setOnClickListener {
        Toast.makeText(context, "WORK!!!", Toast.LENGTH_LONG).show()
    }
    return view
}