Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我';我在android.support.v4.app.Fragment.setTargetFragment期间收到java.lang.IllegalArgumentException_Android_Android Fragments - Fatal编程技术网

为什么我';我在android.support.v4.app.Fragment.setTargetFragment期间收到java.lang.IllegalArgumentException

为什么我';我在android.support.v4.app.Fragment.setTargetFragment期间收到java.lang.IllegalArgumentException,android,android-fragments,Android,Android Fragments,将我的应用升级到 targetSdkVersion 27 support:support-v4:27.0.2 我从live获得以下崩溃日志 Caused by: java.lang.IllegalArgumentException: at android.support.v4.app.Fragment.setTargetFragment (Fragment.java:545) 我查看了support fragment的源代码(不完全是第545行。我不确定如何获得support fr

将我的应用升级到

  • targetSdkVersion 27
  • support:support-v4:27.0.2
我从live获得以下崩溃日志

Caused by: java.lang.IllegalArgumentException:  
  at android.support.v4.app.Fragment.setTargetFragment (Fragment.java:545)
我查看了support fragment的源代码(不完全是第545行。我不确定如何获得support fragment library的最新源代码)

我看不出抛出
java.lang.IllegalArgumentException
的原因。也许我看到的是错误版本的支持库源代码

你知道我为什么在
android.support.v4.app.Fragment.setTargetFragment期间得到
java.lang.IllegalArgumentException


我的源代码如下

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;

public class BuyPortfolioFragment extends Fragment {

    ...

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...

        // If not retained (or first time running), we need to create it.
        if (this.statusBarUpdaterFragment == null) {
            this.statusBarUpdaterFragment = StatusBarUpdaterFragment.newInstance();
            // Tell it who it is working with.
            this.statusBarUpdaterFragment.setTargetFragment(this, 0);
            fm.beginTransaction().add(statusBarUpdaterFragment, STATUS_BAR_UPDATER_FRAGMENT).commitAllowingStateLoss();
        } else {
            statusBarUpdaterFragment.setTargetFragment(this, 0);
        }

这是我的代码,有时可能会崩溃。您可以通过将后台进程限制减少到1来复制

注意,由于以下原因,调用
setTargetFragment
可能并不总是必要的

但是,为了玩一个安全的游戏,我使用了以下修复程序

public class BuyPortfolioFragment extends Fragment {

    ...

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...

        // If not retained (or first time running), we need to create it.
        if (this.statusBarUpdaterFragment == null) {
            this.statusBarUpdaterFragment = StatusBarUpdaterFragment.newInstance();
            // Tell it who it is working with.
            this.statusBarUpdaterFragment.setTargetFragment(this, 0);
            fm.beginTransaction().add(statusBarUpdaterFragment, STATUS_BAR_UPDATER_FRAGMENT).commitAllowingStateLoss();
        } else {
            // Google poses new restriction recently. A fragment need to have same fragment
            // manager as StatusBarUpdaterFragment, in order to become its target fragment. It
            // is OK not to call setTargetFragment. Although you may get null from
            // statusBarUpdaterFragment.getTargetFragment, during onResume,
            // statusBarUpdaterFragment.getTargetFragment will magically return correct fragment.

            //statusBarUpdaterFragment.setTargetFragment(this, 0);
        }
    }

    @Override
    public void onResume() {
        super.onResume();

        ...

        // This code block might not be necessary. Just to be safe.
        if (statusBarUpdaterFragment != null) {
            // Google poses new restriction recently. A fragment need to have same fragment
            // manager as StatusBarUpdaterFragment, in order to become its target fragment. It
            // is OK not to call setTargetFragment. Although you may get null from
            // statusBarUpdaterFragment.getTargetFragment, during onResume,
            // statusBarUpdaterFragment.getTargetFragment will magically return correct fragment.

            try {
                statusBarUpdaterFragment.setTargetFragment(this, 0);
            } catch (java.lang.IllegalArgumentException e) {
                // Shouldn't happen. Just to be safe.
                Log.e(TAG, "", e);
            }
        }

fm
BuyPortfolioFragment
的子
FragmentManager
?如果是这样,那很可能是你的问题。您不能使用属于不同
片段管理器的
片段设置目标。您是对的
BuyFragment
是一个子片段。我设法重现了这个问题,并深入研究了
片段
最新的源代码。谷歌似乎对
setTargetFragment
设置了新的限制。这是否意味着我需要使用
statusBarUpdaterFragment.setTargetFragment(this.getParentFragment(),0)?子片段不能再直接与
statusBarUpdaterFragment
通信了?我不知道你在说什么。也就是说,我不知道什么是
BuyFragment
,或者它的父对象是什么。如果您的意思是
BuyPortfolioFragment
,并且它在
活动中,那么它将没有父
片段。但是,该
StatusBarUpdaterFragment
可以通过
getParentFragment()
获得对该
BuyPortfolioFragment
的引用。您实际上不必在那里使用目标
片段。对不起。上一次答复中的打字错误
BuyPortfolioFragment
PortfolioFragment
public class BuyPortfolioFragment extends Fragment {

    ...

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...

        // If not retained (or first time running), we need to create it.
        if (this.statusBarUpdaterFragment == null) {
            this.statusBarUpdaterFragment = StatusBarUpdaterFragment.newInstance();
            // Tell it who it is working with.
            this.statusBarUpdaterFragment.setTargetFragment(this, 0);
            fm.beginTransaction().add(statusBarUpdaterFragment, STATUS_BAR_UPDATER_FRAGMENT).commitAllowingStateLoss();
        } else {
            statusBarUpdaterFragment.setTargetFragment(this, 0);
        }
public class BuyPortfolioFragment extends Fragment {

    ...

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...

        // If not retained (or first time running), we need to create it.
        if (this.statusBarUpdaterFragment == null) {
            this.statusBarUpdaterFragment = StatusBarUpdaterFragment.newInstance();
            // Tell it who it is working with.
            this.statusBarUpdaterFragment.setTargetFragment(this, 0);
            fm.beginTransaction().add(statusBarUpdaterFragment, STATUS_BAR_UPDATER_FRAGMENT).commitAllowingStateLoss();
        } else {
            // Google poses new restriction recently. A fragment need to have same fragment
            // manager as StatusBarUpdaterFragment, in order to become its target fragment. It
            // is OK not to call setTargetFragment. Although you may get null from
            // statusBarUpdaterFragment.getTargetFragment, during onResume,
            // statusBarUpdaterFragment.getTargetFragment will magically return correct fragment.

            //statusBarUpdaterFragment.setTargetFragment(this, 0);
        }
    }

    @Override
    public void onResume() {
        super.onResume();

        ...

        // This code block might not be necessary. Just to be safe.
        if (statusBarUpdaterFragment != null) {
            // Google poses new restriction recently. A fragment need to have same fragment
            // manager as StatusBarUpdaterFragment, in order to become its target fragment. It
            // is OK not to call setTargetFragment. Although you may get null from
            // statusBarUpdaterFragment.getTargetFragment, during onResume,
            // statusBarUpdaterFragment.getTargetFragment will magically return correct fragment.

            try {
                statusBarUpdaterFragment.setTargetFragment(this, 0);
            } catch (java.lang.IllegalArgumentException e) {
                // Shouldn't happen. Just to be safe.
                Log.e(TAG, "", e);
            }
        }