仅当布局中存在SearchView时,CardView上的java.lang.ClassCastException

我无法解决有关Android布局的问题。我有一个片段,其中的布局包含很多元素,尤其是这个CardView元素

<androidx.cardview.widget.CardView
                    android:id="@+id/search_button"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="20dp"
                    android:layout_marginTop="10dp"
                    android:layout_marginEnd="20dp"
                    app:cardBackgroundColor="@color/chartMax"
                    app:cardCornerRadius="20dp"
                    app:cardElevation="2dp">

                <TextView
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:padding="5dp"
                        android:text="Cerca"
                        android:textAlignment="center"
                        android:textColor="#fff"
                        android:textSize="23sp" />
            </androidx.cardview.widget.CardView>

我在片段中访问此元素

private lateinit var searchButton: CardView
searchButton = view.search_button

一切正常,我可以正常使用。

当我向片段中添加普通SearchView时,问题就开始了。

<androidx.appcompat.widget.SearchView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

当我运行应用程序时,它在此指令上崩溃

searchButton = view.search_button

这是堆栈跟踪

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: io.atoka.mobile,PID: 31291
    java.lang.ClassCastException: androidx.appcompat.widget.AppCompatImageView cannot be cast to androidx.cardview.widget.CardView
        at io.atoka.mobile.fragments.SearchFragment.getViewElements(SearchFragment.kt:57)
        at io.atoka.mobile.fragments.SearchFragment.onCreateView(SearchFragment.kt:73)
        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2439)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
        at androidx.fragment.app.FragmentManagerImpl.execPendingactions(FragmentManager.java:2273)
        at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3273)
        at androidx.fragment.app.FragmentManagerImpl.dispatchactivityCreated(FragmentManager.java:3229)
        at androidx.fragment.app.FragmentController.dispatchactivityCreated(FragmentController.java:201)
        at androidx.fragment.app.Fragmentactivity.onStart(Fragmentactivity.java:620)
        at androidx.appcompat.app.AppCompatactivity.onStart(AppCompatactivity.java:178)
        at android.app.Instrumentation.callactivityOnStart(Instrumentation.java:1391)
        at android.app.activity.performStart(activity.java:7157)
        at android.app.activityThread.handleStartactivity(activityThread.java:2937)
        at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:180)
        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:165)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:142)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
        at android.app.activityThread$H.handleMessage(activityThread.java:1808)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.activityThread.main(activityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

就像我的CardView不是AppCompatImageView一样。 当我删除SearchView时,该应用程序可以正常运行。

有人知道解决方案吗?关于此特殊情况是否有任何错误?

谢谢

jayparkcj 回答:仅当布局中存在SearchView时,CardView上的java.lang.ClassCastException

您的问题是由于您给卡片视图指定的名字引起的 search_button已在默认androidx.appcompat.widget.SearchView类中定义,如下所示:

 final ImageView mSearchButton;
 mSearchButton = findViewById(R.id.search_button);

因此,当您尝试从绑定中获取它时,它就会与SearchView类search_button参数

发生冲突。

尝试将您的Cardview的名称更改为其他名称,然后尝试

本文链接:https://www.f2er.com/3144895.html

大家都在问