使用 OnClick 在 RecyclerView 中调用 Fragman 事务
Call a Fragmant Transaction within a RecyclerView using OnClick
我想使用 onClick() 将一个 Fragment 替换为另一个 Fragment。我的问题是,我收到这样的错误:
java.lang.IllegalStateException: Activity has been destroyed
我的主要活动:
private static MainActivity instance = new MainActivity();
public static MainActivity getInstance() {
return instance;
}
public void displayView() {
fragment = new PlaylistFragment();
FragmentManager fm = getSupportFragmentManager();
if(fm.getBackStackEntryCount() != 0) {
fm.popBackStack(fm.getBackStackEntryAt(0).getName(),
FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
fm.beginTransaction().replace(R.id.frame_container, fragment,
fragment.toString()).commit();
}
布局:
Activity_main.xml:
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Framelayout to display Fragments -->
<FrameLayout
android:id="@+id/frame_container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<!-- Listview to display slider menu -->
<ListView
android:id="@+id/list_slidermenu"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@color/list_divider"
android:dividerHeight="1dp"
android:listSelector="@drawable/list_selector"
android:background="@color/list_background"/>
</android.support.v4.widget.DrawerLayout>
我的片段的 ListAdapter:
在 onBindViewHolder 方法中:
View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
RecyclerView.ViewHolder holder = (RecyclerView.ViewHolder)
view.getTag();
int position = holder.getLayoutPosition();
System.out.println("CLICK");
Artist artist = artists.get(position);
MainActivity instance = MainActivity.getInstance();
instance.displayView();
}
};
所以 onClickListener 工作正常,但我得到 IllegalStateException。
我调试了它并在 FragmentManager Class 中抛出错误,因为 "mHost" 似乎为空:
public void enqueueAction(Runnable action, boolean allowStateLoss) {
if (!allowStateLoss) {
checkStateLoss();
}
synchronized (this) {
if (mDestroyed || mHost == null) {
throw new IllegalStateException("Activity has been destroyed");
}
提前致谢。
为什么使用private static MainActivity instance = new MainActivity();
。实例应该在 onCreate()
方法中,如下所示:
private static MainActivity instance = this;
它在您的 onClick 方法中创建新的 activity :
MainActivity instance = MainActivity.getInstance();
instance.displayView();
我想使用 onClick() 将一个 Fragment 替换为另一个 Fragment。我的问题是,我收到这样的错误:
java.lang.IllegalStateException: Activity has been destroyed
我的主要活动:
private static MainActivity instance = new MainActivity();
public static MainActivity getInstance() {
return instance;
}
public void displayView() {
fragment = new PlaylistFragment();
FragmentManager fm = getSupportFragmentManager();
if(fm.getBackStackEntryCount() != 0) {
fm.popBackStack(fm.getBackStackEntryAt(0).getName(),
FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
fm.beginTransaction().replace(R.id.frame_container, fragment,
fragment.toString()).commit();
}
布局:
Activity_main.xml:
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Framelayout to display Fragments -->
<FrameLayout
android:id="@+id/frame_container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<!-- Listview to display slider menu -->
<ListView
android:id="@+id/list_slidermenu"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@color/list_divider"
android:dividerHeight="1dp"
android:listSelector="@drawable/list_selector"
android:background="@color/list_background"/>
</android.support.v4.widget.DrawerLayout>
我的片段的 ListAdapter: 在 onBindViewHolder 方法中:
View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
RecyclerView.ViewHolder holder = (RecyclerView.ViewHolder)
view.getTag();
int position = holder.getLayoutPosition();
System.out.println("CLICK");
Artist artist = artists.get(position);
MainActivity instance = MainActivity.getInstance();
instance.displayView();
}
};
所以 onClickListener 工作正常,但我得到 IllegalStateException。 我调试了它并在 FragmentManager Class 中抛出错误,因为 "mHost" 似乎为空:
public void enqueueAction(Runnable action, boolean allowStateLoss) {
if (!allowStateLoss) {
checkStateLoss();
}
synchronized (this) {
if (mDestroyed || mHost == null) {
throw new IllegalStateException("Activity has been destroyed");
}
提前致谢。
为什么使用private static MainActivity instance = new MainActivity();
。实例应该在 onCreate()
方法中,如下所示:
private static MainActivity instance = this;
它在您的 onClick 方法中创建新的 activity :
MainActivity instance = MainActivity.getInstance();
instance.displayView();