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 documentation,SignInButton
实际上扩展了 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
我正在尝试按照 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 documentation,SignInButton
实际上扩展了 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