Android中调用findViewById时出现ClassCastException异常求助
解决findViewById引发的ClassCastException异常
异常信息
Caused by: java.lang.ClassCastException: com.google.android.material.floatingactionbutton.FloatingActionButton cannot be cast to android.content.Context
问题根源
错误在于调用视图构造函数而非通过findViewById获取布局中已存在的实例。比如代码中这一行:
val checkmark = FloatingActionButton(findViewById(R.id.checkmarkButton))
FloatingActionButton的构造函数需要传入Context(如Activity实例this),但你传入的是findViewById返回的FloatingActionButton实例,系统尝试将视图对象转为Context,因此抛出类型转换异常。
修正后的代码
将获取视图的代码改为标准的findViewById调用:
import android.content.SharedPreferences import android.os.Bundle import android.view.Menu import android.view.MenuItem import androidx.appcompat.app.AppCompatActivity import com.google.android.material.floatingactionbutton.FloatingActionButton import android.widget.EditText class EditingActivity : AppCompatActivity() { private lateinit var sharedPref: SharedPreferences override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_editing) setSupportActionBar(findViewById(R.id.toolbar)) // 正确获取布局中已有的FloatingActionButton实例 val checkmark = findViewById<FloatingActionButton>(R.id.checkmarkButton) // 同样修正EditText的获取方式 val categoryView = findViewById<EditText>(R.id.editTextCategory) val questionView = findViewById<EditText>(R.id.editTextQuestion) val solutionView = findViewById<EditText>(R.id.editTextSolution) sharedPref = getSharedPreferences("preferences_file", MODE_PRIVATE) categoryView.setText(sharedPref.getString("category", " ")) checkmark.setOnClickListener{ // 这里添加点击逻辑 } } override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.main_menu, menu) return true } override fun onOptionsItemSelected(item: MenuItem): Boolean { // 处理菜单选项逻辑 return super.onOptionsItemSelected(item) } }
原错误代码
import android.content.SharedPreferences import android.os.Bundle import android.view.Menu import android.view.MenuItem import androidx.appcompat.app.AppCompatActivity import com.google.android.material.floatingactionbutton.FloatingActionButton class EditingActivity : AppCompatActivity() { private lateinit var sharedPref: SharedPreferences override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_editing) setSupportActionBar(findViewById(R.id.toolbar)) val checkmark = FloatingActionButton(findViewById(R.id.checkmarkButton)) // val categoryView = EditText(findViewById(R.id.editTextCategory)) // val questionView = EditText(findViewById(R.id.editTextQuestion)) // val solutionView = EditText(findViewById(R.id.editTextSolution)) // // sharedPref = getSharedPreferences("preferences_file", Context.MODE_PRIVATE) // categoryView.setText(sharedPref.getString("category", " ")) // checkmark.setOnClickListener{ // //dialog // } } @Override override fun onCreateOptionsMenu(menu: Menu): Boolean { getMenuInflater().inflate(R.menu.main_menu, menu) return true } @Override public override fun onOptionsItemSelected(item: MenuItem): Boolean { // Handle item selection return true }}
布局文件
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".EditingActivity"> <EditText android:id="@+id/editTextQuestion" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:ems="10" android:gravity="start|top" android:inputType="textMultiLine" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="1.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/editTextCategory" app:layout_constraintVertical_bias="0.0" /> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="409dp" android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:minHeight="?attr/actionBarSize" android:theme="?attr/actionBarTheme" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.0" /> <EditText android:id="@+id/editTextCategory" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:ems="10" android:inputType="textPersonName" android:minHeight="48dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/toolbar" app:layout_constraintVertical_bias="0.0" /> <EditText android:id="@+id/editTextSolution" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="8dp" android:ems="10" android:gravity="start|top" android:inputType="textMultiLine" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/editTextQuestion" app:layout_constraintVertical_bias="0.0" /> <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/checkmarkButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:clickable="true" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/editTextSolution" app:layout_constraintVertical_bias="0.0" app:srcCompat="@drawable/ic_baseline_check_circle_24" android:contentDescription="Done" android:focusable="true" /> </androidx.constraintlayout.widget.ConstraintLayout>
错误日志
2022-10-03 19:24:43.861 5011-5011/weiss.kotlin.flashcardapp E/AndroidRuntime: FATAL EXCEPTION: main Process: weiss.kotlin.flashcardapp, PID: 5011 java.lang.RuntimeException: Unable to start activity ComponentInfo{weiss.kotlin.flashcardapp/weiss.kotlin.flashcardapp.EditingActivity}: java.lang.ClassCastException: com.google.android.material.floatingactionbutton.FloatingActionButton cannot be cast to android.content.Context at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3685) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3842) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2252) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7842) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) Caused by: java.lang.ClassCastException: com.google.android.material.floatingactionbutton.FloatingActionButton cannot be cast to android.content.Context at weiss.kotlin.flashcardapp.EditingActivity.onCreate(EditingActivity.kt:23) at android.app.Activity.performCreate(Activity.java:8054) at android.app.Activity.performCreate(Activity.java:8034) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1341) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3666) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3842) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2252) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7842) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
内容的提问来源于stack exchange,提问作者P3W
相关产品推荐
相关产品推荐

