Android Java 从片段内更改片段而不是片段活动

时间:2021-04-18 12:05:38

标签: java android android-fragments fragment android-fragmentactivity

我正在尝试从另一个片段中按钮的 onclick 侦听器更改片段,而不是保存片段的活动。到目前为止,我已经尝试过:

1.

                FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
                transaction.replace(R.id.child_fragment, new searchResults());
                transaction.addToBackStack(null);
                transaction.commit();
  1. 我也尝试在上面的代码之前删除父视图。

    if (v.getParent() != null) {
       ((ViewGroup)(v.getParent())).removeView(v);
    
  2. 有人建议我使用 getApplicationContext() 而不是 getActivity(),但 getSupportFragmentManager() 不适用于此。

上述所有三种解决方案都给出了相同的例外:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.rehnsehan, PID: 10913
    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:5235)
        at android.view.ViewGroup.addView(ViewGroup.java:5064)
        at android.view.ViewGroup.addView(ViewGroup.java:5004)
        at android.view.ViewGroup.addView(ViewGroup.java:4976)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:887)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1824)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
        at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7656)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

请帮助我提供解决方案来完成这项工作或建议我如何在片段活动中处理此类功能,谢谢

更新

我已经改变了处理活动而不是片段中事件的方法。坏消息,我仍然得到同样的例外。 好消息,我可能更接近导致这种情况的原因。

更新的堆栈跟踪

到处添加日志以了解发生了什么,我发现异常发生在片段 B 的 OnCreateView() 中。

D/searchresults: oncreateview
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.rehnsehan, PID: 16413
    java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
....

OnCreateView() 代码

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        v=inflater.inflate(R.layout.activity_search_results,container,false);
        if (v.getParent() != null) {
            Log.d("searchresults","oncreateview parent check");
            ((ViewGroup) (v.getParent())).removeView(v);
            Log.d("searchresults","oncreateview after remove parent");

        }
        v=inflater.inflate(R.layout.activity_search_results,container);
        Log.d("searchresults","oncreateview");
        return v;
    }

控件永远不会进入 if 条件,在那里我检查父项是否不为空。 这就是我们现在所处的位置,希望更多的故障排除可以帮助我们尽快找到解决方案。

0 个答案:

没有答案
相关问题