0

I have a problem regarding android layout that I am not able to resolve. I have a fragment with a layout that contains lots of elements and in particular this CardView element

<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>

I access this element in fragment

private lateinit var searchButton: CardView
searchButton = view.search_button

and everything works fine, I can use it normally.

The problems start when I add a normal SearchView to the fragment.

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

When I run the application it crash on this instruction

searchButton = view.search_button

This is the stacktrace

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)

like if my CardView was an AppCompatImageView that is not. When I remove the SearchView the application works normally.

Anyone knows the solution? Is there any bug regarding this particular case?

Thank you

Stefano Zanella
  • 83
  • 2
  • 11

1 Answers1

2

Your problem occurs because of the name you gave to your cardview search_button is already define in default androidx.appcompat.widget.SearchView class as below:

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

so when you trying to get it from binding it's getting conflicted with the SearchView class search_button parameter

try to change the name of your cardview to something else then try,

Bhoomit_BB
  • 374
  • 4
  • 10
  • Thank you, it works. However I do not understand why it start from layout root to search ids instead of my view considering that I am using binding on my fragment layout – Stefano Zanella Nov 07 '19 at 13:44
  • 1
    It's because it calls `getView()` (which can be used as `view` in kotlin) method of fragment and inside that it's consider the 1st id find by view which will be `search_button` of SearchView. – Bhoomit_BB Nov 08 '19 at 07:33