gpt4 book ai didi

java - fragment 管理器 : popBackStack() and IllegalStateException

转载 作者:太空宇宙 更新时间:2023-11-03 11:04:38 26 4
gpt4 key购买 nike

我有 Activity :

public class MyActivity extends AppCompatActivity implements FragmentManager.OnBackStackChangedListener
{
...

@Override
public void onBackPressed()
{
if (getFragmentManager().getBackStackEntryCount() > 0) getFragmentManager().popBackStack();
}
}

SimpleFragmentManager:

private static void moveTo(BaseFragment fragment)
{
if(fragment != null)
{
FragmentManager fragmentManager = _activity.getFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();

//this
//ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
//or this
//ft.setCustomAnimations(R.animator.enter, R.animator.exit, R.animator.enter, R.animator.exit);
//or this
//ft.setCustomAnimations(R.animator.enter, R.animator.exit);

BaseFragment currentFragment = getCurrentFragment();

if(fragment != currentFragment)
{
ft.replace(_containerId, fragment, fragment.getType());
if (currentFragment != null)
{
ft.addToBackStack(null);
}
ft.commit();
}
}
}

例如我的 fragment :

public class AFragment extends BaseFragment
{
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
if(view == null)
{
view = new ALayout(container.getContext());
view.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT));
}

return view;
}
}

>>问题<<

测试是这样的,我在一个 fragment A上,然后我打开 fragment B,然后我马上改变动画 fragment 的进程,我点击屏幕底部的后退按钮。

从第一次开始这不可能发生,但是多次执行这些步骤,应用程序崩溃并出现错误:

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.my.application, PID: 2103 java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. at android.view.ViewGroup.addViewInner(ViewGroup.java:4309) at android.view.ViewGroup.addView(ViewGroup.java:4145) at android.view.ViewGroup.addView(ViewGroup.java:4086) at android.view.ViewGroup.addView(ViewGroup.java:4059) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:985) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148) at android.app.BackStackRecord.run(BackStackRecord.java:793) at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535) at android.app.FragmentManagerImpl$1.run(FragmentManager.java:482) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

只有在使用过渡动画时才会出现此错误,这是:

ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);

ft.setCustomAnimations(R.animator.enter, R.animator.exit, R.animator.enter, R.animator.exit);

ft.setCustomAnimations(R.animator.enter, R.animator.exit);

如果你不使用过渡动画,那么就没有错误!

我找到了很多这样的主题,也发现有一个 bug API:

1) https://code.google.com/p/android/issues/detail?id=77670

2) https://code.google.com/p/android/issues/detail?id=89244

我的 SDK 版本:

compileSdkVersion 23
buildToolsVersion '23.0.1'

重要的是,在 fragment 中我没有删除查看这个:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
...
ViewGroup parent = (ViewGroup) view.getParent();
if(parent != null) parent.removeView(view);
}

因为我想使用单一 View !

请告诉我,因为可以更正此错误?

>>附言解决方案的变体之一: 在存在动画 fragment 时禁用“后退”按钮。

最佳答案

我在使用 API 28 时遇到了类似的问题。有时我想在创建 fragment 后手动弹出堆栈。直接调用 popBackStack 给我这个错误。这是我的解决方案 (kotlin):

activity.supportFragmentManager.beginTransaction().runOnCommit {
activity.supportFragmentManager.popBackStack()
}.commit()

相当丑陋,但我没有找到更好的解决方案。在你的情况下,你可以使用

@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() > 0)
getFragmentManager().beginTransaction().runOnCommit(
() -> getFragmentManager().popBackStack()
).commit();
}

关于java - fragment 管理器 : popBackStack() and IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35273638/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com