我的应用程序中有父片段和对话框片段。单击按钮父片段打开对话框片段。这是我的ParentFragment类。
public class ParentFragment extends Fragment {
........
........
public class ButtonClickListener implements View.OnClickListener{
@Override
public void onClick(View v) {
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prev = getFragmentManager().findFragmentByTag("dialog");
if (prev != null) {
ft.remove(prev);
}
MyDialogFragment newFragment = new MyDialogFragment();
newFragment.setTargetFragment(ParentFragment.this, 0);
newFragment.show(getFragmentManager(), "dialog");
}
}
}
这是MyDialogFragment Class
public class MyDialogFragment extends DialogFragment {
..........
public MyDialogFragment() {
parentFragment = (ParentFragment)getTargetFragment();
}
...........
...........
}
当MyDialogFragment类中的getTargetFragment始终返回null。
答案 0 :(得分:4)
检查你的命令序列
MyDialogFragment newFragment = new MyDialogFragment(); // line 1
newFragment.setTargetFragment(ParentFragment.this, 0); // line 2
这里首先创建一个新的MyDialogFragment对象。记住这个命令(第1行)将调用MyDialogFragment的构造函数。在此之后,您将设置目标片段(第2行)。
如果查看dialogFragment,
public MyDialogFragment() {
parentFragment = (ParentFragment)getTargetFragment();
}
您正尝试在构造函数中访问目标片段。 因此,目标片段将始终为null,因为您在第2行调用构造函数后正在设置它。尝试从其他方法访问它或将其作为参数传递给构造函数(这不是一个好习惯)。
答案 1 :(得分:0)
问题是你没有引用ParentFragment,因为getTargetFragment()为null,但是你可以尝试使用FragmentManager的getFragmentById()或getFragmentByTag()方法来获取Fragment。
答案 2 :(得分:0)
setTargetFragment()和getTargetFragment不是简单的getter和setter,它们会替换以下调用:
parentFragment.getFragmentManager().putFragment(args, "bla bla tag", (Fragment)parentfragment);
在setTargetFragment()后面,其中args是要设置为对话框片段的参数。
和
getFragmentManager().getFragment(getArguments(), "bla bla tag");
getTargetFragment()背后的内容。正如您所看到的,这种逻辑涉及片段生命周期,而不仅仅是设置和获取变量。
简而言之,如果你想获取目标片段,只需要在onCreateDialog()或onCreate(),DialogFragment的方法中进行,那么参数已经在那里设置,因此getTargetFragment()不应该为null。 :)