我有一个带有一个按钮的简单布局的应用程序。我尝试使用AppCompatButton
和AppCompatImageButton
实现onClick。但是,当我在Android 4.1设备上运行它时,当我单击它时,我的应用程序崩溃了(不幸的是,应用程序已停止)。
我在Android 5.0设备上进行了相同的测试,并且可以正常工作。然后尝试相同的方法,但改用Button
和ImageButton
,并且两者均可。
这些按钮没有样式或主题。仅有裸露的30 x 30 dp按钮。这是代码:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary"
app:titleTextColor="@color/white" />
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/adContainer"
android:layout_width="match_parent"
android:layout_height="90dp">
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/btn"
android:layout_width="30dp"
android:layout_height="30dp"
android:onClick="btnClick" />
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Set ActionBar to Toolbar
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
}
public void btnClick(View v) {
// DO SOMETHING
}
}
[目前,我正在使用ImageButton
,但我不知道这是否暗示某些Android版本存在兼容性问题(我支持API 16 +)。
谢谢。
EDIT:这是使用AppCompatButton
时LogCat所显示的内容:
10-03 17:01:36.706 1313-1313/com.example.testappcompatbutton D/AndroidRuntime: Shutting down VM
10-03 17:01:36.706 1313-1313/com.example.testappcompatbutton W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xa62ba288)
--------- beginning of /dev/log/system
10-03 17:01:36.734 1313-1313/com.example.testappcompatbutton E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.IllegalStateException: Could not find a method btnClick(View) in the activity class androidx.appcompat.widget.TintContextWrapper for onClick handler on view class androidx.appcompat.widget.AppCompatButton with id 'btn'
at android.view.View$1.onClick(View.java:3578)
at android.view.View.performClick(View.java:4084)
at android.view.View$PerformClick.run(View.java:16966)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NoSuchMethodException: btnClick [class android.view.View]
at java.lang.Class.getConstructorOrMethod(Class.java:460)
at java.lang.Class.getMethod(Class.java:915)
at android.view.View$1.onClick(View.java:3571)
at android.view.View.performClick(View.java:4084)
at android.view.View$PerformClick.run(View.java:16966)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
似乎无法找到onClick方法。
我以前从未真正看到过,但是它看起来像是两件事的结合:
AppCompatButton
使用TintContextWrapper
作为按钮视图的上下文android:onClick
属性使用反射来查找要执行的方法,在视图的上下文内部查看一起,这意味着系统在错误的位置寻找btnClick()
,因此应用程序崩溃。
您可以通过代码而不是使用android:onClick
属性来设置点击侦听器来解决此问题。在您的MainActivity的onCreate()
方法中:
View button = findViewById(R.id.btn);
button.setOnClickListener(v -> btnClick(v));