首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >即使AppCompatImageButton不是android.widget.Button,也不能强制转换为ImageButton

即使AppCompatImageButton不是android.widget.Button,也不能强制转换为ImageButton
EN

Stack Overflow用户
提问于 2018-07-20 04:18:51
回答 3查看 4.8K关注 0票数 1

我收到一个我不能理解的错误:

代码语言:javascript
复制
07-19 22:14:50.750 23192-23192/com.example.shun.zeatbeta E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.shun.zeatbeta, PID: 23192
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.shun.zeatbeta/com.example.shun.zeatbeta.ReauthenticateActivity}: java.lang.ClassCastException: android.support.v7.widget.AppCompatImageButton cannot be cast to android.widget.Button
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2927)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2988)
        at android.app.ActivityThread.-wrap14(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1631)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6682)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
     Caused by: java.lang.ClassCastException: android.support.v7.widget.AppCompatImageButton cannot be cast to android.widget.Button
        at com.example.shun.zeatbeta.ReauthenticateActivity.onCreate(ReauthenticateActivity.java:59)
        at android.app.Activity.performCreate(Activity.java:6942)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2880)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2988) 
        at android.app.ActivityThread.-wrap14(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1631) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6682) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410) 

在活动中使程序崩溃的代码行:

代码语言:javascript
复制
private Button loginButton;

loginButton = (Button) findViewById(R.id.loginButton);

activity_reauthenticate2.xml:

代码语言:javascript
复制
<com.example.shun.zeatbeta.ComfortaaButton
    android:id="@+id/loginButton"
    android:layout_width="match_parent"
    android:layout_height="@dimen/button_height"
    android:layout_marginTop="20dp"
    android:background="@drawable/round_button_blue"
    android:text="@string/login"
    android:textColor="@color/white"
    android:textSize="15dp"
    app:layout_constraintBottom_toTopOf="@id/facebookWrapper"
    app:layout_constraintTop_toBottomOf="@id/textFields" />

ComfortaaButton.java

代码语言:javascript
复制
package com.example.shun.zeatbeta;

import android.content.Context;
import android.graphics.Typeface;
import android.support.v7.widget.AppCompatButton;
import android.util.AttributeSet;

public class ComfortaaButton extends AppCompatButton {
    public ComfortaaButton(Context context) {
        super(context);
        init();
    }
    public ComfortaaButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
    public ComfortaaButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }
    public void init() {
        Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "font/Comfortaa-Regular.ttf");
        setTypeface(tf, 1);
    }

}

为什么我会得到这个错误?这个按钮显然是一个Button,而不是一个ImageButton。我尝试过清理项目,重新启动,清除缓存等。我甚至尝试创建一个新的活动和布局文件,但错误又回来了!

更新:我在activity crashing the code中获得了这行代码的信息:

代码语言:javascript
复制
Unexpected cast to AppCompatButton: layout tag was ImageButton (Id bound to an ImageButton in activity_landing_page.xml) less... (⌘F1) 
Keeps track of the view types associated with ids and if it finds a usage of the id in the Java code it ensures that it is treated as the same type.

所以它看起来像是在activity_landing_page.xml中而不是在activity_reauthenticate2.xml中通过id来查找活动。为什么?我如何才能改变这一点?

应用程序gradle:

代码语言:javascript
复制
apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    buildToolsVersion '27.0.3'
    defaultConfig {
        applicationId "com.example.s.company"
        minSdkVersion 17
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        vectorDrawables.useSupportLibrary = true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation 'com.android.support:support-v4:27.1.1'
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    implementation 'com.facebook.android:facebook-android-sdk:4.33.0'
    implementation 'com.android.support:design:27.1.1'
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.github.bumptech.glide:glide:4.7.1'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
    implementation 'com.stripe:stripe-android:6.1.2'
    compile 'com.google.firebase:firebase-auth:15.0.0'
    compile 'com.google.firebase:firebase-core:15.0.0'
    compile 'com.google.firebase:firebase-database:15.0.0'
    compile 'com.google.firebase:firebase-storage:15.0.0'
    compile 'com.firebaseui:firebase-ui-storage:3.3.1'
    compile 'com.android.volley:volley:1.1.0'
    compile 'com.felipecsl.asymmetricgridview:library:2.0.1'
    compile 'com.google.android.gms:play-services-maps:15.0.1'
    compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
    compile 'com.github.ittianyu:BottomNavigationViewEx:1.2.1'
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'com.android.support.constraint:constraint-layout:1.1.0'
    compile 'com.github.arimorty:floatingsearchview:2.1.1'
    implementation 'info.hoang8f:android-segmented:1.0.6'
    testCompile 'junit:junit:4.12'

}

apply plugin: 'com.google.gms.google-services'
EN

回答 3

Stack Overflow用户

发布于 2018-07-20 12:08:17

您的loginButton必须有其他重复的id。只需确保当您为目标活动或loginButton = (Button) findViewById(R.id.loginButton);输入R.id.loginButton时,您将获得正确的导入。

票数 1
EN

Stack Overflow用户

发布于 2018-07-20 04:24:10

更新:按钮也应该可以正常工作。

以AppCompatButton身份启动视图,

代码语言:javascript
复制
private AppCompatButton mLoginButton;

mLoginButton=findViewById(R.id.loginButton);
票数 0
EN

Stack Overflow用户

发布于 2021-04-10 06:25:17

//当我错误地编码val deleteButton = itemView.findViewById<(Button)>(R.id.item_delete_button)时出现此错误。//实际上,在XML文件中,我使用图像视图而不是按钮来使该图像//可单击。//所以我把<(按钮)>改成了<(ImageView)>。然后这个问题就解决了。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51431089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档