我正在研究一个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
答案 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
}