如何从含CardView的Fragment跳转至另一Fragment?报错解决
解决点击CardView跳转Fragment时的IllegalStateException错误
问题根源
你在布局的RelativeLayout中设置了android:onClick="Cocktails",但Android会自动在宿主Activity中寻找同名的Cocktails(View)方法,而你并未在Activity中定义该方法;同时你又在Fragment里给CardView绑定了点击监听,两种点击逻辑叠加触发了报错。
解决方案
方法一:移除布局中的android:onClick属性(推荐)
直接删除RelativeLayout上的点击属性,保留Fragment内的点击逻辑即可,这也符合Fragment逻辑内聚的设计原则。
修改后的布局代码:
<androidx.cardview.widget.CardView android:id="@+id/cvCocktails" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="10dp" app:cardCornerRadius="15dp" app:cardElevation="0dp" app:layout_columnWeight="1" app:layout_rowWeight="1" > <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/ivCocktails" android:layout_width="115dp" android:layout_height="115dp" android:layout_centerInParent="true" android:contentDescription="@string/cocktail" android:src="@drawable/cocktail_color" android:translationY="-15dp" tools:ignore="VisualLintBounds" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/ivCocktails" android:layout_centerHorizontal="true" android:text="@string/cocktail" android:textSize="20dp" tools:ignore="SpUsage,TextSizeCheck" /> </RelativeLayout> </androidx.cardview.widget.CardView>
方法二:在宿主Activity中定义Cocktails(View)方法(不推荐)
如果一定要保留布局中的android:onClick属性,需在Fragment对应的Activity中添加该方法,并把跳转逻辑移至其中:
public class MainActivity extends AppCompatActivity { // ...其他原有代码 public void Cocktails(View view) { CocktailFragment cocktailFragment = new CocktailFragment(); getSupportFragmentManager().beginTransaction() .replace(R.id.fragment_home,cocktailFragment,null) .addToBackStack(null).commit(); } }
同时可以删除Fragment内的setOnClickListener代码,避免重复触发逻辑。
内容的提问来源于stack exchange,提问作者Tuan Do
相关产品推荐
相关产品推荐

