簡體   English   中英

DialogFragment的膨脹視圖在下一個實例中被重用

[英]DialogFragment's inflated view being reused in next instance

我有一個帶有自定義視圖的對話框片段。 自定義視圖的背景色也會根據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);
            }
        }
    });

}

第一次單擊button1將創建對話框並將其附加到FragmentManager。

單擊button2(第二次單擊)將找到您的舊片段,因此df不應為null,並且您不應看到任何對話框。

也許您的代碼段不完整。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM