[英]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.