getTargetFragment返回Null

时间:2016-04-20 08:50:22

标签: android android-fragments

我的应用程序中有父片段和对话框片段。单击按钮父片段打开对话框片段。这是我的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。

3 个答案:

答案 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。 :)