DialogFragment的膨胀视图将在下一个实例中重用

时间:2016-04-21 17:59:45

标签: java android android-fragments

我有一个带有自定义视图的对话框片段。自定义视图的背景颜色也会根据newInstance()方法传递的参数而更改。为了确保它实际上是一个不同的DialogFragment实例,我还将另一个参数传递给newInstance()方法,即对话框标题。背景颜色也可以接受null值,在这种情况下,不设置背景颜色。

现在问题是:当我第二次显示为背景颜色传递null值的对话框片段时,膨胀的视图仍然具有最后显示的对话框片段的背景颜色,即使标题已经不同了。为什么系统会重复使用上次膨胀的视图?背景颜色不应该是空的吗?我不理解的是什么?

MyDialogFragment.java

public static MyDialogFragment newInstance(String title, Integer bgColor) {
    MyDialogFragment df = new MyDialogFragment();
    Bundle args = new Bundle();
    args.putString(TITLE_ARG, title);
    args.putSerializable(BG_ARG, bgColor);
    df.setArguments(args);
    return df;
}

...

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Bundle args = getArguments();
    Integer bgColor = (Integer) args.getSerializable(BG_ARG);
    View view = getActivity().getLayoutInflater().inflate(R.layout.my_dialog_fragment, null);

    // check if null was passed
    if(bgColor != null)
        ((GradientDrawable) view.getBackground()).setColor(bgColor);

    return new AlertDialog.Builder(getActivity())
            .setTitle(args.getString(TITLE_ARG))
            .setView(view)
            .setNegativeButton(R.string.cancel, null)
            .setPositiveButton(R.string.ok, null)
            .create();
}

MainActivity.java

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

    setContentView(R.layout.activity_main);

    findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentManager fm = getSupportFragmentManager();
            MyDialogFragment df = (MyDialogFragment) fm.findFragmentByTag(MyDialogFragment.TAG);
            if(df == null) {
                df = MyDialogFragment.newInstance("title1", Color.GREEN);
                df.show(fm, MyDialogFragmentTAG);
            }
        }
    });

    findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            FragmentManager fm = getSupportFragmentManager();
            MyDialogFragment df = (MyDialogFragment) fm.findFragmentByTag(MyDialogFragment.TAG);
            if(df == null) {
                df = MyDialogFragment.newInstance("title2", null);
                df.show(fm, MyDialogFragmentTAG);
            }
        }
    });

}

1 个答案:

答案 0 :(得分:0)

第一次单击button1将创建对话框并将其附加到FragmentManager。

单击button2(第二次单击)将找到您的旧片段,因此df不应为null,您不应该看到任何对话框。

也许你的代码片段不完整。