为什么我';我在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
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);
}
}