Google 按钮 "cannot be cast to android.widget.Button"

Google Button "cannot be cast to android.widget.Button"

我正在尝试按照 Google 的说明导入 Google Play 游戏服务: https://developers.google.com/games/services/training/signin

<!-- sign-in button -->
<com.google.android.gms.common.SignInButton
 android:id="@+id/sign_in_button"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content" />

当我导入官方 Google 播放按钮(如上图 XML 布局所示)时,我在日志中收到此错误:

java.lang.RuntimeException: Unable to start activity ComponentInfo{flash4life.gespant2015.com.flashreflex20/flash4life.gespant2015.com.flashreflex20.MainActivity}: java.lang.ClassCastException: com.google.android.gms.common.SignInButton cannot be cast to android.widget.Button
                                                                                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3255)

这是整个错误日志:

08-15 19:57:25.961 472-472/flash4life.gespant2015.com.flashreflex20 E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                  Process: flash4life.gespant2015.com.flashreflex20, PID: 472
                                                                                  java.lang.RuntimeException: Unable to start activity ComponentInfo{flash4life.gespant2015.com.flashreflex20/flash4life.gespant2015.com.flashreflex20.MainActivity}: java.lang.ClassCastException: com.google.android.gms.common.SignInButton cannot be cast to android.widget.Button
                                                                                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3255)
                                                                                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3351)
                                                                                      at android.app.ActivityThread.access00(ActivityThread.java:222)
                                                                                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1796)
                                                                                      at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                      at android.os.Looper.loop(Looper.java:158)
                                                                                      at android.app.ActivityThread.main(ActivityThread.java:7230)
                                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
                                                                                   Caused by: java.lang.ClassCastException: com.google.android.gms.common.SignInButton cannot be cast to android.widget.Button
                                                                                      at flash4life.gespant2015.com.flashreflex20.MainActivity.onCreate(MainActivity.java:107)
                                                                                      at android.app.Activity.performCreate(Activity.java:6877)
                                                                                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1136)
                                                                                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3208)
                                                                                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3351) 
                                                                                      at android.app.ActivityThread.access00(ActivityThread.java:222) 
                                                                                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1796) 
                                                                                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                      at android.os.Looper.loop(Looper.java:158) 
                                                                                      at android.app.ActivityThread.main(ActivityThread.java:7230) 
                                                                                      at java.lang.reflect.Method.invoke(Native Method) 
                                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

我在 Java 中分配了按钮:

signInButton = (Button) findViewById(R.id.sign-in-button);

虽然其中包含单词按钮,但根据 SignInButton documentationSignInButton 实际上扩展了 FrameLayout

每个 View 都支持设置 OnClickListener,因此根本没有理由将其转换为 Button

SignInButton 无法分配给 Button。

你可以这样使用:

SignInButton signInButton = (SignInButton) findViewById(R.id.sign_in_button);

如有需要,可参考: https://developers.google.com/identity/sign-in/android/sign-in

这是 SignInButton 文档,它是一个没有按钮的 frameLayout public final class SignInButton extends FrameLayout implements View.OnClickListener

但是它有你可以使用的功能 void setOnClickListener(View.OnClickListener 侦听器)

所以你可以这样做 signInButton = (SignInButton ) findViewById(R.id.sign-in-button); signInButton.setOnClickListener(新的 OnCLickListener)

SignInButton 无法分配给 Button

你可以使用这种方式:(Kotlin)

        var signin = findViewById<View>(R.id.sign_in_button) as SignInButton