Buttons onClick强制关闭Android 4.1设备上的应用程序

问题描述 投票:0回答:1

我有一个带有一个按钮的简单布局的应用程序。我尝试使用AppCompatButtonAppCompatImageButton实现onClick。但是,当我在Android 4.1设备上运行它时,当我单击它时,我的应用程序崩溃了(不幸的是,应用程序已停止)。

我在Android 5.0设备上进行了相同的测试,并且可以正常工作。然后尝试相同的方法,但改用ButtonImageButton,并且两者均可。

这些按钮没有样式或主题。仅有裸露的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方法。

android android-appcompat android-button
1个回答
0
投票

我以前从未真正看到过,但是它看起来像是两件事的结合:

  • 在棒棒糖之前的设备上,AppCompatButton使用TintContextWrapper作为按钮视图的上下文
  • android:onClick属性使用反射来查找要执行的方法,在视图的上下文内部查看

一起,这意味着系统在错误的位置寻找btnClick(),因此应用程序崩溃。

您可以通过代码而不是使用android:onClick属性来设置点击侦听器来解决此问题。在您的MainActivity的onCreate()方法中:

View button = findViewById(R.id.btn);
button.setOnClickListener(v -> btnClick(v));
© www.soinside.com 2019 - 2024. All rights reserved.